測試恢復5==使用2進位制形式檔案恢復控制檔案

oracle_db發表於2012-04-26
先看一下當向表中插入一條資料以後,資料存放在那裡
會話1:
先生成1條測試資料
SQL> show user;
USER is "QQ1"
SQL> create table t2 (id int,name char(10)) tablespace qq;

Table created.

SQL> insert into t2 values(0,'testdata');

1 row created.

SQL> 

在沒提交的情況下這條資料在那呢?它在記憶體裡,磁碟上是沒有這條記錄的。它實際上存放在BUFFER CACHE中。當提交以後資料應該放在ONLINE REDO LOG FILE中。
我們可以在聯機重做日誌中查到提交的資料像這樣
[oracle@oraclelinux dbtest]$ strings redo04.log |grep testdata
[oracle@oraclelinux dbtest]$ 
會話2:檢視當前正在使用那一組聯機重做日誌。
SQL> select group#,status from v$log;

    GROUP# STATUS
---------- ----------------
         1 INACTIVE
         2 INACTIVE
         3 INACTIVE
         4 CURRENT

SQL> select group#,member from v$logfile;

    GROUP# MEMBER
---------- --------------------------------------------------
         3 /u01/oradata/dbtest/redo03.log
         2 /u01/oradata/dbtest/redo02.log
         1 /u01/oradata/dbtest/redo01.log
         4 /u01/oradata/dbtest/redo04.log

SQL> 
看到當前REDO04.LOG是當前正在用的聯機重做日誌組

會話1把資料提交後在檢視REDO04.LOG中是否有相應記錄寫進來,在10G中測試不用你提交,它自己就寫到聯機日誌檔案中!
SQL> insert into t2 values (1,'testdata');

1 row created.

SQL> commit;

Commit complete.

SQL> 
另一個會話檢視資料在聯機日誌中
[oracle@oraclelinux dbtest]$ strings redo04.log |grep testdata
testdata  
[oracle@oraclelinux dbtest]$ 
理論上這個時候資料也沒寫到資料檔案和聯機日誌檔案中,但是在10G中看到資料已經在資料檔案上了,也許是隱式提交了,不懂。。。

[oracle@oraclelinux dbtest]$ strings qq01.dbf |grep testdata
testdata  
[oracle@oraclelinux dbtest]$ 
這個時候手動歸檔alter system switch lofile,之後檢視剛插入的記錄跑到這裡來沒有。
[oracle@oraclelinux 2012_04_26]$ ll
total 41496
-rw-r-----  1 oracle oinstall 21413888 Apr 26 10:11 o1_mf_1_53_7skcppkm_.arc
-rw-r-----  1 oracle oinstall  1565184 Apr 26 10:59 o1_mf_1_54_7skgjqyf_.arc
-rw-r-----  1 oracle oinstall   825856 Apr 26 11:01 o1_mf_1_55_7skgmvm2_.arc
-rw-r-----  1 oracle oinstall     1024 Apr 26 11:01 o1_mf_1_56_7skgn9cp_.arc
-rw-r-----  1 oracle oinstall   489984 Apr 26 11:25 o1_mf_1_57_7skj11s9_.arc
-rw-r-----  1 oracle oinstall     1536 Apr 26 11:26 o1_mf_1_58_7skj2sn1_.arc
-rw-r-----  1 oracle oinstall     1536 Apr 26 16:30 o1_mf_1_58_7sl1xww5_.arc
-rw-r-----  1 oracle oinstall     4608 Apr 26 11:26 o1_mf_1_59_7skj3oqc_.arc
-rw-r-----  1 oracle oinstall     4608 Apr 26 16:30 o1_mf_1_59_7sl1xz1f_.arc
-rw-r-----  1 oracle oinstall  5625856 Apr 26 15:28 o1_mf_1_60_7sky9jxb_.arc
-rw-r-----  1 oracle oinstall  5625856 Apr 26 16:30 o1_mf_1_60_7sl1y0f9_.arc
-rw-r-----  1 oracle oinstall   531456 Apr 26 16:31 o1_mf_1_61_7sl1y8y0_.arc
-rw-r-----  1 oracle oinstall  6222848 Apr 26 21:55 o1_mf_1_62_7slnz8lt_.arc
-rw-r-----  1 oracle oinstall     5120 Apr 26 21:56 o1_mf_1_63_7slo0hrf_.arc
[oracle@oraclelinux 2012_04_26]$ strings o1_mf_1_62_7slnz8lt_.arc |grep testdata
testdata  
[oracle@oraclelinux 2012_04_26]$ 

