作者: 何致億, 美商甲骨文公司台湾分公司特约顾问
经过前几期专栏文章的洗礼,相信大家对于 Oracle9i 数据库应该已具备一些基本管理概念,但是这还不足以驾驭 Oracle9i 数据库!接下来我将从实务角度深入解说 Oracle9i 数据库的各种核心组成组件,与各种数据库管理技巧。本期先从 Oracle9i 数据库的控制文件(Control files) 开始谈起。
控制檔的角色
每一个 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 如何维护这些控制档呢? Oracle9i 与控制档的互动方式如下:
n 开启 Oracle 数据库时,只会读取第一个控制文件(顺序以 CONTROL_FILES 的设定值为基准)。
n 如果需要将特定信息写入控制文件,则 Oracle 会同时写入 CONTROL_FILES 参数所指定的档案。
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 参数之定义方式:
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 所设定的名称相同,但是其 “大小” 却不同,那么您还是无法使用 REUSE 选项。
建立额外的控制档
为了避免控制文件(或其所在磁盘)毁损时影响到 Oracle9i 数据库正常运作,您也许需要在其它硬盘上新增其它控制档。最简单的方式就是先将既有控制文件复制到目的位置,然后将控制文件名称加入起始参数档的 CONTROL_FILES 之中。同理,如果想更改控制档名称,也可以先将控制文件复制到目的位置后予以更名,再更新 CONTROL_FILES 参数。请注意,不管是上述何项动作,都应该先关闭 Oracle9i instance 再进行。在其它磁盘建立额外控制文件的步骤如下:
1. 关闭 Oracle9i 数据库。
2. 在操作系统下将既有控制文件复制到目的位置。
3. 开启起始参数档,并修改 CONTROL_FILES 参数。您必须将新的控制文件名与所在目录名称加入 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 或 ABORT 选项。
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 选项,否则请使用 NORESETLOGS 选项。
5. 必要时修改起始参数档 CONTROL_FILES 参数。如果数据库名称已被更改,请记得修改 DB_NAME 参数。
6. 将数据库开启至 Open 状态:
ALTER DATABASE OPEN;
如果您建立控制文件时曾搭配 RESETLOGS 选项,那么执行 ALTER DATABASE 指令时必须加上 RESETLOGS 选项:
ALTER DATABASE OPEN RESETLOGS;
备份控制档
也许您已经在不同磁盘上配置多个控制文件,但这并不表示控制档永远不会毁损。为此,您应该适时备份这些控制档;特别是在 Oracle9i 数据库实体结构经过变动时,例如:
n 新增或移除数据文件,或是更改某数据文件名称。
n 新增或移除表格空间,或是更改表格空间的状态。