測試恢復5==使用2進位制形式檔案恢復控制檔案
先看一下當向表中插入一條資料以後,資料存放在那裡
會話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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 同名檔案替換怎麼恢復,恢復同名檔案
- 與控制檔案有關的恢復
- 【RMAN】如果控制檔案損壞那麼如何恢復?恢復控制檔案的方式有哪幾種?
- word怎麼恢復儲存前的檔案,word檔案恢復
- 檔案替換後怎麼恢復,恢復被覆蓋的檔案
- 檔案中勒索恢復
- 剪下後的檔案可以恢復嗎?恢復剪下檔案怎麼辦?
- word自動儲存的檔案怎麼恢復,word檔案恢復
- 與控制檔案有關的恢復(二)
- 剪下的檔案還能恢復嗎,恢復剪貼丟失的檔案
- eclipse 恢復誤刪檔案Eclipse
- RAC控制檔案恢復(三種不同情況)
- [20210225]控制檔案序列號滿的恢復.txt
- qq檔案失效怎麼恢復 qq已失效的檔案能不能恢復
- 360粉碎檔案可以恢復嗎,如何恢復360強力刪除的檔案
- 【/proc/檔案淺析】另類辦法恢復資料檔案和控制檔案
- 12 使用RMAN備份和恢復檔案
- Git恢復刪除的檔案Git
- mysql 透過idb 恢復檔案MySql
- Linux恢復檔案雙手鐧Linux
- 電腦檔案恢復軟體
- uninstall 後的檔案如何恢復
- rman恢復控制檔案的一個小錯誤
- U盤檔案被隱藏怎麼恢復 U盤檔案恢復隱藏的方法
- Oracle使用備份檔案集恢復歸檔日誌Oracle
- 如何使用 testdisk 恢復已刪除的檔案
- 行動硬碟刪除的檔案能恢復嗎,怎麼恢復硬碟刪除的檔案硬碟
- Oracle 檔案意外刪除恢復(Linux)OracleLinux
- ibdata1檔案損壞時恢復InnoDB單表測試
- 隨身碟檔案被隱藏怎麼恢復 隨身碟檔案恢復隱藏的方法
- u盤檔案變成快捷方式怎麼恢復,恢復U盤檔案的五種方法
- XFS檔案系統的備份、恢復、修復
- Linux伺服器資料恢復案例;ocfs2檔案系統資料恢復Linux伺服器資料恢復
- 【伺服器資料恢復】reiserfs檔案系統下RAID5資料恢復案例伺服器資料恢復AI
- 資料恢復新姿勢——通過ibd和frm檔案恢復資料資料恢復
- 【伺服器資料恢復】StorNext檔案系統資料恢復案例伺服器資料恢復
- ps檔案沒儲存怎麼恢復,一鍵恢復看這裡
- 【伺服器資料恢復】5節點Lustre檔案系統RAID5資料恢復案例伺服器資料恢復AI
- git恢復誤刪未提交的檔案Git