创建控制文件
本节介绍创建控制文件的方式,并包含以下主题:
- 创建初始控制文件
- 创建更多副本,重命名和重新放置控制文件
- 创建新的控制文件
创建初始控制文件
当发出CREATE DATABASE语句时,会创建Oracle数据库的初始控制文件。控制文件的名称由数据库创建期间使用的初始化参数文件中的CONTROL_FILES参数指定。在CONTROL_FILES中指定的文件名应该完全指定,并且是操作系统特定的。以下是CONTROL_FILES初始化参数的示例:
CONTROL_FILES = (/u01/oracle/prod/control01.ctl, /u02/oracle/prod/control02.ctl, /u03/oracle/prod/control03.ctl)
如果具有指定名称的文件当前在数据库创建时存在,则必须在CREATE DATABASE语句中指定CONTROLFILE REUSE子句,否则会发生错误。另外,如果旧控制文件的大小不同于新控制文件的大小参数,则不能使用REUSE子句。
控制文件的大小在Oracle数据库的某些版本之间变化,以及控制文件中指定的文件数量发生变化时。诸如MAXLOGFILES,MAXLOGMEMBERS,MAXLOGHISTORY,MAXDATAFILES和MAXINSTANCES等配置参数会影响控制文件的大小。
随后可以更改CONTROL_FILES初始化参数的值以添加更多控制文件或更改现有控制文件的名称或位置。
您的操作系统特定的Oracle文档包含有关指定控制文件的更多信息。
创建更多副本,重命名和重新放置控制文件
您可以通过将现有控制文件复制到新位置并将文件名添加到控制文件列表来创建用于复用的附加控制文件副本。同样,您可以通过将文件复制到其新名称或位置并更改控制文件列表中的文件名来重命名现有控制文件。在这两种情况下,为了确保控制文件在过程中不发生变化,请在复制控制文件之前关闭数据库。
添加当前控制文件的复用副本或重命名控制文件:
- 关闭数据库
- 使用操作系统命令将现有控制文件复制到新位置
- 编辑数据库初始化参数文件中的CONTROL_FILES参数以添加新的控制文件名称,或者更改现有的控制文件名
- 重新启动数据库
创建新的控制文件
本节讨论何时以及如何创建新的控制文件。
何时创建新的控制文件
在以下情况下,您需要创建新的控制文件:
- 数据库的所有控制文件已被永久损坏,并且没有控制文件备份。
- 您想要更改数据库名称。
例如,如果数据库名称与分布式环境中的另一个数据库名称冲突,则可以更改它。您可以使用DBNEWID实用程序更改数据库名称和DBID(内部数据库标识符)。有关使用此实用程序的信息,请参阅Oracle数据库实用程序
- 兼容级别设置为早于10.2.0的值,并且您必须更改与CREATE DATABASE或CREATE CONTROLFILE命令中的以下任何参数相关的数据库配置区域:MAXLOGFILES,MAXLOGMEMBERS,MAXLOGHISTORY ,和MAXINSTANCES。如果兼容性是10.2.0或更高版本,则在进行此类更改时不必创建新的控制文件;如有必要,控制文件会自动扩展以适应新的配置信息。
例如,假设您在创建数据库或重新创建控制文件时,将MAXLOGFILES设置为3.假设您现在想要使用ALTER DATABASE命令向数据库添加第四个重做日志文件组。如果兼容性设置为10.2.0或更高版本,则可以这样做,并且控制文件会自动扩展以适应新的日志文件信息。但是,如果兼容性设置早于10.2.0,那么ALTER DATABASE命令会生成一个错误,您必须先创建新的控制文件。
有关兼容级别的信息,请参阅“关于兼容初始化参数”。
CREATE CONTROLFILE语句
您可以使用CREATE CONTROLFILE语句为数据库创建新的控制文件。以下语句为prod数据库(以前使用其他数据库名称的数据库)创建一个新的控制文件:
CREATE CONTROLFILE SET DATABASE prod LOGFILE GROUP 1 ('/u01/oracle/prod/redo01_01.log', '/u01/oracle/prod/redo01_02.log'), GROUP 2 ('/u01/oracle/prod/redo02_01.log', '/u01/oracle/prod/redo02_02.log'), GROUP 3 ('/u01/oracle/prod/redo03_01.log', '/u01/oracle/prod/redo03_02.log') RESETLOGS DATAFILE '/u01/oracle/prod/system01.dbf' SIZE 3M, '/u01/oracle/prod/rbs01.dbs' SIZE 5M, '/u01/oracle/prod/users01.dbs' SIZE 5M, '/u01/oracle/prod/temp01.dbs' SIZE 5M MAXLOGFILES 50 MAXLOGMEMBERS 3 MAXLOGHISTORY 400 MAXDATAFILES 200 MAXINSTANCES 6 ARCHIVELOG;
- CREATE CONTROLFILE语句可能会损坏指定的数据文件和重做日志文件。省略文件名可能会导致该文件中的数据丢失或无法访问整个数据库。发出此声明时请小心,并务必按照“创建新控制文件的步骤”中的说明进行操作。
- 如果数据库在创建新控制文件之前已启用强制日志记录,并且希望它继续启用,则必须在CREATE CONTROLFILE语句中指定FORCE LOGGING子句。请参阅“指定FORCE LOGGING模式”。
Oracle数据库SQL语言参考描述了CREATE CONTROLFILE语句的完整语法
创建新控制文件的步骤
完成以下步骤来创建一个新的控制文件
- 列出数据库的所有数据文件和重做日志文件。
如果按照“备份控制文件”中所述遵循控制文件备份的建议,则您将拥有反映数据库当前结构的数据文件和重做日志文件的列表。但是,如果您没有这样的列表,执行以下语句将生成一个。
SELECT MEMBER FROM V$LOGFILE; SELECT NAME FROM V$DATAFILE; SELECT VALUE FROM V$PARAMETER WHERE NAME = 'control_files';
如果您没有这样的列表,并且控制文件已损坏,导致数据库无法打开,请尝试查找构成数据库的所有数据文件和重做日志文件。一旦创建新的控制文件,任何未在步骤5中指定的文件都无法恢复。此外,如果您省略组成SYSTEM表空间的任何文件,则可能无法恢复数据库。
- 关闭数据库
如果数据库已打开,请尽可能正常关闭数据库。仅使用IMMEDIATE或ABORT子句作为最后的手段。 - 备份数据库的所有数据文件和重做日志文件
- 启动一个新实例,但不安装或打开数据库:
STARTUP NOMOUNT
- 使用CREATE CONTROLFILE语句为数据库创建一个新的控制文件。
创建新的控制文件时,如果除了控制文件以外,还丢失了任何重做日志组,请指定RESETLOGS子句。在这种情况下,您需要从丢失重做日志中恢复(步骤8)。如果您已重命名数据库,则必须指定RESETLOGS子句。否则,请选择NORESETLOGS子句。 - 将新控制文件的备份存储在脱机存储设备上。有关创建备份的说明,请参阅“备份控制文件”。
- 编辑数据库的CONTROL_FILES初始化参数,以指示所有控制文件现在是步骤5中创建的数据库的一部分(不包括备份控制文件)。如果要重命名数据库,请编辑实例参数文件中的DB_NAME参数以指定新名称。
- 如有必要恢复数据库。如果您没有恢复数据库,请跳至步骤9。
如果您要创建控制文件作为恢复的一部分,请恢复数据库。如果新控制文件是使用NORESETLOGS子句(步骤5)创建的,则可以通过完全关闭的数据库恢复来恢复数据库。
如果新控制文件是使用RESETLOGS子句创建的,则必须指定USING BACKUP CONTROL FILE。如果您丢失了联机或归档重做日志或数据文件,请使用恢复这些文件的过程。
Oracle数据库备份和恢复用户指南“,获取有关恢复数据库的信息以及恢复丢失的控制文件的方法
使用以下方法之一打开数据库:
- 如果您没有执行恢复,或者您在步骤8中执行了完整的关闭数据库恢复,请正常打开数据库。
ALTER DATABASE OPEN;
- 如果您在创建控制文件时指定了RESETLOGS,请使用ALTER DATABASE语句指示RESETLOGS。
ALTER DATABASE OPEN RESETLOGS;
数据库现在已打开并可供使用。
参考资料
https://docs.oracle.com/cd/E11882_01/server.112/e25494/control.htm#ADMIN10064