8.2.2 如何重新创建控制文件

控制文件是在创建数据库时自动创建的,在数据库服务器运行的过程中,除了镜像控制文件外,重新创建控制文件的机会不是很多。但是一旦有这样的要求,就意味着对数据库要进行一次重要的操作。一般说来,重新创建控制文件的时机有以下几种情况:

·控制文件全部损坏,并且没有可用的备份。

·修改数据库的名称。

·修改某些永久性参数。

当然,重新创建控制文件并不是一件轻松的事情。如果没有周密的计划,可能会造成更大的损失。在创建控制文件之前,必须掌握所有数据文件和重做日志文件的名称、位置和大小等信息,在必要时还需要掌握数据库所使用的字符集。为了防止对数据文件和重做日志文件造成不必要的损坏,尽可能对这些文件进行一次备份。

1.控制文件全部不可用的情况

在控制文件中记录了数据库的结构信息,如果数据库的结构发生了变化,如新创建了一个表空间,或新添加了一个重做日志文件等,应该及时对控制文件进行一次备份。如果数据库中的控制文件全部丢失或损坏,而手头没有可用的控制文件的备份,这不能不说是数据库管理员的失职。

如果发生了这种情况,数据库服务器将无法正常启动,因而就不可能通过数据字典视图查询数据文件和重做日志文件的信息。唯一的办法是在磁盘上查找这些文件,并了解它们的大小。如果漏掉了某个文件,数据库将不完整。更可怕的事情是,如果在同一个系统中创建了多个数据库,并且数据文件和重做日志文件的存放位置没有任何规律,那么要确定一个文件是否属于当前数据库是一件很困难的事情。

创建控制文件的命令是CREATE CONTROLFILE。一般情况下创建控制文件的任务由SYS用户完成,如果以普通用户的身份创建控制文件,则需要具有SYSDBA权限。

在创建控制文件时,需要首先启动实例,将数据库服务器启动到NOMOUNT状态。控制文件名是不需要指定的,因为在启动实例时,将读取参数文件的内容,根据初始化参数control_files的值确定了控制文件的位置和名称。以下是创建控制文件的一个例子:


SQL>CREATE CONTROLFILE REUSE DATABASE ORCL NORESETLOGS

MAXLOGFILES 5

MAXLOGMEMBERS 3

MAXDATAFILES 100

MAXINSTANCES 1

MAXLOGHISTORY 292

LOGFILE

GROUP 1'/u01/app/base/oradata/orcl/redo01.log'SIZE 50M BLOCKSIZE 512,

GROUP 2'/u01/app/base/oradata/orcl/redo02.log'SIZE 50M BLOCKSIZE 512,

GROUP 3'/u01/app/base/oradata/orcl/redo03.log'SIZE 50M BLOCKSIZE 512

DATAFILE

'/u01/app/base/oradata/orcl/system01.dbf',

'/u01/app/base/oradata/orcl/sysaux01.dbf',

'/u01/app/base/oradata/orcl/undotbs01.dbf',

'/u01/app/base/oradata/orcl/users01.dbf'

CHARACTER SET WE8MSWIN1252


在创建控制文件的CREATE CONTROL FILE语句中,使用了以下子句:

·REUSE:如果在指定的位置存在同名的控制文件,则用新的控制文件覆盖它。

·RESETLOGS:清空重做日志文件中的信息。如果不希望清空重做日志,可以使用NORESETLOGS。

·DATABASE:指定数据库的名称。这个名称必须与初始化参数DB_NAME的值相同。

·LOGFILE:指定所有的重做日志文件的名称和大小。如果每个日志组有一个以上的日志成员,还需要通过GROUP关键字指定日志文件的分组情况。

·DATAFILE:指定所有数据文件的名称和大小。

·CHARACTER SET:指定字符集的名称。

控制文件被创建之后,数据库服务器就打开控制文件,进入MOUNT状态了。为了使用户能够访问数据库,必须将数据库服务器的状态转入OPEN状态,可以执行以下命令:


SQL>ALTER DATABASE OPEN;


如果在创建控制文件时使用了RESETLOGS子句,那么在打开数据库时也必须使用这个子句。比如:


SQL>ALTER DATABASE OPEN RESETLOGS;


2.修改数据库名称的情况

在有些情况下,可能需要修改数据库的名称。比如要在两个数据库之间进行高级复制,一个基本的要求就是两个数据库的名称不能,如果相同,必须修改其中的一个数据库的名称。

数据库的名称由初始化参数DB_NAME指定,实例的名称通过初始化参数INSTANCE_NAME指定。通过查询这两个初始化参数,可以了解数据库和实例的名称。例如:


SQL>SHOW PARAMETER DB_NAME

NAME TYPE VALUE

db_name string ORCL

SQL>SHOW PARAMETER INSTANCE_NAME

NAME TYPE VALUE

instance_name string ORCL