總結:以上主要說明,當
提交以後,資料是放在某一個聯機重做日誌中的,當發生檢查點後資料才真正寫到對應資料檔案,當有條件觸犯歸檔時,資料才記錄到歸檔日誌檔案中

==================以下測試控制檔案恢復=========================
測試流程==1.備份當前控制檔案2.建立新表空間,這時候控制檔案發生了變化3.把控制檔案刪除4.用備份的控制檔案進行恢復

會話1:備份當前控制檔案到指定目錄

SQL> show user;
USER is "SYS"
SQL> alter database backup controlfile to '/backup/ctlbackup01.bin';

Database altered.

SQL> 
[oracle@oraclelinux backup]$ ll
total 58516
drwxr-xr-x  3 oracle oinstall     4096 Apr 26 10:35 cold
-rw-r-----  1 oracle oinstall  7389184 Apr 26 22:10 ctlbackup01.bin
drwxr-xr-x  2 oracle oinstall     4096 Apr 26 10:48 hot
-rw-r-----  1 root   root     52436992 Apr 26 11:36 qq01.dbf
[oracle@oraclelinux backup]$ 
會話2:建立新表空間

SQL> show user;
USER is "SYS"
SQL> alter database backup controlfile to '/backup/ctlbackup01.bin';

Database altered.

SQL> select ts#,name from v$tablespace;

       TS# NAME
---------- ------------------------------
         0 SYSTEM
         1 UNDOTBS1
         2 SYSAUX
         4 USERS
         6 EXAMPLE
         7 PAUL
         8 WENCHUAN
         9 QQ
         3 TEMP

9 rows selected.
SQL> create tablespace qq2 datafile '/u01/oradata/dbtest/qq02.dbf' size 10m;

Tablespace created.============【新建表空間就會改變當前資料庫的結構,控制檔案也會發生變化,雖然之前對控制檔案進行了備份,但是它已經不是最新的控制檔案了!】
向新表空間中插入資料。

SQL> create table t4(id int,name char(10)) tablespace qq2;

Table created.

SQL> insert into t4 values (0,'abc');

1 row created.

SQL> commit;

Commit complete.

SQL> 
刪除控制檔案!
[oracle@oraclelinux dbtest]$ rm -f control0*
[oracle@oraclelinux dbtest]$ ll
total 1615556
-rw-r--r--  1 oracle oinstall      1228 Mar 22 21:09 ctl
-rw-r-----  1 oracle oinstall 104865792 Apr 26 22:01 example01.dbf
-rw-r-----  1 oracle oinstall  20979712 Apr 26 22:01 paul01.dbf
-rw-r-----  1 oracle oinstall  52436992 Apr 26 22:21 qq01.dbf
-rw-r-----  1 oracle oinstall  10493952 Apr 26 22:14 qq02.dbf
-rw-r-----  1 oracle oinstall  52429312 Apr 26 21:56 redo01.log
-rw-r-----  1 oracle oinstall  52429312 Apr 26 22:21 redo02.log
-rw-r-----  1 oracle oinstall  52429312 Apr 26 16:30 redo03.log
-rw-r-----  1 oracle oinstall  52429312 Mar 23 14:50 redo04a.log
-rw-r-----  1 oracle oinstall  52429312 Apr 26 21:55 redo04.log
-rw-r-----  1 oracle oinstall 461381632 Apr 26 22:21 sysaux01.dbf
-rw-r-----  1 oracle oinstall 576724992 Apr 26 22:21 system01.dbf
-rw-r-----  1 oracle oinstall  20979712 Apr 25 22:00 temp01.dbf
-rw-r-----  1 oracle oinstall 115351552 Apr 26 22:21 undotbs01.dbf
-rw-r-----  1 oracle oinstall   5251072 Apr 26 22:01 users01.dbf
-rw-r-----  1 oracle oinstall  20979712 Apr 26 22:01 wenchuan01.dbf
-rw-r-----  1 oracle oinstall  20979712 Apr 26 22:01 wenchuan2.dbf
[oracle@oraclelinux dbtest]$ 

會話1:強行關閉資料庫
SQL> conn /as sysdba
Connected.
SQL> shutdown abort;
ORACLE instance shut down.
SQL> 

