Oracle Database物理文件之控制文件

一 控制文件简介

控制文件是一个很小的二进制文件(最多能增长到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_f
NAME                                             TYPE               VALUE
------------------------------------             --------------     -----------------------------------------------------------
control_file_record_keep_time                    integer            7
control_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 ~]$ rman
Recovery Manager: Release 11.2.0.1.0 - Production on Sun Feb 23 09:41:52 2014
Copyright (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-14
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=21 device type=DISK
channel ORA_DISK_1: starting full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
including current control file in backup set
channel ORA_DISK_1: starting piece 1 at 23-FEB-14
channel ORA_DISK_1: finished piece 1 at 23-FEB-14
piece handle=/u01/app/oracle/flash_recovery_area/ORCL/backupset/2014_02_23/o1_mf_ncnnf_TAG20140223T094340_9jlnlfnn_.bkp tag=TAG20140223T094340 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:01
Finished backup at 23-FEB-14
-- 备份数据库及控制文件,数据库需要处于archivelog模式下
RMAN> backup database include current controlfile;
Starting backup at 23-FEB-14
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=142 device type=DISK
channel ORA_DISK_1: starting full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
input datafile file number=00001 name=/u01/app/oracle/oradata/orcl/system01.dbf
input datafile file number=00002 name=/u01/app/oracle/oradata/orcl/sysaux01.dbf
input datafile file number=00003 name=/u01/app/oracle/oradata/orcl/undotbs01.dbf
input datafile file number=00005 name=/u01/app/oracle/oradata/orcl/example01.dbf
input datafile file number=00004 name=/u01/app/oracle/oradata/orcl/users01.dbf
channel ORA_DISK_1: starting piece 1 at 23-FEB-14
channel ORA_DISK_1: finished piece 1 at 23-FEB-14
piece handle=/u01/app/oracle/flash_recovery_area/ORCL/backupset/2014_02_23/o1_mf_nnndf_TAG20140223T095613_9jlo9y7y_.bkp tag=TAG20140223T095613 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:01:45
channel ORA_DISK_1: starting full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
including current control file in backup set
including current SPFILE in backup set
channel ORA_DISK_1: starting piece 1 at 23-FEB-14
channel ORA_DISK_1: finished piece 1 at 23-FEB-14
piece handle=/u01/app/oracle/flash_recovery_area/ORCL/backupset/2014_02_23/o1_mf_ncsnf_TAG20140223T095613_9jlof8l7_.bkp tag=TAG20140223T095613 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:01
Finished 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>startup
ORACLE instance started.
Total System Global Area 1050411008 bytes
Fixed Size                  1341168 bytes
Variable Size             641730832 bytes
Database Buffers          402653184 bytes
Redo Buffers                4685824 bytes
ORA-00205: error in identifying control file, check alert log for more info
-- 查看警告日志的位置,一般在数据库参数background_dump_dest指定的目录下
idle>show parameter dump
NAME                                               TYPE           VALUE
------------------------------------               -----------    ------------------------------
background_core_dump                               string         partial
background_dump_dest                               string         /u01/app/oracle/diag/rdbms/orcl/orcl/trace
core_dump_dest                                     string         /u01/app/oracle/diag/rdbms/orc l/orcl/cdump
max_dump_file_size                                 string         unlimited
shadow_core_dump                                   string         partial
user_dump_dest                                     string         /u01/app/oracle/diag/rdbms/orc l/orcl/trace
-- 查看警告日志中的错误信息,找不到控制文件
[oracle@db trace]$ tail -f alert_orcl.log
Sun Feb 23 10:08:13 2014
ALTER DATABASE   MOUNT
ORA-00210: cannot open the specified control file
ORA-00202: control file: '/u01/app/oracle/flash_recovery_area/orcl/control02.ctl'
ORA-27037: unable to obtain file status
Linux Error: 2: No such file or directory
Additional information: 3
ORA-205 signalled during: ALTER DATABASE   MOUNT...
Sun Feb 23 10:08:14 2014
Checker 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 force
ORACLE instance started.
Total System Global Area 1050411008 bytes
Fixed Size                  1341168 bytes
Variable Size             641730832 bytes
Database Buffers          402653184 bytes
Redo Buffers                4685824 bytes
Database mounted.
Database opened.

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

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

idle>startup
ORACLE instance started.
Total System Global Area 1050411008 bytes
Fixed Size                  1341168 bytes
Variable Size             641730832 bytes
Database Buffers          402653184 bytes
Redo Buffers                4685824 bytes
ORA-00214: control file '/u01/app/oracle/oradata/orcl/control01.ctl' version 1173 inconsistent with
file '/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.ctl
idle>alter database mount;
Database altered.
idle>alter database open;
Database altered.


3.丢失全部控制文件

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

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

-- 缺失控制文件,启动数据库报ORA-00205错误,数据库处于nomount阶段
idle>startup
ORACLE instance started.

Total System Global Area 1050411008 bytes
Fixed Size                  1341168 bytes
Variable Size             641730832 bytes
Database Buffers          402653184 bytes
Redo Buffers                4685824 bytes
ORA-00205: error in identifying control file, check alert log for more info
-- 查询控制文件的位置
idle>show parameter control_files
NAME                          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.ctl
ls: 无法访问/u01/app/oracle/oradata/orcl/control01.ctl: 没有那个文件或目录
idle>ho ls /u01/app/oracle/flash_recovery_area/orcl/control02.ctl
ls: 无法访问/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 292
LOGFILE
  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 512
DATAFILE
  '/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 recovery
ORA-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.ctl
idle>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 databaseopen
idle>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 BACKUPCONTROLFILE
ORA-00279: change 1073537 generated at 02/24/2014 21:19:19 neededfor thread 1
ORA-00289: suggestion :
/u01/app/oracle/flash_recovery_area/ORCL/archivelog/2014_02_24/o1_mf_1_10_%u_.arc
ORA-00280: change 1073537 for thread 1 is in sequence #10
-- 手动输入redo日志的文字,依次试验每个日志组
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
/u01/app/oracle/oradata/orcl/redo01.log
Log 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.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值