目录
- 一、控制文件概述
- 二、控制文件在rman恢复时的使用
- 三、控制文件管理
LLL的数据库培训—第二部分—Oracle基础知识培训—第16讲—控制文件的概念及管理
一、控制文件概述
1、控制文件的特点
Oracle数据库的控制文件是数据库中极其重要的文件。有如下特点
(1)该文件是一个比较小的二进制文件,记载了物理数据库的当前状态。 (2)每一个控制文件只属于一个数据库,但为了防止控制文件丢失,一个数据库一般有不止一个控制文件。这些控制文件中的内容完全一样。 (3)在数据库装载或打开之前, Oracle服务器必须能够访问控制文件。 (4)当数据库在打开状态下, Oracle服务器会随时修改控制文件中的内容。 (5)任何用户,包括数据库管理员都不能修改控制文件中的数据。 (6)如果由于某种原因 Oracle服务器不能访问控制文件,数据库就将无法正常工作。 (7)如果一个数据库的所有控制文件都出了问题,那么这个数据库就需要进行恢复。 因此实际的商用数据库至少需要两个(般为3个)控制文件,为了防止磁盘的物理故障,这些控制文件最好放在不同的物理磁盘上,而且最好放在不同的物理磁盘控制器上
2、控制文件的内容:
控制文件中存放了有关数据库的如下信息:
(1)数据库的名字:
该名取自初始化参数说明的数据库名字或 CREATE DATABASE语句中所使用的名字。
(2)数据库标识符:
该标识符是在创建数据库时Oracle自动生成的。
(3)数据库创建的时间戳:
它是在数据库创建时生成的。
(4)联机重做日志文件的名字和准确位置:
当在增加,删除和修改重做日志文件时, Oracle会修改相关的信息
(5)当前日志的序列号:
它是在日志切换时 Oracle记录的。
(6)校验(检查)点信息:
该信息是在产生校验点时Oracle记录的。
(7)日志的历史信息:
这些信息是在日志切换时 Oracle记录的。
(8)归档日志文件的准确位置和状态:
这些信息是在重做日志文件被归档(复制到归档日志文件)时 Oracle记录的。
(9)数据文件的名字和准确位置:
当在增加删除和修改数据文件的名字时, Oracle会修改相关的信息。
(10)表空间的信息:
当在增加或删除表空间时, Oracle会修改相关的信息。
(11)备份的准确位置和状态:
这些信息是由恢复管理器记录的有关数据库的。
3、记录控制文件名及路径的参数为: CONTROL_FILES
show parameter control_files;
4、从控制文件中获取信息的数据字典
控制文件中存放了如此多的有关数据库的重要信息,那应该如何才能获取这些信息。就是使用数据字典。
v$archived
v$archived_log
v$backup
v$database
v$datafile
v$log
v$logfile
v$loghist
v$tablespace
v$tempfile
5、控制文件的相关视图(数据字典):
v$controlfile ---- 列出实例的所有控制文件的名字和状态 v$parameter ---- 列 出 所 有 参 数 的 位 置 和 状 态 ( where name='control_files') v$controlfile_recode_section ---- 提供控制文件的记录部分的信息 show parameter control_files ---- 列出控制文件的名字、状态和位置 select * from v$controlfile; select name,type,value from v$parameter where name like '%control%'; select * from v$controlfile_record_section;
查看控制文件中关于数据文件中的数据记录信息:(注意,DATAFILE 一定要大写,否则会提示"未选定行")
6、对控制文件的要求
控制文件是一个Oracle服务器经常操作的文件,所以我们应该尽量的保持较小的状态,但Oracle并没有给出直接的方法来控制。但我们可以间接的进行控制。
控制文件由两大部分组成:可重用的部分和不可重用的部分。
(1)可重用的部分:
可用control_file_record_keep_time参数来控制,该参数的默认值为7天,即可重用部分的内容保留7天,一周之后这部分的内容可能被覆盖(可能的意思是?) 可重用的部分是供恢复管理器来使用的,这部分的内容可以自动扩展。
(2)不可重用的部分:
通过使用create database或create controlfile来间接影响不可重用的部分的大小。
如:
maxdatafiles maxinstances maxlogfiles maxloghistory maxlogmembers
注:手动创建数据库的语句:
CREATE DATABASE mesorcl MAXLOGFILES 16 MAXLOGMEMBERS 4 MAXDATAFILES 1024 MAXINSTANCES 1 MAXLOGHISTORY 680 CHARACTER SET AL32UTF8 DATAFILE /u01/dbfile/system01. dbf' SIZE 5OOM REUSE UNDO TABLESPACE undotbs1 DATAFILE EXTENT MANAGEMENT LOCAL /u01/dbfile/012c/undotbs01. dbf' SIZE 800M SYSAUX DATAFILE '/u01/dbfile/saux01.dbf SIZE 500M DEFAULT TEMPORARY TABLESPACE TEMP TEMPFILE '/u01/dbfile/temp01. dbf' SIZE 500M DEFAULT TABLESPACE USERS DATAFILE '/u01/dbfile/012c/users01. dbf' SIZE 20M LOGFILE GROUP 1 ('/u01/oraredo/redo01a.rdo, '/u02/oraredo/012c/redo01b.rdo') SIZE 50M, GROUP 2 ('/u01/oraredo/o12c/redoo2a.rdo, '/u02/oraredo/redo02b.rdo') SIZE 50M, GROUP 3 ('/u01/oraredo/o12c/redoo3a.rdo', '/u02/oraredo/o12c/redo03b.rdo') SIZE 50M USER sys IDENTIFIED BY foo USER system IDENTIFIED BY foo;
7、关于控制文件,总结一下:
(1)二进制文件 (2)记录了数据库当前实例的结构和行为,数据文件日志文件的信息,维护数据库一致性 (3)参数文件中定义了控制文件的位置和大小 (4)很小的二进制文件,一般不超过 100m (5)mount 阶段 open 以后,一直在用 (6)一套控制文件只能连接一个 database (7)分散放置,至少一份,至多八份。 (8)控制文件3秒同步一次
8、关于control损坏或丢失
(1)Control File 丢失其中一个
系统还是可以 checkpoint 和 switch logfile 的。
(2)Control File 不一致,
Oracle 马上就挂掉了。
(3)Control File 破坏掉后
Oracle 还是能够坚持一阵子的,select update 都没有问题,checkpoint 的时候就挂掉了。
二、控制文件在rman恢复时的使用
1、Oracle 基于 RMAN 的备份方式,可分为以 catalog 和 nocatalog 的两种方式进行备份管理。
(1)catalog 的方式
需要一个 catalog 目录数据库, 这个数据库一般运行在另外一台服务器上, 这种方式可以用于用户有多个 Oracle 数据库的环境,同时对数据库的备份恢复信息也可以长久的保存, 也就是 RMAN 把对数据库 A 的备份恢复记录保留在 catalog 目录数据库中。
(2)nocatalog 的备份管理方式,
是将 RMAN 的备份信息放在控制文件中 由于控制文件的大小不能无限增大,所以在控制文件中只能保留一段时间的备份与恢复信息 , 而 这 个 时 间 的 控 制 , 由 一 个 参 数 为 参 考 依 据 , 这 个 参 数 就 是control_file_record_keep_time , 通 过 在 sqlplus 中 show parameter control_file_record_keep_time 可以查到这个参数的值,默认为 7 天
SQL> show parameter control_file_record_keep_time NAME TYPE VALUE ----------------------------- ----------- ----------- control_file_record_keep_time integer 7
2、如何查看控制文件内容
(1)用操作系统命令查看,strings control.ctl--【二进制,不容易看懂】
SQL> show parameter control_file --查看控制文件位置
$strings control.ctl
(2)用数据库命令【二进制,不容易看懂】
此种和第一种一样,是给控制文件做了备份,是二进制文件,strings不容易看懂
SQL> alter database backup controlfile to <filename>; --此种情况需要设置文件名路径
如:
SQL> alter database backup controlfile to '/oracle/ora_control.bak'; --指定到目录
(3)用数据库 trace 【这个比较简单且容易查看】,是level3的详细情况---这个是trace文件,用于控制文件损坏重建使用
方法一:默认到trace
SQL>oradebug setmypid;
SQL>oradebug tracefile_name;
/oracle/app/oracle/diag/rdbms/mesorcl/mesorcl/trace/mesorcl_ora_24180.trc
SQL>alter database backup controlfile to trace;
方法二:指定路径到trace
SQL> alter database backup controlfile to trace as '/oracle/control.trc';
此处查看控制文件的内容
-- Below are two sets of SQL statements, each of which creates a new -- control file and uses it to open the database. The first set opens -- the database with the NORESETLOGS option and should be used only if -- the current versions of all online logs are available. The second -- set opens the database with the RESETLOGS option and should be used -- if online logs are unavailable. -- The appropriate set of statements can be copied from the trace into -- a script file, edited as necessary, and executed when there is a -- need to re-create the control file.
(4)直接 dump controlfile---这个是dump的数据,和(3)中的trace信息不一样,是块信息
转储控制文件内容(查看控制文件中的具体内容)
SQL> alter session set events 'immediate trace name CONTROLF level 3';
level 表示级别:
- level 1 块头
- level 2 文件内容
- level 3 1+2
- level 10 全部
- level 12 全部内容
方法一:
SQL> oradebug setmypid --标记当前进程 SQL>oradebug tracefile_name; SQL> oradebug dump controlf 3; SQL> show parameter user_dump;
方法二:
SQL> oradebug setmypid --标记当前进程 SQL>oradebug tracefile_name; SQL> alter system set events 'immediate trace name controlf level 3';
3、 控制文件中关于 Resetlogs 和 NoResetlogs 的分析
在恢复数据库操作之后,使用以下命令打开数据库:ALTER DATABASE OPEN [NO] RESETLOGS
(1)NORESETLOGS选项
不会在启动过程中清除重做日志文件,也不会清除要用于恢复的联机重做日志。仅在启动MANUAL RECOVERY的情况下使用CANCEL,然后再启动RECOVER DATABASE。
(2 )RESETLOGS选项-重置日志
注意:除非必要,否则请勿使用RESETLOGS。
一旦使用了RESETLOGS,就无法使用重做日志文件,并且那些重做日志中的所有已完成事务都将丢失!!
在使用RESETLOGS选项之前,请对数据库进行离线备份。
RESETLOGS选项清除所有联机重做日志并修改所有联机数据文件以指示不需要恢复。重置重做日志后,不能再使用现有的日志文件或数据文件备份。
在控制文件中,修改了日志序列号,这对于恢复非常重要。发现将仅应用于序列号大于控制文件中的日志序列号的日志文件。
使用RESETLOGS选项时必须非常谨慎。重要的是要记住,所有数据文件都必须在线,否则一旦数据库启动它们将变得无用。
4、什么时候用 RESETLOGS 和 NORESETLOGS 几种情况的说明
( 1) 第一种情况--仅丢失控制文件
假设仅仅控制文件丢失,而其他文件没有丢失(主要是归档和 REDO),那么恢复的时候如果选择从备份中恢复控制文件。
恢复后,控制文件会去读数据文件头中与CHECKPOINT SCN 对应的 RBA 信息来确定从那个序列的归档日志开始恢复,一直推进恢复到 NEXT SCN 是无穷大的那个 REDOLOG,此时恢复是完全恢复的,但打开的时候还要以 resetlogs 方式打开,这样要重置归档日志的 sequence,也就是说,如果你恢复时使用了备份控制文件,那么打开数据库时必然是要 resetlogs 的。
不完全恢复时是必须 RESETLOGS,但是完全恢复时如果使用备份控制文件来恢复,那么使用 RESETLOGS 一样可以完全恢复。
但是丢失控制文件也可以不使用RESETLOGS 方式打开数据库,这样也就可以避免重置日志序列号带来的不便,详情请见第四种情况。
( 2) 第二种情况--不完全恢复
不完全恢复,不管是要什么样的不完全恢复, SCN, TIME,跨越 REDO,都必须使用resetlogs。
( 3) 第三种情况--丢失redolog
丢失 REDOLOG,这就更需要 resetlogs 了,因为 resetlogs 能够重建 REDOLOG。
如果你的 REDOLOG、控制文件、数据文件丢失的话,需要先恢复控制文件,然后:
restore database——>recover database——>alter database open resetlogs;
注意,这时候做的是不完全恢复,因为 REDO 没有了。
在 recover 过程中可能会报错然后自动退出 RMAN,无视, alter database open resetlogs 即可.
( 4) 第四种情况--之丢失数据文件
没有丢失控制文件及各种日志,仅丢失数据文件,这种问题比较常见,有可能磁盘损坏造成数据文件丢失,等磁盘故障排除后,需要恢复,此时的恢复就很简单了,
restore database——>recover database——>alter database open
就一切 OK,也就是说,在不使用备份控制文件恢复的情况下,是可以使用 noresetlog方式打开数据库的。
前提有一,不能丢失日志文件。
假若丢失 了控制文件和数据文 件但还是想以noresetlog 打开的话,就必须手动以 noresetlogs 方式重建控制文件,而且 REDOLOG的状态都必须正常,否则是无法使用 noresetlogs 方式打开。
三、控制文件管理
1、查看控制文件的名称和位置(4中方式)
(1)如果数据库处于 nomount、 mounted或open状态;
通过如下参数,就可以查看控制文件的名称和位置:
SQL> show parameter control files
(2)当数据库处于 mounted或open状态时:
可以通过 VSCONTROLFILE视图,查询控制文件的位置和名称。
SOL> select name from v$controlfile;
(3)如果出现数据库彻底无法启动:可以查看spfile
可以通过检查初始化(参数)文件的内容获得这些信息。
如果你使用的是 spfile,即使它是一个二进制文件,也可以使用文本编辑器打开。最安全的方法是为 spfile创建一个副本,然后使用OS编辑器检查它的内容:
$cp $ORACLE_HOME/dbs/spfileomesorcl. ora SORACLE_HOME/dbs/spfilemesorcl.copy $strings SORACLE_HOME/dbs/spfilemesorcl.copy
(4)如果出现数据库彻底无法启动:可以查看pfile
如果你使用基于文本的初始化文件,可以使用OS编辑器或grep命令直接查看该文件: $grep -i ontrol_files SORACLE_HOME/dbs/initoi2c.ora
2、增加控制文件/移动控制文件
增加控制文件意味着复制现存的控制文件并修改 CONTROL FILES参数使数据库获得该副本的位置信息。
这个任务必须在关闭数据库的情况下完成。
(1)使用正文初始化参数文件添加或移动控制文件的具体步骤:
--利用数据字典 v$controlfile来获取现有控制文件的名字 --正常关闭Oracle数据库,如 shutdown或 shutdown immediate。 --将新的控制文件名添加到参数文件的 CONTROL FILES参数中。 --使用操作系统的复制命令将现有控制文件复制到指定位置。 --重新启动Oracle数据库。 --利用数据字典v$controlfile来验证新的控制文件的名字是否正确。 --如果有误,重做上述操作;如果无误,删除无用的旧控制文件。
(2)如果使用了服务器初始化参数文件(SPFILE),其步骤如下:
--利用数据字典v$controlfile来获取现有控制文件的名字 --修改SPFILE,使用 alter system set controlfiles命令来改变控制文件。(如果删除,直接去掉不用的控制文件路径即可) --正常关闭数据库,如 shutdown或 shutdown immediate --使用操作系统的复制命令将现有控制文件复制到指定位置(增加或移动) --重新启动Oracle数据库,如 startup --利用数据字典v$controlfile来验证新的控制文件的名字是否正确 --如果有误,重做上述操作;如果无误,删除无用的旧控制文件
4、删除控制文件
同样是两种方式:
(1)如果使用正文初始化参数文件,删除控制文件的具体步骤:
--利用数据字典 v$controlfile来获取现有控制文件的名字 --正常关闭Oracle数据库,如 shutdown或 shutdown immediate。 --在参数文件中,删除不需要的控制文件并保存。 --重新启动Oracle数据库,startup 。 --利用数据字典v$controlfile来验证新的控制文件的名字是否正确。 --如果有误,重做上述操作;如果无误,删除无用的旧控制文件。
(2)如果使用了服务器初始化参数文件(SPFILE),,删除控制文件其步骤如下:
--利用数据字典v$controlfile来获取现有控制文件的名字 --修改SPFILE,使用 alter system set controlfiles命令来改变控制文件的位置。(如果删除,直接去掉不用的控制文件路径即可) --正常关闭数据库,如 shutdown或 shutdown immediate --使用操作系统的复制命令将现有控制文件复制到指定位置(增加或移动) --重新启动Oracle数据库,如 startup --利用数据字典v$controlfile来验证新的控制文件的名字是否正确 --如果有误,重做上述操作;如果无误,删除无用的旧控制文件。
5、对控制文件进行跟踪备份(作为重建控制文件使用)
(1)方法1:备份到当前会话指定的跟踪文件中
SQL>oradebug setmypid; SQL>oradebug tracefile_name; /oracle/app/oracle/diag/rdbms/mesorcl/mesorcl/trace/mesorcl_ora_24180.trc SQL>alter database backup controlfile to trace;
(2)方法2:备份到指定路径
SQL>alter database backup controlfile to trace as '/oracle/controlfile.bak';