會話2:RESTORE 控制檔案
[oracle@oraclelinux dbtest]$ cd /backup
[oracle@oraclelinux backup]$ ls
cold  ctlbackup01.bin  hot  qq01.dbf
[oracle@oraclelinux backup]$ cp ctlbackup01.bin /u01/oradata/dbtest/control01.ctl
[oracle@oraclelinux backup]$ cp ctlbackup01.bin /u01/oradata/dbtest/control02.ctl
[oracle@oraclelinux backup]$ cp ctlbackup01.bin /u01/oradata/dbtest/control03.ctl
[oracle@oraclelinux backup]$ 

會話1:把資料庫MOUNT,這個時候雖然MOUNT上了但是控制檔案是用的老的控制檔案,沒有包含新建立的表空間的資訊,怎麼知道控制檔案不是最新的呢?通過V$DATAFILE,V$DATAFILE_HEADER比較SCN號大小,通過時間長一點SCN號才不一樣,如果時間間隔太短這兩個檢視的SCN號是一樣的。。。
SQL> shutdown abort;
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.

Total System Global Area  444596224 bytes
Fixed Size                  1219904 bytes
Variable Size             130024128 bytes
Database Buffers          310378496 bytes
Redo Buffers                2973696 bytes
Database mounted.
SQL> 
SQL> show user;
USER is "SYS"
SQL> select file#,checkpoint_change# from v$datafile;

     FILE# CHECKPOINT_CHANGE#
---------- ------------------
         1            1687880
         2            1687880
         3            1687880
         4            1687880
         5            1687880
         6            1687880
         7            1687880
         8            1687880
         9            1687880

9 rows selected.

SQL> select file#,checkpoint_change# from v$datafile_header;

     FILE# CHECKPOINT_CHANGE#
---------- ------------------
         1            1687880
         2            1687880
         3            1687880
         4            1687880
         5            1687880
         6            1687880
         7            1687880
         8            1687880
         9            1687880

9 rows selected.
這時候開啟資料庫報錯,必然結果因為控制檔案不是最新的,相當於你現在沒有控制檔案。
SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01589: must use RESETLOGS or NORESETLOGS option for database open

下面就要使用備份的控制檔案對它進行RECOVER.
會話1:
SQL> recover database using backup controlfile;
ORA-00279: change 1687880 generated at 04/26/2012 21:56:31 needed for thread 1
ORA-00289: suggestion :
/u01/flash_recovery_area/DBTEST/archivelog/2012_04_26/o1_mf_1_64_%u_.arc
ORA-00280: change 1687880 for thread 1 is in sequence #64


Specify log: {=suggested | filename | AUTO | CANCEL}


SQL> 
恢復的時候它要求我們有歸檔檔案2012_04_26/o1_mf_1_64_%u_.arc來進行恢復,不幸的是在歸檔檔案中沒有這個檔案!

[oracle@oraclelinux 2012_04_26]$ ll
total 41496
-rw-r-----  1 oracle oinstall 21413888 Apr 26 10:11 o1_mf_1_53_7skcppkm_.arc
-rw-r-----  1 oracle oinstall  1565184 Apr 26 10:59 o1_mf_1_54_7skgjqyf_.arc
-rw-r-----  1 oracle oinstall   825856 Apr 26 11:01 o1_mf_1_55_7skgmvm2_.arc
-rw-r-----  1 oracle oinstall     1024 Apr 26 11:01 o1_mf_1_56_7skgn9cp_.arc
-rw-r-----  1 oracle oinstall   489984 Apr 26 11:25 o1_mf_1_57_7skj11s9_.arc
-rw-r-----  1 oracle oinstall     1536 Apr 26 11:26 o1_mf_1_58_7skj2sn1_.arc
-rw-r-----  1 oracle oinstall     1536 Apr 26 16:30 o1_mf_1_58_7sl1xww5_.arc
-rw-r-----  1 oracle oinstall     4608 Apr 26 11:26 o1_mf_1_59_7skj3oqc_.arc
-rw-r-----  1 oracle oinstall     4608 Apr 26 16:30 o1_mf_1_59_7sl1xz1f_.arc
-rw-r-----  1 oracle oinstall  5625856 Apr 26 15:28 o1_mf_1_60_7sky9jxb_.arc
-rw-r-----  1 oracle oinstall  5625856 Apr 26 16:30 o1_mf_1_60_7sl1y0f9_.arc
-rw-r-----  1 oracle oinstall   531456 Apr 26 16:31 o1_mf_1_61_7sl1y8y0_.arc
-rw-r-----  1 oracle oinstall  6222848 Apr 26 21:55 o1_mf_1_62_7slnz8lt_.arc
-rw-r-----  1 oracle oinstall     5120 Apr 26 21:56 o1_mf_1_63_7slo0hrf_.arc
[oracle@oraclelinux 2012_04_26]$ 

