控制文件(Control File)是Oracle运行和工作的心脏。在Oracle运行过程中,需要实时借助控制文件来记录、响应关键信息。在控制文件中,Oracle保存了包括数据和日志文件名称位置、备份元数据信息、系统SCN信息。
鉴于控制文件的重要性,Oracle也采用最重要的保护级别,如在线多路冗余、自动备份功能。应该说,在合理规划、配置的情况下,online control file出现故障不可恢复的场景,应该说是很少的。
本篇目的在于实验如何在控制文件损坏,利用trace文件格式备份恢复数据库。中间的操作步骤权当记录。
1、实验故障环境准备
我们选择10gR2进行实验,系统处于归档模式下,相关参数正常。
SQL> select name from v$database;
NAME
---------
ORA10GL
SQL> show parameter control
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
control_file_record_keep_time integer 7
control_files string /u01/app/oracle/oradata/ORA10GL/controlfile/o1_mf_8brvwzwc_.ctl, /u01/app/oracle/flash_recovery_area/ORA10GL/controlfile/o1_mf_8brvx088_.ctl
SQL> archive log list
Database log mode Archive Mode
Automatic archival Enabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 5
Next log sequence to archive 7
Current log sequence 7
SQL>
此处注意控制文件参数control_files,这个参数是配置在spfile/pfile中。在nomount阶段,Oracle首先会读取参数文件(spfile/pfile),用于创建后台实例,读取的control_files参数就是定位mount阶段时候控制文件的依据。控制文件完整性对于mount阶段很重要,mount需要定位的数据文件、日志文件信息都是写在控制文件中的。同时,在open的阶段,控制文件中的SCN一致性信息,是进行完整性检查和实例恢复(Instance Recovery)的依据。
我们首先准备出一份备份控制文件,主要通过backup to trace的方法。
SQL> show parameter dump
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
background_core_dump string partial
background_dump_dest string /u01/app/oracle/admin/ora10gl/bdump
core_dump_dest string /u01/app/oracle/admin/ora10gl/cdump
max_dump_file_size string UNLIMITED
shadow_core_dump string partial
user_dump_dest string /u01/app/oracle/admin/ora10gl/udump
SQL> alter database backup controlfile to trace;
Database altered
我们可以在user_dump_dest中找到生成的trace文件。
[oracle@bspdev udump]$ pwd
/u01/app/oracle/admin/ora10gl/udump
[oracle@bspdev udump]$ ls -l
total 8
-rw-r----- 1 oracle oinstall 7802 Feb 20 14:38 ora10gl_ora_2691.trc
在文本化的trace文件中,我们可以找到Oracle替我们生成的恢复trace文件语句和建议步骤。
篇幅原因,就不一一将其中内容罗列在本文中。control file跟踪文件备份中可以分为两个部分,NORESETLOG和RESETLOG模式。两者区别就在于是否截取online日志。在每个部分,都包括了创建control file的语句和恢复步骤,非常完全。
下面我们关闭数据库,注意:要实现完全关闭,不能是abort方式。之后破坏控制文件。
--关闭数据库
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
--破坏处理
[oracle@bspdev udump]$ cd /u01/app/oracle/oradata/ORA10GL/controlfile/
[oracle@bspdev controlfile]$ ls -l
total 6908
-rw-r----- 1 oracle oinstall 7061504 Feb 20 14:47 o1_mf_8brvwzwc_.ctl
[oracle@bspdev controlfile]$ mv o1_mf_8brvwzwc_.ctl o1_mf_8brvwzwc_.ctl.bk
[oracle@bspdev controlfile]$ cd /u01/app/oracle/flash_recovery_area/ORA10GL/controlfile/
[oracle@bspdev controlfile]$ ls -l
total 6908
-rw-r----- 1 oracle oinstall 7061504 Feb 20 14:47 o1_mf_8brvx088_.ctl
[oracle@bspdev controlfile]$ mv o1_mf_8brvx088_.ctl o1_mf_8brvx088_.ctl.bk
注意,原有数据库的control file管理方式是OMF外加OFA。两个控制文件互为冗余备份,一个在OFA目录,另一个recovery area中。
2、恢复控制文件过程
我们首先启动数据库到nomount状态。
SQL> startup nomount
ORACLE instance started.
Total System Global Area 285212672 bytes
Fixed Size 1218992 bytes
Variable Size 109053520 bytes
Database Buffers 171966464 bytes
Redo Buffers 2973696 bytes
SQL> show parameter control
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
control_file_record_keep_time integer 7
control_files string /u01/app/oracle/oradata/ORA10G
L/controlfile/o1_mf_8brvwzwc_.
ctl, /u01/app/oracle/flash_rec
overy_area/ORA10GL/controlfile
/o1_mf_8brvx088_.ctl
成功的进入nomount状态,control_files正式配置。
注意:如果是使用OMF方式的控制文件,也就是Oracle来负责文件的命名。我们是不能直接进行create control file的语句执行的。所以,解决方法是在nomount阶段修改control_files参数到一个合理的取值。
如果不是OMF方式,就可以进行下一步创建control file了。
SQL> alter system set control_files='/u01/app/oracle/oradata/ORA10GL/controlfile/control01.ctl' scope=spfile;
System altered.
SQL> shutdown immediate;
ORA-01507: database not mounted
ORACLE instance shut down.
SQL> startup nomount
ORACLE instance started.
Total System Global Area 285212672 bytes
Fixed Size 1218992 bytes
Variable Size 109053520 bytes
Database Buffers 171966464 bytes
Redo Buffers 2973696 bytes
SQL> show parameter control_files
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
control_files string /u01/app/oracle/oradata/ORA10G
L/controlfile/control01.ctl
下面创建control file。
SQL> CREATE CONTROLFILE REUSE DATABASE "ORA10GL" NORESETLOGS ARCHIVELOG
2 MAXLOGFILES 16
3 MAXLOGMEMBERS 3
4 MAXDATAFILES 100
5 MAXINSTANCES 8
6 MAXLOGHISTORY 292
7 LOGFILE
8 GROUP 1 (
9 '/u01/app/oracle/oradata/ORA10GL/onlinelog/o1_mf_1_8brvx1mo_.log',
10 '/u01/app/oracle/flash_recovery_area/ORA10GL/onlinelog/o1_mf_1_8brvx3s1_.log'
11 ) SIZE 50M,
12 GROUP 2 (
13 '/u01/app/oracle/oradata/ORA10GL/onlinelog/o1_mf_2_8brvx94v_.log',
14 '/u01/app/oracle/flash_recovery_area/ORA10GL/onlinelog/o1_mf_2_8brvxc8g_.log'
15 ) SIZE 50M,
16 GROUP 3 (
17 '/u01/app/oracle/oradata/ORA10GL/onlinelog/o1_mf_3_8brvxfk5_.log',
18 '/u01/app/oracle/flash_recovery_area/ORA10GL/onlinelog/o1_mf_3_8brvxhkc_.log'
19 ) SIZE 50M
20 -- STANDBY LOGFILE
21 DATAFILE
22 '/u01/app/oracle/oradata/ORA10GL/datafile/o1_mf_system_8brvr0gf_.dbf',
23 '/u01/app/oracle/oradata/ORA10GL/datafile/o1_mf_undotbs1_8brvr10h_.dbf',
24 '/u01/app/oracle/oradata/ORA10GL/datafile/o1_mf_sysaux_8brvr0j3_.dbf',
25 '/u01/app/oracle/oradata/ORA10GL/datafile/o1_mf_users_8brvr12n_.dbf'
26 CHARACTER SET AL32UTF8
27 ;
Control file created.
注意上面代码,里面没有Temp文件和表空间的信息。之后按照控制文件的提示选择适当的语句执行。
SQL> VARIABLE RECNO NUMBER;
SQL> EXECUTE :RECNO := SYS.DBMS_BACKUP_RESTORE.SETCONFIG('CONTROLFILE AUTOBACKUP','ON');
PL/SQL procedure successfully completed.
SQL> recover database;
ORA-00283: recovery session canceled due to errors
ORA-00264: no recovery required
SQL> alter system archive log all;
System altered.
SQL> alter database open;
Database altered.
SQL> ALTER TABLESPACE TEMP ADD TEMPFILE '/u01/app/oracle/oradata/ORA10GL/datafile/o1_mf_temp_8brvy20c_.tmp'
2 SIZE 20971520 REUSE AUTOEXTEND ON NEXT 655360 MAXSIZE 32767M;
Tablespace altered.
恢复结束。
3、验证恢复和潜在问题
成功open数据库之后,我们需要验证结果。
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 6
Next log sequence to archive 8
Current log sequence 8
归档状态正常。控制文件一个重要作用就是保存备份集信息,之前数据库中有备份集,我们查看一下。
RMAN> list backup;
List of Backup Sets
===================
BS Key Type LV Size Device Type Elapsed Time Completion Time
------- ---- -- ---------- ----------- ------------ ---------------
1 Full 7.11M DISK 00:00:07 20-FEB-13
BP Key: 1 Status: AVAILABLE Compressed: NO Tag: TAG20130220T150218
Piece Name: /u01/app/oracle/flash_recovery_area/ORA10GL/autobackup/2013_02_20/o1_mf_s_807894138_8l8x7y1j_.bkp
Control File Included: Ckp SCN: 545929 Ckp time: 20-FEB-13
SPFILE Included: Modification time: 20-FEB-13
有一份备份集合,但是并不是我们所说的control file恢复之前的备份集。而是open数据库之后,我们重建Temp文件信息之后,由于设置了autobackup策略产生的备份。
那么,文件系统中还有这些集合。
[oracle@bspdev backupset]$ cd 2012_11_22/
[oracle@bspdev 2012_11_22]$ ls -l
total 575008
-rw-r----- 1 oracle oinstall 30759936 Nov 22 08:29 o1_mf_annnn_TAG20121122T082929_8btwhbsx_.bkp
-rw-r----- 1 oracle oinstall 4096 Nov 22 08:30 o1_mf_annnn_TAG20121122T083020_8btwjxb0_.bkp
-rw-r----- 1 oracle oinstall 557457408 Nov 22 08:30 o1_mf_nnndf_TAG20121122T082934_8btwhgn2_.bkp
我们的方法虽然可以恢复控制文件,但是会丢失备份数据信息。那么,我们如何在re-create控制文件的时候还能保存住备份信息呢?在下篇,我们继续讨论介绍。