共计 7682 个字符,预计需要花费 20 分钟才能阅读完成。
1. 控制文件管理
章节内容:
l 什么是控制文件
l 控制文件指南
l 创建控制文件
l 创建控制文件后的疑难解答
l 备份控制文件
l 使用当前副本恢复控制文件
l 删除控制文件
l 控制文件数据字典视图
1.1. 什么是控制文件
每个 Oracle 数据库都有一个控制文件,它是一个小二进制文件,用于记录数据库的物理结构。控制文件中包含下列内容:
l 数据库名称
l 关联数据文件和重做日志文件的名称和位置
l 数据库创建的时间戳
l 当前日志序列号
l 检查点信息
l 当数据库打开时,Oracle数据库服务器对控制文件必须是可写的。没有控制文件,数据库将会无法挂载,并且恢复困难。
Oracle数据库的控制文件与数据库同时创建。默认情况下,在创建数据库期间至少会创建一个控制文件副本。在某些操作系统上,默认是创建多个副本。你应该在数据库创建过程中创建两个或多个控制文件副本。如果你丢失了控制文件或想要更改控制文件中的特定信息,也可以稍后创建控制文件。
1.2. 控制文件指南
本节介绍管理数据库控制文件的准则,其中包含以下主题:
l 指定控制文件的文件名
l 控制文件在不同磁盘上的多路复用
l 备份控制文件
l 管理控制文件的大小
1.2.1. 指定控制文件的文件名
你可以使用数据库初始化参数文件中的 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会在相应的位置自动创建控制文件。
1.2.2. 控制文件在不同磁盘上的多路复用
每个 Oracle 数据库应至少有两个控制文件,每个控制文件存储在不同的物理磁盘上。如果控制文件由于磁盘故障而损坏,则关联的实例必须关闭。当磁盘修复完毕后,可以使用其他磁盘上的控制文件的完整副本来还原损坏的控制文件,然后可以重新启动实例。在这种情况下,不需要进行介质恢复。
在多路复用控制文件下,数据库进行如下操作:
l 数据库写入初始化参数 CONTROL_FILES 列出的所有控制文件名。
l 在数据库操作期间,数据库只读取 CONTROL_FILES 参数中列出的第一个文件。
l 如果任何控制文件在数据库操作期间变得不可用,则数据库实例将变得不可用,操作应该被中止。
注意:
Oracle强烈建议你的数据库至少有两个控制文件,并且它们位于独立的物理磁盘上。
如果重做日志是多路复用的,可以将控制文件副本放在重做日志组成员所在的每个磁盘上,实现对控制文件的多路复用。通过在这些位置存储控制文件,可以最大限度地减少在磁盘故障中丢失所有控制文件和所有重做日志组的风险。
1.2.3. 备份控制文件
备份控制文件非常重要,包括在数据库最初始状态和每次对数据库的物理结构进行变更的情况。结构性变化如下:
l 添加,删除或重命名数据文件
l 添加或删除表空间,或更改表空间的读 / 写状态
l 添加或删除重做日志文件或重做日志组
备份控制文件的方法在“备份控制文件”中进行了说明。
1.2.4. 管理控制文件的大小
在使用 CREATE DATABASE 语句创建数据库时,控制文件大小由 MAXDATAFILES,MAXLOGFILES,MAXLOGMEMBERS,MAXLOGHISTORY 和MAXINSTANCES等参数的值决定。增加这些参数的值会增加相关数据库的控制文件的大小。
1.3. 创建控制文件
本章节描述创建控制文件的方法,包括如下主题:
l 创建初始化控制文件
l 添加额外副本,重命名和移动控制文件
l 创建新的控制文件
1.3.1. 创建初始化控制文件
当你执行 CREATE DATABSE 语句时,数据库会自动创建初始化控制文件。控制文件的名字通过参数文件中的 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 数据库发行版之间,控制文件大小和数量会有所不同。通过配置 MAXDATAFILES,MAXLOGFILES,MAXLOGMEMBERS,MAXLOGHISTORY 和MAXINSTANCES等参数可以影响控制文件的大小。
你可以后续再修改 CONTROL_FILES 参数值,以添加控制文件,修改控制文件名或者移动已有控制文件的位置。
1.3.2. 添加额外副本,重命名和移动控制文件
你可以通过拷贝一个已有的控制文件到新的路径下然后修改 CONTROL_FILES 参数的方式添加控制文件备份。类似的,你也可以通过修改控制文件名或者将控制文件移动到其他路径的方式对控制文件重命名。在上述两种情况下,为了保证控制文件的一致性,请在拷贝控制文件前将数据库关闭。
添加一个控制文件备份或者重命名一个控制文件的方法:
1.关闭数据库
2.使用操作系统命令将已有控制文件拷贝至一个新的路径下
3.编辑初始化参数文件中的 CONTROL_FILES 参数值,添加一个新的控制文件名或者修改已有控制文件名。
4.重启数据库
1.3.3. 创建新的控制文件
本节讨论何时以及如何创建新的控制文件。
1.3.3.1. 何时创建新的控制文件
在下列这些情况下,你需要创建新的控制文件:
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 命令将生成错误,你必须先创建新的控制文件。
1.3.3.2. 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 子句。
1.3.3.3. 创建新控制文件的步骤
完成以下步骤来创建一个新的控制文件。
1.列出数据库的所有数据文件和重做日志文件。
如果按照“备份控制文件”中的说明,遵循控制文件备份的建议,你将会拥有一个反映当前数据库结构的数据文件和重做日志文件的列表。但是,如果没有这样的列表,则执行以下语句生成一个列表。
- SELECT MEMBER FROM V$LOGFILE;
- SELECT NAME FROM V$DATAFILE;
- SELECT VALUE FROM V$PARAMETER WHERE NAME = ‘control_files’;
如果你没有这样的列表,并且你的控制文件已损坏,从而无法打开数据库,请尝试查找数据库的所有数据文件和重做日志文件。创建新的控制文件后,步骤 5 中未指定的任何文件都不可恢复。而且,如果省略组成 SYSTEM 表空间的任何文件,则可能无法恢复数据库。
2.关闭数据库。
如果数据库是打开的,尽可能正常关闭数据库。IMMEDIATE或者 ABORT 子句只能作为最后的手段使用。
3.备份数据库的所有数据文件和重做日志文件。
4.启动一个新的实例,但不要挂载或打开数据库:
- STARTUP NOMOUNT
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 执行完整的,关闭的数据库恢复,请正常打开数据库。
- ALTER DATABASE OPEN;
l 如果在创建控制文件时指定了 RESETLOGS,请使用ALTER DATABASE 语句,指定RESETLOGS。
- ALTER DATABASE OPEN RESETLOGS;
数据库现已打开并可用。
1.4. 创建控制文件后的疑难解答
执行 CREATE CONTROLFILE 语句后,你可能会遇到一些错误。本节介绍最常见的控制文件错误:
l 检查丢失或额外的文件
l 在 CREATE CONTROLFILE 期间处理错误
1.4.1. 检查丢失或额外的文件
在创建完一个新的控制文件并用它打开数据库后,检查告警日志以查看数据库是否检测到数据字典与控制文件不一致,例如数据字典中的数据文件在控制文件中找不到。
如果控制文件中不存在数据字典中列出的数据文件,则数据库将以名称 MISSINGnnnn 在控制文件中创建一个占位符条目,其中 nnnn 是十进制的文件编号。MISSINGnnnn在控制文件中被标记为脱机并需要介质恢复。
如果 MISSINGnnnn 对应的实际数据文件为只读或脱机正常,则可以通过将 MISSINGnnnn 重命名为实际数据文件的名称来使数据文件可访问。如果 MISSINGnnnn 对应不是只读或脱机正常的数据文件,则不能使用重命名操作来使数据文件可访问,因为数据文件被 RESETLOGS 的结果排除,需要进行介质恢复。在这种情况下,你必须删除包含数据文件的表空间。
相反的,如果数据字典中不存在控制文件中列出的数据文件,则数据库将在新的控制文件中删除对数据文件的引用。在这两种情况下,数据库都会在告警日志中生成一条解释性消息,让你知道数据库做了什么。
1.4.2. 在 CREATE CONTROLFILE 期间处理错误
如果在创建新的控制文件后尝试挂载和打开数据库时,Oracle数据库会向你发送错误(通常为 ORA-01173,ORA-01176,ORA-01177,ORA-01215 或ORA-01216),因为你在 CREATE CONTROLFILE 语句中省略了一个文件,或者包含不应列出的文件。在这种情况下,你应该恢复在步骤 3 中备份的文件,并使用正确的文件名重复步骤 4 中的过程。
1.5. 备份控制文件
使用 ALTER DATABASE BACKUP CONTROLFILE 语句备份你的控制文件。你有两个选择:
l 使用下列语句将控制文件备份到二进制文件(现有控制文件的副本):
- ALTER DATABASE BACKUP CONTROLFILE TO‘/oracle/backup/control.bkp’;
l 生成可以用于重新创建控制文件的 SQL 语句:
- ALTER DATABASE BACKUP CONTROLFILE TO TRACE;
此命令将 SQL 脚本写入 trace 文件,可以对其进行抓取和编辑以重现控制文件。通过查看告警日志可以确定跟踪文件的名称和位置。
1.6. 使用当前副本恢复控制文件
本节介绍如何从当前备份或多路复用中恢复控制文件。
1.6.1. 使用控制文件副本恢复控制文件
此过程假定 CONTROL_FILES 参数中指定的控制文件之一已损坏,控制文件目录仍可访问,并且具有控制文件的多路复用。
1.在实例关闭时,使用操作系统命令用正常的副本覆盖异常的控制文件:
- %cp /u03/oracle/prod/control03.ctl /u02/oracle/prod/control02.ctl
2.启动 SQL * Plus 并打开数据库:
- SQL> STARTUP
1.6.2. 使用控制文件备份恢复永久介质故障
此过程假定由于永久介质故障,并且您具有控制文件的复用副本,CONTROL_FILES参数中指定的控制文件之一是无法访问的。
1.在实例关闭时,使用操作系统命令将控制文件的当前副本复制到新的可访问位置:
- %cp /u01/oracle/prod/control01.ctl /u04/oracle/prod/control03.ctl
2.编辑初始化参数文件中的 CONTROL_FILES 参数,用新的位置替换异常的位置:
- CONTROL_FILES =(/u01/oracle/prod/control01.ctl,
- /u02/oracle/prod/control02.ctl,
- /u04/oracle/prod/control03.ctl)
3.启动 SQL * Plus 并打开数据库:
- SQL> STARTUP
如果您有复用控制文件,可以通过编辑 CONTROL_FILES 初始化参数来快速启动数据库。从 CONTROL_FILES 配置中删除异常控制文件,您可以立即重新启动数据库。然后,您可以执行异常控制文件的重建,然后再编辑 CONTROL_FILES 初始化参数以包括恢复的控制文件,再关闭并重新启动数据库。
1.7. 删除控制文件
您想要从数据库中删除控制文件,例如,如果控制文件的位置不再合适。请记住,数据库始终至少应有两个控制文件。
1.关闭数据库。
2.编辑数据库初始化参数文件中的 CONTROL_FILES 参数,以删除旧的控制文件名。
3.重新启动数据库。
注意:
此操作不会从磁盘中物理删除不需要的控制文件。从数据库中删除控制文件后,使用操作系统命令删除不必要的文件。
1.8. 控制文件数据字典视图
以下视图显示有关控制文件的信息:
视图 | 描述 |
V$DATABASE | 从控制文件显示数据库信息 |
V$CONTROLFILE | 列出控制文件的名称 |
V$CONTROLFILE_RECORD_SECTION | 显示有关控制文件记录部分的信息 |
V$PARAMETER | 显示 CONTROL_FILES 初始化参数中指定的控制文件的名称 |
此示例列出了控制文件的名称:
- SQL> SELECT NAME FROM V$CONTROLFILE;
- NAME
- –––––––––––––––––––––––––––––––––––––
- /u01/oracle/prod/control01.ctl
- /u02/oracle/prod/control02.ctl
- /u03/oracle/prod/control03.ctl
更多 Oracle 相关信息见Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12
本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-10/147447.htm