设为首页
加入收藏夹

Oracle9i 数据库管理实务讲座(七)
浏览选项:

  Oracle9i 数据库控制文件
  经过前几期专栏文章的洗礼,相信大家对于 Oracle9i 数据库应该已具备一些基本管理概
念,但是这还不足以驾驭 Oracle9i 数据库!接下来我将从实务角度深入解说 Oracle9i 数据
库的各种核心组成组件,与各种数据库管理技巧。本期先从 Oracle9i 数据库的控制文件
  控制?的角色
  每一个 Oracle9i 数据库都必须有一个控制档。它是一个小型二进制档案,主要是储存
  n 数据库名称
  n 数据库建立时间
  n 资料文件名称与所在位置
  n 重置日志文件名称与所在位置
  n 目前的日志序列码(log sequence number)
  n 检查点信息
  简言之,控制档可用来描述 Oracle9i 实体结构。因此开启 Oracle9i 数据库时一定要读
取控制文件才能取得所有数据库实体档案相关信息。一旦控制文件不幸毁损,数据库便无法顺
利开启。也因为如此,控制档的管理与维护工作显得格外重要。
  如何管理控制?
  设定控制文件名称与所在位置
  因为控制文件将用来存放 Oracle9i 数据库的实体结构信息,即使目前尚未建置
Oracle9i 数据库,您也必须先准备好控制档!换言之,在激活 Oracle Instance 时就必须
知道控制文件的名称与所在位置。为此,控制文件的相关信息必须设定在起始参数档内,才能
在开启 Oracle Instance 时一并读取控制档内容,进而激活 Oracle9i 数据库。控制文件的
名称与所在路径位置是设定在起始参数档内 CONTROL_FILES 参数。
  如何配置控制文件
  每个 Oracle9i 数据库最好拥有两个以上控制档,并各自存放在不同磁盘上。如此一来当
控制档因故毁损时,您便可以在最短时间内修复控制文件,尽可能缩短数据库停摆时间。假定
您的 Oracle9i 数据库目前配置了三个控制文件,那么 Oracle 如何维护这些控制档呢?
  n 开启 Oracle 数据库时,只会读取第一个控制文件(顺序以 CONTROL_FILES
  n 如果需要将特定信息写入控制文件,则 Oracle 会同时写入
  n 当某个控制档发生问题时,Oracle Instance 将因此停摆。
  
  如前所述,各控制档复本应该分散在不同实体磁盘。因此实际上规划一个正式系统时,请
  
  假定目前的重置日志群组有两个,分别置于 /u01 与 /u02 两个磁盘;每个重置群组包
  /u01/oradata/ora901/log1a.rdo (Group1)
  /u01/oradata/ora901/log2a.rdo (Group2)
  /u02/oradata/ora901/log1b.rdo (Group1)

  /u02/oradata/ora901/log2b.rdo (Group2)
  /u03/oradata/ora901/log1c.rdo (Group1)
  /u03/oradata/ora901/log2c.rdo (Group2)
  
  此时不妨在 /u01 与 /u02 各配置一个控制文件。如此可有效降低重置日志文件与控制文
件同时遗失的风险。因为不管哪个磁盘出问题,另一个磁盘仍然保留完整的重置日志文件与控
  
  如何决定控制档大小
  Oracle9i 控制?大小主要是由 CREATE DATABASE 指令内数个参数所决定,分别是:
MAXDATAFILES、MAXLOGFILES、MAZLOGMEMBERS、MAXLOGHISTORY 与 MAXINSTANCES。
  
  控制?建立方式
  经由 CREATE DATABASE 指令建立控制文件
  Oracle9i 控制文件在建立数据库的同时就会一并建立;换句话说,当您执行 CREATE
DATABASE 之后就会产生控制档。但是有一点必须注意:CREATE DATABASE 指令内并未指定控
制文件相关信息! 其实控制文件的名称与所在位置是定义在起始参数档的 CONTROL_FILES 参
数,其命名方式必须视操作系统环境而定;例如 Windows 系统与 Linux 系统的档案路径表
  CONTROL_FILES = ( /u01/oracle/ora901/control01.ctl,
  /u02/oracle/ora901/control02.ctl,
  /u03/oracle/ora901/control03.ctl)
  
  如果 CONTROL_FILES 参数所指定的文件名称已经存在于操作系统中怎么办? 此时您在执
行 CREATE DATABASE 指令时就会发生错误,不过只要加上 CONTROL FILE REUSE 子句即可。
然而,如果现有控制档名称与 CONTROL_FILES 所设定的名称相同,但是其 “大小” 却不同
  
  建立额外的控制档
  为了避免控制文件(或其所在磁盘)毁损时影响到 Oracle9i 数据库正常运作,您也许需
要在其它硬盘上新增其它控制档。最简单的方式就是先将既有控制文件复制到目的位置,然后
将控制文件名称加入起始参数档的 CONTROL_FILES 之中。同理,如果想更改控制档名称,也
可以先将控制文件复制到目的位置后予以更名,再更新 CONTROL_FILES 参数。请注意,不管
是上述何项动作,都应该先关闭 Oracle9i instance 再进行。在其它磁盘建立额外控制文件
  1.关闭 Oracle9i 数据库。
  2.在操作系统下将既有控制文件复制到目的位置。
  3.开启起始参数档,并修改 CONTROL_FILES 参数。您必须将新的控制文件名与所在目录
  4.重新开启 Oracle9i 数据库。
  建立全新的控制?
  除了将控制文件复制到其它磁盘之外,某些时候您可能需要建立 ”全新的” 控制?,例
  n 目前数据库既有的控制文件不幸毁损,不仅未进行备份,也尚未在其它磁盘建立镜射控
  n 您希望更改 CREATE DATABASE 指令内设定的控制文件相关参数,例如:数据库名称,
或是 MAXLOGFILES、MAXLOGMEMBERS 与 MAXLOGHISTORY 等参数。
  举例来说,在分布式运算环境中可能会有两部 Oracle9i 数据库名称相同,其中一台必须
更改数据库名称。也有可能因为 MAXLOGFILES 与 MAXLOGMEMBERS 最初设定值太小,现在必须
加大。上述情况都必须建立全新的控制档。以下是建立详细的建置步骤:
  1.先整理一份数据库档案清单,其中包含所有数据文件与重置日志档案之路径与名称。
V$LOGFILE 与 V$DATAFILE 这两个视观表可协助您进行这项供工作,例如:
  SELECT member FROM v$logfile;   
  SELECT NAME FROM V$DATAFILE;   
  2.关闭数据库。请尽可能以 NORMAL 选项关闭数据库,必要时才使用 IMMEDIATE 或
  3.重新激活 Oracle Instance 至 NOMOUNT 状态:
  STARTUP NOMOUNT;
  4. 执行 CREATE CONTROLFILE 指令建立新的控制文件。以下范例将为 ora901 数据库建
  CREATE CONTROLFILE
  SET DATABASE ora901
  LOGFILE GROUP 1 ( '/u01/oracle/ora901/redo01_01.log',
  '/u01/oracle/ora901/redo01_02.log'),
  GROUP 2 ( '/u01/oracle/ora901/redo02_01.log',

  '/u01/oracle/ora901/redo02_02.log'),
  GROUP 3 ( '/u01/oracle/ora901/redo03_01.log',

  '/u01/oracle/ora901/redo03_02.log')
  NORESETLOGS
  DATAFILE '/u01/oracle/ora901/system01.dbf' SIZE 300M,
  '/u01/oracle/ora901/rbs01.dbf' SIZE 50M,
  '/u01/oracle/ora901/users01.dbf' SIZE 500M,
  '/u01/oracle/ora901/temp01.dbf' SIZE 100M

  MAXLOGFILES 100
  MAXLOGMEMBERS 3
  MAXDATAFILES 500
  MAXINSTANCES 10
  ARCHIVELOG;
  注意,如果您打算在控制文件内更改数据库名称,则必须使用 RESETLOGS 选项,否则请
  5.必要时修改起始参数档 CONTROL_FILES 参数。如果数据库名称已被更改,请记得修改
  6. 将数据库开启至 Open 状态:
  ALTER DATABASE OPEN;
  如果您建立控制文件时曾搭配 RESETLOGS 选项,那么执行 ALTER DATABASE 指令时必须
  ALTER DATABASE OPEN RESETLOGS;
  备份控制档
  也许您已经在不同磁盘上配置多个控制文件,但这并不表示控制档永远不会毁损。为此,
您应该适时备份这些控制档;特别是在 Oracle9i 数据库实体结构经过变动时,例如:
  n 新增或移除数据文件,或是更改某数据文件名称。
  n 新增或移除表格空间,或是更改表格空间的状态。
  n 新增或移除重置日志档案(或群组)。
  欲备份控制档时,您可执行 ALTER DATABASE BACKUP CONTROLFILE 指令,分为以下两种
  1.将控制文件备份到某个二进制档案,例如:
  ALTER DATABASE BACKUP CONTROLFILE TO
  '/backup/controlfile/control.bkp';
  2.制作能够重建控制档之 SQL 叙述句,例如:
  ALTER DATABASE BACKUP CONTROLFILE TO TRACE;

  这道指令会将某个 SQL 叙述句写入数据库的追踪文件。您可从追踪档内撷取出这段程序
  如何修复控制档(或其复本)
  情境:目前您的 Oracle9i 数据库拥有三个控制档,分别置于三个不同磁盘:
  /u01/ora901/controlfile/control01.ctl
  /u02/ora901/controlfile/control02.ctl
  /u03/ora901/controlfile/control03.ctl
  状况一:control02.ctl 不幸毁损,导致 Oracle9i 数据库无法正常运作。
  解决方式:参考下列步骤修复控制档复本,并重新激活数据库:
  1.关闭 Oracle9i 数据库,在操作系统下将控制文件复制一份至 /u02/ora901/,目的是
  % cp /u01/ora901/controlfile/control01.ctl
  /u02/ora901/controlfile/control02.ctl;
  2. 重新开启 Oracle9i 数据库。
  状况二:control02.ctl 所在磁盘整个毁损(该磁盘并未存放其它数据库相关档案)
  解决方法A:以其它磁盘取代毁损磁盘
  1. 关闭 Oracle9i 数据库,在操作系统下将控制文件复制一份至其它磁盘之适当目录 (
  % cp /u01/oracle/ora901/control01.ctl /u04/oracle/ora901/control02.ctl;
  2. 更改启始参数档内 CONTROL_FILES 参数,例如:
  CONTROL_FILES =( /u01/oracle/ora901/control01.ctl,
  /u03/oracle/ora901/control03.ctl,
  /u04/oracle/ora901/control02.ctl)
  3.重新开启 Oracle9i 数据库。
  解决方法B:移除 control02.ctl 设定值
  1.关闭 Oracle9i 数据库。
  2.更改启始参数档内 CONTROL_FILES 参数,移除原先 control02.ctl 之路径与名称。
  3. 重新开启 Oracle9i 数据库。
  需注意的是:使用方法A以后,您的 Oracle9i 数据库仍然保有三个控制档;但是使用方
  如何查询控制文件相关信息
  欲查询 Oracle9i 控制文件相关资料时可参考下列几种方式:
  1.执行 SHOW PARAMETER 指令:   
  2.查询 V$CONTROLFILE 视观表:
  SELECT name FROM V$CONTROLFILE;   
  3.查询 V$PARAMETER 视观表:
  SELECT name, value from V$PARAMETER
  WHERE name = 'control_files';   
  作者简介
  何致?,专长为Oracle、SQL Server 等大型数据库系统管理,资料仓储规划建置,以及
数据库应用程序系统开发。拥有 MCSD、MCDBA,Oracle OCP,RHCE,SCJP,Borland
JBuilder Product Certified等十余项国际认证。目前正致力于Oracle9i应用系统开发,并负
责Oracle9i系列书籍中文化与Oracle Press技术校稿工作。他同时也是美商 Oracle ? Sun
Microsystems公司原厂认证讲师。您可以透过hochihyi@ms64.hinet.net与他联系。
  
  



Copyright © 2004 wanxu.com All Rights Reserved