在修改数据库的名称时,需要修改初始化参数DB_NAME的值。另外,数据库的名称还必须记录在控制文件中。因此,必须重新创建控制文件,才能使新的数据库名称起作用。

在这种情况下,数据库服务器是可以正常运行的,因此,我们可在创建控制文件之前,查询数据字典,了解数据文件和重做日志文件的信息。例如,以下查询将得到所有数据文件的位置和名称:


SQL>SELECT NAME FROM V$DATAFILE;


以下查询将得到所有的重做日志文件:


SQL>SELECT GROUP#,MEMBER FROM V$LOGFILE ORDER BY GROUP#;


在创建控制文件时,还需要指定字符集的名称,这些信息可以通过查询动态性能视图V$NLS_PARAMENTS获得。例如:


SQL>SELECT PARAMETER, VALUE FROM V$NLS_PARAMETERS

WHERE PARAMETER='NLS_CHARACTERSET';

PARAMETER VALUE

NLS_CHARACTERSET ZHS16GBK


接下来需要修改初始化参数DB_NAME的值。假设要将数据库名称改为ORCL1,需要按照以下方式修改参数文件中的初始化参数:


DB_NAME=ORCL1


现在就可以创建控制文件了。首先用新的参数文件将数据库服务器的状态转入NOMOUNT状态,然后执行CREATE CONTROLFILE命令。这时在命令行中也要指定新的数据库名称。例如:


SQL>CREATE CONTROLFILE REUSE SET DATABASE orcl1 RESETLOGS

……


控制文件创建成功之后,将数据库服务器启动到OPEN状态,用户就可以访问数据库了。这时新的控制文件已经在起作用了。

如果要验证数据库的名称确实已经被修改,可以再次查询初始化参数DB_NAME的值。例如:


SQL>SHOW PARAMETER DB_NAME

NAME TYPE VALUE


db_name string ORCL1


查询结果表明,数据库的名称和实例的名称确实已经被修改。

3.修改永久性参数的情况

在创建数据库时,可以指定一些永久性参数,如MAXINSTANCES、MAXDATAFILES等。这些永久性参数的意义描述如下:

·MAXINSTANCES:指定可以访问该数据库的最大实例个数。

·MAXLOGHISTORY:指定在控制文件中可以记录的最大历史日志条数。

·MAXLOGFILES:指定在数据库中包含的最大重做日志组数。

·MAXLOGMEMBERS:指定每个日志组中可以包含的最大重做日志文件数目。

·MAXDATAFILES:指定在数据库中可以创建的最大数据文件数目。

以上永久性参数对数据库的扩充极限进行了限制。例如,假设参数MAXDATAFILES的值为100,那么在数据库中最多只能创建100个数据文件,如果达到了这个极限,数据库将无法扩充。又比如,假设原来的数据库只允许一个实例访问,现在希望把数据库移植到RAC环境,就需要修改参数MAXINSTANCES的值。

与初始化参数不同的是,永久性参数不是记录在参数文件中,而是记录在控制文件中。如果要修改永久性参数的值,就需要重新创建控制文件。

在Oracle 11g以前,如果要在数据库中修改永久性参数,就需要重新创建控制文件。从11g开始,这个问题简化了许多,这些永久性参数的设置可以直接突破。假设数据库中只能创建100个数据文件,那么第101个数据文件还是可以直接创建的,控制文件也将自动扩展,以容纳新增加的数据文件。

在Oracle 11g以前的数据库中为了修改永久性参数,与前面两种情况相同,重新创建控制文件的操作需要在实例的NOMOUNT状态下进行,在CREATE CONTROLFILE语句中同样要指定所有数据文件和重做日志文件的位置、名称和大小,以及字符集的名称,同时要为需要修改的永久性参数指定新的参数值。

例如,为了修改永久性参数的值,可以执行以下语句,重新创建数据库ORCL的控制文件:


SQL>CREATE CONTROLFILE REUSE DATABASE ORCL NORESETLOGS

MAXLOGFILES 16

MAXLOGMEMBERS 3

MAXDATAFILES 100

MAXINSTANCES 8

MAXLOGHISTORY 292

LOGFILE

GROUP 1'/u01/app/base/oradata/orcl/redo01.log'SIZE 50M BLOCKSIZE 512,

GROUP 2'/u01/app/base/oradata/orcl/redo02.log'SIZE 50M BLOCKSIZE 512,

GROUP 3'/u01/app/base/oradata/orcl/redo03.log'SIZE 50M BLOCKSIZE 512

DATAFILE

'/u01/app/base/oradata/orcl/system01.dbf',

'/u01/app/base/oradata/orcl/sysaux01.dbf',

'/u01/app/base/oradata/orcl/undotbs01.dbf',

'/u01/app/base/oradata/orcl/users01.dbf'

CHARACTER SET WE8MSWIN1252


在创建控制文件之后,将数据库服务器启动到OPEN状态,新的永久性参数就能起作用了。