Oracle Database物理文件之控制文件

来源:互联网 发布:电动汽车专用单片机 编辑:程序博客网 时间:2024/06/13 08:50

一 控制文件简介

控制文件是一个很小的二进制文件(最多能增长到64MB左右),用于记录数据库的物理结构。一个控制文件只属于一个数据库。创建数据库时,创建控制文件。当数据库的物理结构改变的时候,Oracle会更新控制文件。用户不能编辑控制文件,控制文件的修改由Oracle完成。

数据库的启动和正常运行都离不开控制文件。启动数据库时,Oracle从初始化参数文件中获得控制文件的名字及位置,打开控制文件,然后从控制文件中读取数据文件和联机日志文件的信息,最后打开数据库。数据库运行时,Oracle会修改控制文件,所以,一旦控制文件损坏,数据库将不能正常运行。

控制文件的主要内容包括:

数据库名称(Database Name)

创建数据库的时间戳

数据文件的名字及位置

联机日志文件的名字及位置

表空间信息

日志历史记录(Log History)

归档日志的信息

备份信息

当前的日志序列号(Log Sequence Number)

检查点信息(Checkpoint)

 

控制文件的大小由下面的几个参数决定:

MAXLOGFILES

MAXLOGMEMBERS

MAXLOGHISTORY

MAXDATAFILES

MAXINSTANCES

当增加、重命名、删除一个数据文件或者一个联机日志文件时,Oracle服务器进程(Server Process)会立即更新控制文件以反映数据库结构的这种变化。所以,Oracle总是告诫我们,在数据库的结构发生变化后,要备份控制文件。日志写进程LGWR负责把当前日志序列号记录到控制文件中。校验点进程CKPT负责把校验点的信息记录到控制文件中。归档进程负责把归档日志的信息记录到控制文件中。

初始化参数CONTROL_FILES的值记录控制文件的位置。通常,DBA应该镜像控制文件,把每个控制文件分布到不同的物理磁盘,发生灾难时,即使其中一个控制文件损坏,数据不会丢失,也不会使整个数据库陷于瘫痪。

 

二 查看控制文件的相关信息

1.通过系统参数查看控制文件的相关信息

SQL> show parameter control_fNAME                                             TYPE               VALUE------------------------------------             --------------     -----------------------------------------------------------control_file_record_keep_time                    integer            7control_files                                    string             /u01/app/oracle/oradata/orcl/c ontrol01.ctl,                                                                    /u01/app/oracle/ flash_recovery_area/orcl/control02.ctl                                                 

参数control_file_record_keep_time表示控制文件里可重复使用的记录所能保存的最小天数。如果新增加一条记录 到控制文件可以重复使用的部分,这时最老的记录尚没有超出最小保留天数,那么记录将控制文件的这一部分将扩展。如果将该参数设置为0,那么控制文件可以重复使用的部分将永远不会扩展。注意,这个参数只应用于控制文件中可循环利用的部分,如归档日志文件,各种备份记录。不应用于诸如数据文件,表空间,重做线程等,这些内容只有当其从对应的表空间中删除后才能重用。

参数control_files记录了当点数据库中控制文件的名字及文件路径信息。

2.通过动态视图查看控制文件的相关信息

V$CONTROLFILE                                             --列出数据库中所有控制文件的名字及状态信息

V$CONTROLFILE_RECORD_SECTION     --列出控制文件中记录的部分信息

V$PARAMETER                                                 --列出所有参数的位置及状态信息

sys@orcl > SELECT * FROM v$controlfile;

sys@orcl>SELECT * FROMv$controlfile_record_section;

sys@orcl>SELECT name, type, value FROMv$parameter WHERE name LIKE 'control_f%';

3.通过操作系统命令查看控制文件的具体内容

[oracle@db ~]$ strings$ORACLE_BASE/oradata/orcl/control01.ctl | more

4.查看控制文件当前的版本号

sys@orcl>SELECT controlfile_sequence#FROM v$database;

 

三 控制文件的管理

一个数据库可以包含多个控制文件,它们的文件内容是一致的。如果多个数据文件不一致,则数据库启动时会报错。控制文件应该通过硬件实现多路复用。控制文件的个数和位置可通过spfile或pfile进行修改。

1.通过spfile尽心修改的步骤如下:

(1)修改spfile中的参数control_files,alter systemset control_files=’file_path/control01.ctl’, ’file_path/control02.ctl’scope=spfile

(2)一致性关闭数据库

(3)使用操作系统命名增加或删除数据文件(cp/mv/rm)

(4)使用spfile启动数据库

(5)查看数据库是否正常启动

 

2.通过pfile进行修改的补助如下:

(1)通过操作系统命令(如vi)修改pfile中的参数*.control_files=’file_path/control01.ctl’,’file_path/control02.ctl’

(2)一致性关闭数据库

(3)使用操作系统命名增加或删除数据文件(cp/mv/rm)

(4)使用pfile启动数据库

(5)查看数据库是否正常启动

 

四 控制文件的备份

控制文件可以通过热备份或者RMAN备份的方式进行备份。

1.热备份

alter database backup controlfile to ‘<file>’;                          --热备控制文件

alter database backup controlfile to trace as ‘<file>’;          --备份控制文件的建立脚本

例如:

-- 备份控制文件到文件系统,用于归档模式下的控制文件恢复sys@orcl>alter database backup controlfile to '$ORACLE_BASE/backup/control.bak.ctl';-- 备份控制文件的创建语句到文件系统sys@orcl>alter database backup controlfile to trace as '$ORACLE_BASE/backup/control.sql';

2.RMAN备份控制文件

backup current controlfile;                                             --备份当前的控制文件

backup database include current controlfile;            --备份当前数据库及控制文件

configure controlfile autobackup on;                           --设置自动备份控制文件

例如:

-- 启动RMAN[oracle@db ~]$ rmanRecovery Manager: Release 11.2.0.1.0 - Production on Sun Feb 23 09:41:52 2014Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.-- 连接到目标数据库RMAN> connect target /;connected to target database: ORCL (DBID=1364371964)-- 备份控制文件RMAN> backup current controlfile;Starting backup at 23-FEB-14using target database control file instead of recovery catalogallocated channel: ORA_DISK_1channel ORA_DISK_1: SID=21 device type=DISKchannel ORA_DISK_1: starting full datafile backup setchannel ORA_DISK_1: specifying datafile(s) in backup setincluding current control file in backup setchannel ORA_DISK_1: starting piece 1 at 23-FEB-14channel ORA_DISK_1: finished piece 1 at 23-FEB-14piece handle=/u01/app/oracle/flash_recovery_area/ORCL/backupset/2014_02_23/o1_mf_ncnnf_TAG20140223T094340_9jlnlfnn_.bkp tag=TAG20140223T094340 comment=NONEchannel ORA_DISK_1: backup set complete, elapsed time: 00:00:01Finished backup at 23-FEB-14-- 备份数据库及控制文件,数据库需要处于archivelog模式下RMAN> backup database include current controlfile;Starting backup at 23-FEB-14using target database control file instead of recovery catalogallocated channel: ORA_DISK_1channel ORA_DISK_1: SID=142 device type=DISKchannel ORA_DISK_1: starting full datafile backup setchannel ORA_DISK_1: specifying datafile(s) in backup setinput datafile file number=00001 name=/u01/app/oracle/oradata/orcl/system01.dbfinput datafile file number=00002 name=/u01/app/oracle/oradata/orcl/sysaux01.dbfinput datafile file number=00003 name=/u01/app/oracle/oradata/orcl/undotbs01.dbfinput datafile file number=00005 name=/u01/app/oracle/oradata/orcl/example01.dbfinput datafile file number=00004 name=/u01/app/oracle/oradata/orcl/users01.dbfchannel ORA_DISK_1: starting piece 1 at 23-FEB-14channel ORA_DISK_1: finished piece 1 at 23-FEB-14piece handle=/u01/app/oracle/flash_recovery_area/ORCL/backupset/2014_02_23/o1_mf_nnndf_TAG20140223T095613_9jlo9y7y_.bkp tag=TAG20140223T095613 comment=NONEchannel ORA_DISK_1: backup set complete, elapsed time: 00:01:45channel ORA_DISK_1: starting full datafile backup setchannel ORA_DISK_1: specifying datafile(s) in backup setincluding current control file in backup setincluding current SPFILE in backup setchannel ORA_DISK_1: starting piece 1 at 23-FEB-14channel ORA_DISK_1: finished piece 1 at 23-FEB-14piece handle=/u01/app/oracle/flash_recovery_area/ORCL/backupset/2014_02_23/o1_mf_ncsnf_TAG20140223T095613_9jlof8l7_.bkp tag=TAG20140223T095613 comment=NONEchannel ORA_DISK_1: backup set complete, elapsed time: 00:00:01Finished backup at 23-FEB-14-- 查看当前的RMAN 参数设定RMAN> show all;RMAN configuration parameters for database with db_unique_name ORCL are:CONFIGURE RETENTION POLICY TO REDUNDANCY 1;CONFIGURE BACKUP OPTIMIZATION OFF;CONFIGURE DEFAULT DEVICE TYPE TO DISK;CONFIGURE CONTROLFILE AUTOBACKUP OFF;  -- 默认自动备份控制文件为关闭状态CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '%F';CONFIGURE DEVICE TYPE DISK PARALLELISM 1 BACKUP TYPE TO BACKUPSET;CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1;CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE DISK TO 1;CONFIGURE MAXSETSIZE TO UNLIMITED;CONFIGURE ENCRYPTION FOR DATABASE OFF;CONFIGURE ENCRYPTION ALGORITHM 'AES128';CONFIGURE COMPRESSION ALGORITHM 'BASIC' AS OF RELEASE 'DEFAULT' OPTIMIZE FOR LOAD TRUE;CONFIGURE ARCHIVELOG DELETION POLICY TO NONE;CONFIGURE SNAPSHOT CONTROLFILE NAME TO '/u01/app/oracle/product/11.20.1/db_1/dbs/snapcf_orcl.f';-- 设置开启RMAN自动备份控制文件RMAN> CONFIGURE CONTROLFILE AUTOBACKUP ON;old RMAN configuration parameters:CONFIGURE CONTROLFILE AUTOBACKUP OFF;new RMAN configuration parameters:CONFIGURE CONTROLFILE AUTOBACKUP ON;new RMAN configuration parameters are successfully stored

五 控制文件的缺失恢复

1.丢失多个控制文件中的一个或多个

缺失多个控制文件中的一个或多个,数据库启动时会报ORA-00205错误,导致数据库无法启动,如下:

idle>startupORACLE instance started.Total System Global Area 1050411008 bytesFixed Size                  1341168 bytesVariable Size             641730832 bytesDatabase Buffers          402653184 bytesRedo Buffers                4685824 bytesORA-00205: error in identifying control file, check alert log for more info-- 查看警告日志的位置,一般在数据库参数background_dump_dest指定的目录下idle>show parameter dumpNAME                                               TYPE           VALUE------------------------------------               -----------    ------------------------------background_core_dump                               string         partialbackground_dump_dest                               string         /u01/app/oracle/diag/rdbms/orcl/orcl/tracecore_dump_dest                                     string         /u01/app/oracle/diag/rdbms/orc l/orcl/cdumpmax_dump_file_size                                 string         unlimitedshadow_core_dump                                   string         partialuser_dump_dest                                     string         /u01/app/oracle/diag/rdbms/orc l/orcl/trace-- 查看警告日志中的错误信息,找不到控制文件[oracle@db trace]$ tail -f alert_orcl.logSun Feb 23 10:08:13 2014ALTER DATABASE   MOUNTORA-00210: cannot open the specified control fileORA-00202: control file: '/u01/app/oracle/flash_recovery_area/orcl/control02.ctl'ORA-27037: unable to obtain file statusLinux Error: 2: No such file or directoryAdditional information: 3ORA-205 signalled during: ALTER DATABASE   MOUNT...Sun Feb 23 10:08:14 2014Checker run found 1 new persistent data failures

出现这种情况时,有两种简单的修复办法:

(1)拷贝存在的控制文件到丢失的控制文件,例如

-- 拷贝当前存在的控制文件到丢失的控制文件idle>host cp /u01/app/oracle/oradata/orcl/control01.ctl /u01/app/oracle/flash_recovery_area/orcl/control02.ctl-- 挂载数据库idle>alter database mount;Database altered.-- 启动数据库idle>alter database open;Database altered.

(2)修改spfile中的参数control_files的值,去除丢失的参数文件的路径,例如:

idle>alter system set control_files = '/u01/app/oracle/oradata/orcl/control01.ctl' scope = spfile;idle>startup forceORACLE instance started.Total System Global Area 1050411008 bytesFixed Size                  1341168 bytesVariable Size             641730832 bytesDatabase Buffers          402653184 bytesRedo Buffers                4685824 bytesDatabase mounted.Database opened.

2.控制文件的版本号不同

当数据中存在多个版本不同的控制文件时,数据库会报ORA-00214错误,可以通过用版本号高的控制文件覆盖版本号低的控制文件使问题得到解决,例如:

idle>startupORACLE instance started.Total System Global Area 1050411008 bytesFixed Size                  1341168 bytesVariable Size             641730832 bytesDatabase Buffers          402653184 bytesRedo Buffers                4685824 bytesORA-00214: control file '/u01/app/oracle/oradata/orcl/control01.ctl' version 1173 inconsistent withfile '/u01/app/oracle/flash_recovery_area/orcl/control02.ctl' version 1169-- 用版本高的控制文件覆盖版本低的控制文件idle>ho cp /u01/app/oracle/oradata/orcl/control01.ctl /u01/app/oracle/flash_recovery_area/orcl/control02.ctlidle>alter database mount;Database altered.idle>alter database open;Database altered.


3.丢失全部控制文件

(1)重建控制文件恢复数据文件

重建控制文件需要搞清楚如下问题:控制文件的参数设定,日志文件的大小和位置,数据文件的位置,数据库的字符编码集。搞清楚这些问题之后,可以通过重建控制文件语句创建控制文件。例如:

