章节内容:
l 什么是控制文件
l 控制文件指南
l 创建控制文件
l 创建控制文件后的疑难解答
l 备份控制文件
l 使用当前副本恢复控制文件
l 删除控制文件
l 控制文件数据字典视图
每个Oracle数据库都有一个控制文件,它是一个小二进制文件,用于记录数据库的物理结构。控制文件中包含下列内容:
l 数据库名称
l 关联数据文件和重做日志文件的名称和位置
l 数据库创建的时间戳
l 当前日志序列号
l 检查点信息
l 当数据库打开时,Oracle数据库服务器对控制文件必须是可写的。没有控制文件,数据库将会无法挂载,并且恢复困难。
Oracle数据库的控制文件与数据库同时创建。默认情况下,在创建数据库期间至少会创建一个控制文件副本。在某些操作系统上,默认是创建多个副本。你应该在数据库创建过程中创建两个或多个控制文件副本。如果你丢失了控制文件或想要更改控制文件中的特定信息,也可以稍后创建控制文件。
本节介绍管理数据库控制文件的准则,其中包含以下主题:
l 指定控制文件的文件名
l 控制文件在不同磁盘上的多路复用
l 备份控制文件
l 管理控制文件的大小
你可以使用数据库初始化参数文件中的CONTROL_FILES初始化参数指定控制文件名。数据库实例在数据库启动过程中识别并打开CONTROL_FILES参数中列出的控制文件,并在数据库操作过程中写入和维护这些控制文件。
如果在创建数据之前未指定CONTROL_FILES的文件:
l 如果不使用OMF(Oracle Managed Files),则数据库将创建一个控制文件并使用默认文件名,默认名称和操作系统相关。
l 如果使用OMF(Oracle Managed Files),那么OMF的初始化参数将指定控制文件的名称和位置。
l 如果使用Oracle自动存储管理(Oracle ASM),则可以将部分Oracle ASM文件名配置在DB_CREATE_FILE_DEST和DB_RECOVERY_FILE_DEST初始化参数中。然后,Oracle ASM会在相应的位置自动创建控制文件。
每个Oracle数据库应至少有两个控制文件,每个控制文件存储在不同的物理磁盘上。如果控制文件由于磁盘故障而损坏,则关联的实例必须关闭。当磁盘修复完毕后,可以使用其他磁盘上的控制文件的完整副本来还原损坏的控制文件,然后可以重新启动实例。在这种情况下,不需要进行介质恢复。
在多路复用控制文件下,数据库进行如下操作:
l 数据库写入初始化参数CONTROL_FILES列出的所有控制文件名。
l 在数据库操作期间,数据库只读取CONTROL_FILES参数中列出的第一个文件。
l 如果任何控制文件在数据库操作期间变得不可用,则数据库实例将变得不可用,操作应该被中止。
注意:
Oracle强烈建议你的数据库至少有两个控制文件,并且它们位于独立的物理磁盘上。
如果重做日志是多路复用的,可以将控制文件副本放在重做日志组成员所在的每个磁盘上,实现对控制文件的多路复用。通过在这些位置存储控制文件,可以最大限度地减少在磁盘故障中丢失所有控制文件和所有重做日志组的风险。
备份控制文件非常重要,包括在数据库最初始状态和每次对数据库的物理结构进行变更的情况。结构性变化如下:
l 添加,删除或重命名数据文件
l 添加或删除表空间,或更改表空间的读/写状态
l 添加或删除重做日志文件或重做日志组
备份控制文件的方法在“备份控制文件”中进行了说明。
在使用CREATE DATABASE语句创建数据库时,控制文件大小由MAXDATAFILES,MAXLOGFILES,MAXLOGMEMBERS,MAXLOGHISTORY和MAXINSTANCES等参数的值决定。增加这些参数的值会增加相关数据库的控制文件的大小。
本章节描述创建控制文件的方法,包括如下主题:
l 创建初始化控制文件
l 添加额外副本,重命名和移动控制文件
l 创建新的控制文件
当你执行CREATE DATABSE语句时,数据库会自动创建初始化控制文件。控制文件的名字通过参数文件中的CONTROL_FILES参数指定,在CONTROL_FILES参数中需要指定控制文件名为全路径,具体到操作系统。以下是CONTROL_FILES初始化参数的例子:
如果你在创建数据库过程中,指定的控制文件名已存在,那必须在CREATE DATABASE语句中使用CONTROLFILE REUSE子句,否则会提示错误。同时,如果旧控制文件和参数中指定的控制文件大小不一致,那么不能使用REUSE子句。
在不同Oracle数据库发行版之间,控制文件大小和数量会有所不同。通过配置MAXDATAFILES,MAXLOGFILES,MAXLOGMEMBERS,MAXLOGHISTORY和MAXINSTANCES等参数可以影响控制文件的大小。
你可以后续再修改CONTROL_FILES 参数值,以添加控制文件,修改控制文件名或者移动已有控制文件的位置。
你可以通过拷贝一个已有的控制文件到新的路径下然后修改CONTROL_FILES参数的方式添加控制文件备份。类似的,你也可以通过修改控制文件名或者将控制文件移动到其他路径的方式对控制文件重命名。在上述两种情况下,为了保证控制文件的一致性,请在拷贝控制文件前将数据库关闭。
添加一个控制文件备份或者重命名一个控制文件的方法:
1.关闭数据库
2.使用操作系统命令将已有控制文件拷贝至一个新的路径下
3.编辑初始化参数文件中的CONTROL_FILES 参数值,添加一个新的控制文件名或者修改已有控制文件名。
4.重启数据库
本节讨论何时以及如何创建新的控制文件。
在下列这些情况下,你需要创建新的控制文件:
l 在没有控制文件备份的情况下,数据库的所有控制文件都永久损坏
l 你想要修改数据库名
比如,在分布式环境中,你想修改一个和其他数据库名称冲突的数据库名。
注意:
你可以使用DBNEWID应用程序更改数据库名称和DBID(数据库内部标识符)。
l 当兼容性级别设置为早于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语句为数据库创建一个新的控制文件。下列语句为prod数据库(以前使用不同数据库名称的数据库)创建一个新的控制文件:
注意事项:
CREATE CONTROLFILE语句可能会损坏指定的数据文件和重做日志文件。省略文件名可能导致该文件中的数据丢失,或丢失对整个数据库的访问。发出此声明时务必小心,请务必按照“创建新控制文件的步骤”中的说明进行操作。
如果数据库在创建新的控制文件之前启用强制日志模式,并且希望继续启用该模式,则必须在CREATE CONTROLFILE语句中指定FORCE LOGGING子句。
完成以下步骤来创建一个新的控制文件。
1.列出数据库的所有数据文件和重做日志文件。
如果按照“备份控制文件”中的说明,遵循控制文件备份的建议,你将会拥有一个反映当前数据库结构的数据文件和重做日志文件的列表。但是,如果没有这样的列表,则执行以下语句生成一个列表。
如果你没有这样的列表,并且你的控制文件已损坏,从而无法打开数据库,请尝试查找数据库的所有数据文件和重做日志文件。创建新的控制文件后,步骤5中未指定的任何文件都不可恢复。而且,如果省略组成SYSTEM表空间的任何文件,则可能无法恢复数据库。
2.关闭数据库。
如果数据库是打开的,尽可能正常关闭数据库。IMMEDIATE或者ABORT子句只能作为最后的手段使用。
3.备份数据库的所有数据文件和重做日志文件。
4.启动一个新的实例,但不要挂载或打开数据库:
5.使用CREATE CONTROLFILE语句为数据库创建一个新的控制文件。
在创建新的控制文件时,如果除了控制文件之外丢失了任何重做日志组,请指定RESETLOGS子句。在这种情况下,你将需要对丢失的重做日志进行恢复(步骤8)。如果你已经重命名数据库,则必须指定RESETLOGS子句。否则,选择“NORESETLOGS”子句。
6.将新控制文件的备份存储在脱机存储设备上。有关创建备份的说明,请参阅“备份控制文件”。
7.编辑数据库的CONTROL_FILES初始化参数,指定为步骤5中创建的数据库所有控制文件(不包括备份控制文件)。如果要重命名数据库,请编辑实例参数文件中的DB_NAME参数以指定新名称。
8.必要时进行数据库恢复。如果你没有恢复数据库,请跳到步骤9。
如果你正在创建控制文件作为恢复的一部分,请恢复数据库。如果使用NORESETLOGS子句(步骤5)创建了新的控制文件,则可以使用完整的,关闭的数据库进行恢复。
如果新的控制文件是使用RESETLOGS子句创建的,则必须指定USING BACKUP CONTROL FILE。 如果你丢失了在线或存档的重做日志或数据文件,请使用恢复这些文件的步骤。
9.使用下列方法之一打开数据库:
l 如果你没有执行恢复,或者在步骤8执行完整的,关闭的数据库恢复,请正常打开数据库。
l 如果在创建控制文件时指定了RESETLOGS,请使用ALTER DATABASE语句,指定RESETLOGS。
数据库现已打开并可用。
执行CREATE CONTROLFILE语句后,你可能会遇到一些错误。本节介绍最常见的控制文件错误:
l 检查丢失或额外的文件
l 在CREATE CONTROLFILE期间处理错误
在创建完一个新的控制文件并用它打开数据库后,检查告警日志以查看数据库是否检测到数据字典与控制文件不一致,例如数据字典中的数据文件在控制文件中找不到。
如果控制文件中不存在数据字典中列出的数据文件,则数据库将以名称MISSINGnnnn在控制文件中创建一个占位符条目,其中nnnn是十进制的文件编号。MISSINGnnnn在控制文件中被标记为脱机并需要介质恢复。
如果MISSINGnnnn对应的实际数据文件为只读或脱机正常,则可以通过将MISSINGnnnn重命名为实际数据文件的名称来使数据文件可访问。如果MISSINGnnnn对应不是只读或脱机正常的数据文件,则不能使用重命名操作来使数据文件可访问,因为数据文件被RESETLOGS的结果排除,需要进行介质恢复。在这种情况下,你必须删除包含数据文件的表空间。
相反的,如果数据字典中不存在控制文件中列出的数据文件,则数据库将在新的控制文件中删除对数据文件的引用。在这两种情况下,数据库都会在告警日志中生成一条解释性消息,让你知道数据库做了什么。
如果在创建新的控制文件后尝试挂载和打开数据库时,Oracle数据库会向你发送错误(通常为ORA-01173,ORA-01176,ORA-01177,ORA-01215或ORA-01216),因为你在CREATE CONTROLFILE语句中省略了一个文件,或者包含不应列出的文件。在这种情况下,你应该恢复在步骤3中备份的文件,并使用正确的文件名重复步骤4中的过程。
使用ALTER DATABASE BACKUP CONTROLFILE语句备份你的控制文件。你有两个选择:
l 使用下列语句将控制文件备份到二进制文件(现有控制文件的副本):
l 生成可以用于重新创建控制文件的SQL语句:
此命令将SQL脚本写入trace文件,可以对其进行抓取和编辑以重现控制文件。通过查看告警日志可以确定跟踪文件的名称和位置。
本节介绍如何从当前备份或多路复用中恢复控制文件。
此过程假定CONTROL_FILES参数中指定的控制文件之一已损坏,控制文件目录仍可访问,并且具有控制文件的多路复用。
1.在实例关闭时,使用操作系统命令用正常的副本覆盖异常的控制文件:
2.启动SQL * Plus并打开数据库:
此过程假定由于永久介质故障,并且您具有控制文件的复用副本,CONTROL_FILES参数中指定的控制文件之一是无法访问的。
1.在实例关闭时,使用操作系统命令将控制文件的当前副本复制到新的可访问位置:
2.编辑初始化参数文件中的CONTROL_FILES参数,用新的位置替换异常的位置:
3.启动SQL * Plus并打开数据库:
如果您有复用控制文件,可以通过编辑CONTROL_FILES初始化参数来快速启动数据库。从CONTROL_FILES配置中删除异常控制文件,您可以立即重新启动数据库。然后,您可以执行异常控制文件的重建,然后再编辑CONTROL_FILES初始化参数以包括恢复的控制文件,再关闭并重新启动数据库。
您想要从数据库中删除控制文件,例如,如果控制文件的位置不再合适。请记住,数据库始终至少应有两个控制文件。
1.关闭数据库。
2.编辑数据库初始化参数文件中的CONTROL_FILES参数,以删除旧的控制文件名。
3.重新启动数据库。
注意:
此操作不会从磁盘中物理删除不需要的控制文件。从数据库中删除控制文件后,使用操作系统命令删除不必要的文件。
以下视图显示有关控制文件的信息:
视图 |
描述 |
V$DATABASE |
从控制文件显示数据库信息 |
V$CONTROLFILE |
列出控制文件的名称 |
V$CONTROLFILE_RECORD_SECTION |
显示有关控制文件记录部分的信息 |
V$PARAMETER |
显示CONTROL_FILES初始化参数中指定的控制文件的名称 |
此示例列出了控制文件的名称: