控制檔案損壞重建實驗(上)

realkid4發表於2013-02-20

控制檔案(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控制檔案的時候還能儲存住備份資訊呢?在下篇,我們繼續討論介紹。

 

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/17203031/viewspace-754393/,如需轉載,請註明出處,否則將追究法律責任。

相關文章