控制文件损坏重建实验(上)

控制文件(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控制文件的时候还能保存住备份信息呢?在下篇,我们继续讨论介绍。

 

 

请使用浏览器的分享功能分享到微信等