63這個歸檔檔案是最新的,這個時候歸檔檔案在那呢?在聯機重做日誌中,因為還來不急歸檔,控制檔案就丟失了,只能這麼想了。。。
SQL> recover database using backup controlfile;
ORA-00283: recovery session canceled due to errors
ORA-01111: name for data file 10 is unknown - rename to correct file
ORA-01110: data file 10: '/u01/oracle/dbs/UNNAMED00010'
ORA-01157: cannot identify/lock data file 10 - see DBWR trace file
ORA-01111: name for data file 10 is unknown - rename to correct file
ORA-01110: data file 10: '/u01/oracle/dbs/UNNAMED00010'


SQL> recover database using backup controlfile;
ORA-00283: recovery session canceled due to errors
ORA-01111: name for data file 10 is unknown - rename to correct file
ORA-01110: data file 10: '/u01/oracle/dbs/UNNAMED00010'
ORA-01157: cannot identify/lock data file 10 - see DBWR trace file
ORA-01111: name for data file 10 is unknown - rename to correct file
ORA-01110: data file 10: '/u01/oracle/dbs/UNNAMED00010'


SQL> recover database using backup controlfile;
ORA-00283: recovery session canceled due to errors
ORA-01111: name for data file 10 is unknown - rename to correct file
ORA-01110: data file 10: '/u01/oracle/dbs/UNNAMED00010'
ORA-01157: cannot identify/lock data file 10 - see DBWR trace file
ORA-01111: name for data file 10 is unknown - rename to correct file
ORA-01110: data file 10: '/u01/oracle/dbs/UNNAMED00010'


SQL> show user;
USER is "SYS"
SQL> shutdown abort;
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.

Total System Global Area  444596224 bytes
Fixed Size                  1219904 bytes
Variable Size             130024128 bytes
Database Buffers          310378496 bytes
Redo Buffers                2973696 bytes
Database mounted.
SQL> recover database using backup controlfile;
ORA-00283: recovery session canceled due to errors
ORA-01111: name for data file 10 is unknown - rename to correct file
ORA-01110: data file 10: '/u01/oracle/dbs/UNNAMED00010'
ORA-01157: cannot identify/lock data file 10 - see DBWR trace file
ORA-01111: name for data file 10 is unknown - rename to correct file
ORA-01110: data file 10: '/u01/oracle/dbs/UNNAMED00010'


SQL> 
杯具 了,多試幾次聯機日誌都報錯,怎麼辦呢?。。。
SQL> col error for a18
SQL> select * from v$recover_file;

     FILE# ONLINE  ONLINE_ ERROR                 CHANGE# TIME
---------- ------- ------- ------------------ ---------- ---------
        10 ONLINE  ONLINE  FILE MISSING                0

SQL> col name format a50
SQL> select file#,name from v$datafile;

     FILE# NAME
---------- --------------------------------------------------
         1 /u01/oradata/dbtest/system01.dbf
         2 /u01/oradata/dbtest/undotbs01.dbf
         3 /u01/oradata/dbtest/sysaux01.dbf
         4 /u01/oradata/dbtest/users01.dbf
         5 /u01/oradata/dbtest/example01.dbf
         6 /u01/oradata/dbtest/paul01.dbf
         7 /u01/oradata/dbtest/wenchuan01.dbf
         8 /u01/oradata/dbtest/wenchuan2.dbf
         9 /u01/oradata/dbtest/qq01.dbf
        10 /u01/oracle/dbs/UNNAMED00010

10 rows selected.

SQL> 
10這個資料檔案的名字是之前沒有建立的。。。之前的資料檔名叫qq02.dbf.這可以在ALERT檔案中去查。在這裡卻變成了這個名字。。。。