-- 缺失控制文件,启动数据库报ORA-00205错误,数据库处于nomount阶段idle>startupORACLE instance started.Total System Global Area 1050411008 bytesFixed Size                  1341168 bytesVariable Size             641730832 bytesDatabase Buffers          402653184 bytesRedo Buffers                4685824 bytesORA-00205: error in identifying control file, check alert log for more info-- 查询控制文件的位置idle>show parameter control_filesNAME                          TYPE         VALUE--------------------------    -----------  -----------------------------------------------------------------------------------------------------------control_files                 string       /u01/app/oracle/oradata/orcl/control01.ctl,                                            /u01/app/oracle/flash_recovery_area/orcl/control02.ctl-- 验证控制文件是否存在idle>ho ls /u01/app/oracle/oradata/orcl/control01.ctlls: 无法访问/u01/app/oracle/oradata/orcl/control01.ctl: 没有那个文件或目录idle>ho ls /u01/app/oracle/flash_recovery_area/orcl/control02.ctlls: 无法访问/u01/app/oracle/flash_recovery_area/orcl/control02.ctl: 没有那个文件或目录-- 文件不存在,创建控制文件idle>CREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS  NOARCHIVELOG    MAXLOGFILES 16    MAXLOGMEMBERS 3    MAXDATAFILES 100    MAXINSTANCES 8    MAXLOGHISTORY 292LOGFILE  GROUP 1 '/u01/app/oracle/oradata/orcl/redo01.log'  SIZE 50M BLOCKSIZE 512,  GROUP 2 '/u01/app/oracle/oradata/orcl/redo02.log'  SIZE 50M BLOCKSIZE 512,  GROUP 3 '/u01/app/oracle/oradata/orcl/redo03.log'  SIZE 50M BLOCKSIZE 512DATAFILE  '/u01/app/oracle/oradata/orcl/system01.dbf',  '/u01/app/oracle/oradata/orcl/sysaux01.dbf',  '/u01/app/oracle/oradata/orcl/undotbs01.dbf',  '/u01/app/oracle/oradata/orcl/users01.dbf',  '/u01/app/oracle/oradata/orcl/example01.dbf'CHARACTER SET AL32UTF8;Control file created.-- 创建数据文件后,数据库自动进入到mount阶段,此时启动数据库会报错idle>alter database open;alter database open*ERROR at line 1:ORA-01113: file 1 needs media recoveryORA-01110: data file 1: '/u01/app/oracle/oradata/orcl/system01.dbf'-- 先恢复数据库idle>RECOVER DATABASE;Media recovery complete.-- 然后将数据库调整到open阶段idle>ALTER DATABASE OPEN;Database altered.-- 为临时表空间添加数据文件sys@orcl>ALTER TABLESPACE TEMP ADD TEMPFILE '/u01/app/oracle/oradata/orcl/temp01.dbf'           SIZE 30408704  REUSE AUTOEXTEND ON NEXT 655360  MAXSIZE 32767M;

(2)利用备份的控制文件恢复

如果数据库有备份的控制文件,控制文件丢失前数据库处于归档模式下,且在线重做日志文件可用,则可通过以下方式恢复数据库:

-- 拷贝备份的控制文件到丢失的控制文件的位置并重命名idle>host cp /u01/app/oracle/backup/control.bak.ctl/u01/app/oracle/oradata/orcl/control01.ctlidle>host cp /u01/app/oracle/backup/control.bak.ctl/u01/app/oracle/flash_recovery_area/orcl/control02.ctl-- 挂载数据库idle>alter database mount;Database altered.-- 打开数据库idle>alter database open;alter database open*ERROR at line 1:ORA-01589: must use RESETLOGS or NORESETLOGS option for databaseopenidle>ALTER DATABASE OPEN NORESETLOGS;ALTER DATABASE OPEN NORESETLOGS*ERROR at line 1:ORA-01610: recovery using the BACKUP CONTROLFILE option must be done-- 使用备份的控制文件恢复数据库idle>RECOVER DATABASE USING BACKUPCONTROLFILEORA-00279: change 1073537 generated at 02/24/2014 21:19:19 neededfor thread 1ORA-00289: suggestion :/u01/app/oracle/flash_recovery_area/ORCL/archivelog/2014_02_24/o1_mf_1_10_%u_.arcORA-00280: change 1073537 for thread 1 is in sequence #10-- 手动输入redo日志的文字,依次试验每个日志组Specify log: {<RET>=suggested | filename | AUTO | CANCEL}/u01/app/oracle/oradata/orcl/redo01.logLog applied.-- 数据库恢复完成Media recovery complete.-- 打开数据库,重置联机重做日志idle>ALTER DATABASE OPEN RESETLOGS;Database altered.

(3)利用隐藏参数打开数据库

如果有备份的控制文件,但是在线重做日志文件丢失,则可利用隐藏参数_allow_resetlogs_corruption取消一致性验证打开数据库,此时可能会丢失数据。

-- 设置隐藏参数,关闭一致性验证idle>alter system set "_allow_resetlogs_corruption" = true scope = spfile;System altered.-- 打开数据库,重置联机重做日志idle>ALTER DATABASE OPEN RESETLOGS;Database altered.-- 重置隐藏参数idle>alter system reset "_allow_resetlogs_corruption";System altered.


0 0
原创粉丝点击