下面把它RENAME為正常的檔名
SQL> col error for a18
SQL> select * from v$recover_file;

     FILE# ONLINE  ONLINE_ ERROR                 CHANGE# TIME
---------- ------- ------- ------------------ ---------- ---------
        10 ONLINE  ONLINE  FILE MISSING                0

SQL> col name format a50
SQL> select file#,name from v$datafile;

     FILE# NAME
---------- --------------------------------------------------
         1 /u01/oradata/dbtest/system01.dbf
         2 /u01/oradata/dbtest/undotbs01.dbf
         3 /u01/oradata/dbtest/sysaux01.dbf
         4 /u01/oradata/dbtest/users01.dbf
         5 /u01/oradata/dbtest/example01.dbf
         6 /u01/oradata/dbtest/paul01.dbf
         7 /u01/oradata/dbtest/wenchuan01.dbf
         8 /u01/oradata/dbtest/wenchuan2.dbf
         9 /u01/oradata/dbtest/qq01.dbf
        10 /u01/oracle/dbs/UNNAMED00010

10 rows selected.

SQL> alter database rename file '/u01/oracle/dbs/UNNAMED00010' to '/u01/oradata/dbtest/qq02.dbf'
  2  ;

Database altered.

SQL> select file#,name from v$datafile;

     FILE# NAME
---------- --------------------------------------------------
         1 /u01/oradata/dbtest/system01.dbf
         2 /u01/oradata/dbtest/undotbs01.dbf
         3 /u01/oradata/dbtest/sysaux01.dbf
         4 /u01/oradata/dbtest/users01.dbf
         5 /u01/oradata/dbtest/example01.dbf
         6 /u01/oradata/dbtest/paul01.dbf
         7 /u01/oradata/dbtest/wenchuan01.dbf
         8 /u01/oradata/dbtest/wenchuan2.dbf
         9 /u01/oradata/dbtest/qq01.dbf
        10 /u01/oradata/dbtest/qq02.dbf

10 rows selected.

SQL> 
SQL> recover database using backup controlfile until cancel;
ORA-00279: change 1691320 generated at 04/26/2012 22:14:51 needed for thread 1
ORA-00289: suggestion :
/u01/flash_recovery_area/DBTEST/archivelog/2012_04_26/o1_mf_1_64_%u_.arc
ORA-00280: change 1691320 for thread 1 is in sequence #64


Specify log: {=suggested | filename | AUTO | CANCEL}
/u01/oradata/dbtest/redo01.log
ORA-00310: archived log contains sequence 63; sequence 64 required
ORA-00334: archived log: '/u01/oradata/dbtest/redo01.log'


ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below
ORA-01194: file 1 needs more recovery to be consistent
ORA-01110: data file 1: '/u01/oradata/dbtest/system01.dbf'


SQL> recover database using backup controlfile until cancel;
ORA-00279: change 1691320 generated at 04/26/2012 22:14:51 needed for thread 1
ORA-00289: suggestion :
/u01/flash_recovery_area/DBTEST/archivelog/2012_04_26/o1_mf_1_64_%u_.arc
ORA-00280: change 1691320 for thread 1 is in sequence #64


Specify log: {=suggested | filename | AUTO | CANCEL}
/u01/oradata/dbtest/redo02.log
Log applied.
Media recovery complete.
SQL> 
SQL> alter database open resetlogs;

Database altered.

SQL> 
SQL> conn qq1/qq1
Connected.
SQL> select * from t4;

        ID NAME
---------- --------------------------------------------------
         0 abc

SQL> 
=========================恢復結束============================



總結:
出現10 /u01/oracle/dbs/UNNAMED00010 這樣的資料檔案主要是因為什麼呢?
在RECOVER DATABASE的時候會去從ONLINE REDOLOG和歸檔日誌中去找相關資訊進行恢復,新建立的表空間的資訊也一定在REDO中,或者在歸檔中。當REDO,或者歸檔日誌APPLIED到資料檔案上時發現控制檔案中沒有包含新建立的表空間的資訊,APPLIED到資料檔案的時候因為控制檔案不是最新的原因,導致新表空間對應的資料檔案沒有把相應控制資訊註冊到控制檔案,這個時候ORACLE就不認這個資料檔案,還給他另取了個UNNAMEXXX的名字。這個時候使用RENAME 檔名為正確的檔名,改完了就說資料檔案在控制檔案註冊了,然後在RECOVER

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

相關文章