Oracle備份/恢復(fù)案例05——LogFile恢復(fù)
一、損壞非當(dāng)前聯(lián)機(jī)日志
?
大家都清楚,聯(lián)機(jī)日志分為當(dāng)前聯(lián)機(jī)日志和非當(dāng)前聯(lián)機(jī)日志,非當(dāng)前聯(lián)機(jī)日志的損壞是比較簡(jiǎn)單的,一般通過(guò)clear命令就可以解決問(wèn)題。
?
1、關(guān)閉數(shù)據(jù)庫(kù),刪除重做日志文件
?
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
Database dismounted.
ORACLE instance shut down.
?
C:>del D:\oracle\oradata\dodo\REDO03.LOG
?
2、啟動(dòng)數(shù)據(jù)庫(kù),遇到ORA-00312 or ORA-00313錯(cuò)誤,如
?
SQL> startup;
ORACLE instance started.
ORACLE instance started.
Total System Global Area? 135338868 bytes
Fixed Size?????????????????? 453492 bytes
Variable Size???????????? 109051904 bytes
Database Buffers?????????? 25165824 bytes
Redo Buffers???????????????? 667648 bytes
Database mounted.
ORA-00313: open failed for members of log group 3 of thread 1
ORA-00312: online log 3 thread 1: 'D:\ORACLE\ORADATA\DODO\REDO03.LOG'
Fixed Size?????????????????? 453492 bytes
Variable Size???????????? 109051904 bytes
Database Buffers?????????? 25165824 bytes
Redo Buffers???????????????? 667648 bytes
Database mounted.
ORA-00313: open failed for members of log group 3 of thread 1
ORA-00312: online log 3 thread 1: 'D:\ORACLE\ORADATA\DODO\REDO03.LOG'
從這里我們知道日志組3的數(shù)據(jù)文件損壞了
從報(bào)警文件可以看到更詳細(xì)的信息
從報(bào)警文件可以看到更詳細(xì)的信息
?
3、查看V$log視圖
?
SQL> select group#,sequence#,archived,status from v$log;
??? GROUP#? SEQUENCE# ARCHIVED?? STATUS
---------- ---------- ---------- -----------
???????? 1????????? 1 NO???????? CURRENT
???????? 2????????? 0 YES??????? UNUSED
???????? 3????????? 0 YES??????? UNUSED
??? GROUP#? SEQUENCE# ARCHIVED?? STATUS
---------- ---------- ---------- -----------
???????? 1????????? 1 NO???????? CURRENT
???????? 2????????? 0 YES??????? UNUSED
???????? 3????????? 0 YES??????? UNUSED
可以知道,該組是非當(dāng)前狀態(tài),而且已經(jīng)歸檔。
4、用CLEAR命令重建該日志文件
SQL>alter database clear logfile group 3;
如果是該日志組還沒(méi)有歸檔,則需要用:
SQL>alter database clear unarchived logfile group 3;
5、打開(kāi)數(shù)據(jù)庫(kù),重新備份數(shù)據(jù)庫(kù)
SQL>alter database open;
?
?
說(shuō)明:
1、如果損壞的是非當(dāng)前的聯(lián)機(jī)日志文件,一般只需要clear就可以重建該日志文件,但是如果該數(shù)據(jù)庫(kù)處于歸檔狀態(tài)但該日志還沒(méi)有歸檔,就需要強(qiáng)行clear。
2、建議clear,特別是強(qiáng)行clear后作一次數(shù)據(jù)庫(kù)的全備份。
3、此方法適用于歸檔與非歸檔數(shù)據(jù)庫(kù)
?
?
二、 損壞當(dāng)前聯(lián)機(jī)日志
歸檔模式下當(dāng)前日志的損壞有兩種情況:
?
一、是數(shù)據(jù)庫(kù)是正常關(guān)閉,日志文件中沒(méi)有未決的事務(wù)需要實(shí)例恢復(fù),當(dāng)前日志組的損壞就可以直接用alter database clear unarchived logfile group n來(lái)重建。
二、是日志組中有活動(dòng)的事務(wù),數(shù)據(jù)庫(kù)需要介質(zhì)恢復(fù),日志組需要用來(lái)同步,有兩種補(bǔ)救辦法:
??? A. 最好的辦法就是通過(guò)不完全恢復(fù),可以保證數(shù)據(jù)庫(kù)的一致性,但是這種辦法要求在歸檔方式下,并且有可用的備份
??? B. 通過(guò)強(qiáng)制性恢復(fù),但是可能導(dǎo)致數(shù)據(jù)庫(kù)不一致。
??? B. 通過(guò)強(qiáng)制性恢復(fù),但是可能導(dǎo)致數(shù)據(jù)庫(kù)不一致。
?
下面分別用來(lái)說(shuō)明這兩種恢復(fù)方法
1.通過(guò)備份來(lái)恢復(fù)
?
1、關(guān)閉數(shù)據(jù)庫(kù),刪除當(dāng)前Logfile,再打開(kāi)數(shù)據(jù)庫(kù)時(shí),遇到一個(gè)類(lèi)似的錯(cuò)誤
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
Database dismounted.
ORACLE instance shut down.
?
C:>del D:\oracle\oradata\dodo\REDO01.LOG
?
SQL> startup;
ORACLE instance started.
ORACLE instance started.
Total System Global Area? 135338868 bytes
Fixed Size?????????????????? 453492 bytes
Variable Size???????????? 109051904 bytes
Database Buffers?????????? 25165824 bytes
Redo Buffers???????????????? 667648 bytes
Database mounted.
ORA-00313: open failed for members of log group 1 of thread 1
ORA-00312: online log 1 thread 1: 'D:\ORACLE\ORADATA\DODO\REDO01.LOG'
Fixed Size?????????????????? 453492 bytes
Variable Size???????????? 109051904 bytes
Database Buffers?????????? 25165824 bytes
Redo Buffers???????????????? 667648 bytes
Database mounted.
ORA-00313: open failed for members of log group 1 of thread 1
ORA-00312: online log 1 thread 1: 'D:\ORACLE\ORADATA\DODO\REDO01.LOG'
報(bào)警日志中的描述如下:
?
ORA-00313: open failed for members of log group 1 of thread 1
ORA-00312: online log 1 thread 1: 'D:\ORACLE\ORADATA\DODO\REDO01.LOG'
ORA-27041: unable to open file
OSD-04002: 無(wú)法打開(kāi)文件
O/S-Error: (OS 2) 系統(tǒng)找不到指定的文件。
ORA-00312: online log 1 thread 1: 'D:\ORACLE\ORADATA\DODO\REDO01.LOG'
ORA-27041: unable to open file
OSD-04002: 無(wú)法打開(kāi)文件
O/S-Error: (OS 2) 系統(tǒng)找不到指定的文件。
?
2、查看V$log,發(fā)現(xiàn)是當(dāng)前日志
?
SQL> select group#,sequence#,archived,status from v$log;
??? GROUP#? SEQUENCE# ARCHIVED?? STATUS
---------- ---------- ---------- ----------------
???????? 1????????? 1 NO???????? CURRENT
???????? 2????????? 0 YES??????? UNUSED
???????? 3????????? 0 YES??????? UNUSED
---------- ---------- ---------- ----------------
???????? 1????????? 1 NO???????? CURRENT
???????? 2????????? 0 YES??????? UNUSED
???????? 3????????? 0 YES??????? UNUSED
3、發(fā)現(xiàn)clear不成功
SQL> alter database clear unarchived logfile group 1;
alter database clear unarchived logfile group 1
*
ERROR at line 1:
ORA-00313: open failed for members of log group 1 of thread 1
ORA-00312: online log 1 thread 1: 'D:\ORACLE\ORADATA\DODO\REDO01.LOG'
ORA-27041: unable to open file
OSD-04002: 無(wú)法打開(kāi)文件
O/S-Error: (OS 2) 系統(tǒng)找不到指定的文件。
*
ERROR at line 1:
ORA-00313: open failed for members of log group 1 of thread 1
ORA-00312: online log 1 thread 1: 'D:\ORACLE\ORADATA\DODO\REDO01.LOG'
ORA-27041: unable to open file
OSD-04002: 無(wú)法打開(kāi)文件
O/S-Error: (OS 2) 系統(tǒng)找不到指定的文件。
4、拷貝有效的數(shù)據(jù)庫(kù)的全備份,并不完全恢復(fù)數(shù)據(jù)庫(kù)
?
可以采用獲取最近的SCN的辦法用until scn恢復(fù)或用until cnacel恢復(fù)
recover database until cancel
先選擇auto,盡量恢復(fù)可以利用的歸檔日志,然后重新
recover database until cancel
這次輸入cancel,完成不完全恢復(fù),也就是說(shuō)恢復(fù)兩次。
SQL> recover database until cancel;
Auto
……
SQL> recover database until cancel;
Cancel;
5、利用alter database open resetlogs打開(kāi)數(shù)據(jù)庫(kù)
?
說(shuō)明:
1、這種辦法恢復(fù)的數(shù)據(jù)庫(kù)是一致的不完全恢復(fù),會(huì)丟失當(dāng)前聯(lián)機(jī)日志中的事務(wù)數(shù)據(jù)
2、這種方法適合于歸檔數(shù)據(jù)庫(kù)并且有可用的數(shù)據(jù)庫(kù)全備份。
3、恢復(fù)成功之后,記得再做一次數(shù)據(jù)庫(kù)的全備份。
4、建議聯(lián)機(jī)日志文件一定要實(shí)現(xiàn)鏡相在不同的磁盤(pán)上,避免這種情況的發(fā)生,因?yàn)槿魏螖?shù)據(jù)的丟失對(duì)于生產(chǎn)來(lái)說(shuō)都是不容許的。
2、這種方法適合于歸檔數(shù)據(jù)庫(kù)并且有可用的數(shù)據(jù)庫(kù)全備份。
3、恢復(fù)成功之后,記得再做一次數(shù)據(jù)庫(kù)的全備份。
4、建議聯(lián)機(jī)日志文件一定要實(shí)現(xiàn)鏡相在不同的磁盤(pán)上,避免這種情況的發(fā)生,因?yàn)槿魏螖?shù)據(jù)的丟失對(duì)于生產(chǎn)來(lái)說(shuō)都是不容許的。
?
?
2.如果沒(méi)有備份,進(jìn)行強(qiáng)制性恢復(fù)
1、打開(kāi)數(shù)據(jù)庫(kù),會(huì)遇到一個(gè)類(lèi)似的錯(cuò)誤
ORA-00313: open failed for members of log group 1 of thread 1
ORA-00312: online log 1 thread 1: 'D:\ORACLE\ORADATA\DODO\REDO01.LOG'
ORA-27041: unable to open file
OSD-04002: 無(wú)法打開(kāi)文件
O/S-Error: (OS 2) 系統(tǒng)找不到指定的文件。
2、查看V$log,發(fā)現(xiàn)是當(dāng)前日志
SQL> select group#,sequence#,archived,status from v$log;
??? GROUP#? SEQUENCE# ARCHIVED?? STATUS
---------- ---------- ---------- ----------------
???????? 1????????? 1 NO???????? CURRENT
???????? 2????????? 0 YES??????? UNUSED
???????? 3????????? 0 YES??????? UNUSED
---------- ---------- ---------- ----------------
???????? 1????????? 1 NO???????? CURRENT
???????? 2????????? 0 YES??????? UNUSED
???????? 3????????? 0 YES??????? UNUSED
3、發(fā)現(xiàn)clear不成功
SQL> alter database clear unarchived logfile group 1;
alter database clear unarchived logfile group 1
*
ERROR at line 1:
ORA-00313: open failed for members of log group 1 of thread 1
ORA-00312: online log 1 thread 1: 'D:\ORACLE\ORADATA\DODO\REDO01.LOG'
ORA-27041: unable to open file
OSD-04002: 無(wú)法打開(kāi)文件
O/S-Error: (OS 2) 系統(tǒng)找不到指定的文件。
*
ERROR at line 1:
ORA-00313: open failed for members of log group 1 of thread 1
ORA-00312: online log 1 thread 1: 'D:\ORACLE\ORADATA\DODO\REDO01.LOG'
ORA-27041: unable to open file
OSD-04002: 無(wú)法打開(kāi)文件
O/S-Error: (OS 2) 系統(tǒng)找不到指定的文件。
4、把數(shù)據(jù)庫(kù)down掉
SQL>shutdown immediate
5、在spfile中加入如下參數(shù)
_allow_resetlogs_corruption=TRUE
6、重新啟動(dòng)數(shù)據(jù)庫(kù),利用until cancel恢復(fù)
SQL>recover database until cancel;
Cancel
如果出錯(cuò),不再理會(huì),發(fā)出:
SQL>alter database open resetlogs;
7、數(shù)據(jù)庫(kù)被打開(kāi)后,馬上執(zhí)行一個(gè)full export
8、shutdown數(shù)據(jù)庫(kù),去掉_all_resetlogs_corrupt參數(shù)
9、重建庫(kù)
10、import并完成恢復(fù)
11、建議執(zhí)行一下ANALYZE TABLE ...VALIDATE STRUCTURE CASCADE;
?
說(shuō)明:
1、該恢復(fù)方法是沒(méi)有辦法之后的恢復(fù)方法,一般情況下建議不要采用,因?yàn)樵摲椒赡軐?dǎo)致數(shù)據(jù)庫(kù)的不一致
2、該方法也丟失數(shù)據(jù),但是丟失的數(shù)據(jù)沒(méi)有上一種方法的數(shù)據(jù)多,主要是未寫(xiě)入數(shù)據(jù)文件的已提交或未提交數(shù)據(jù)。
3、建議成功后嚴(yán)格執(zhí)行以上的7到11步,完成數(shù)據(jù)庫(kù)的檢查與分析
4、全部完成后做一次數(shù)據(jù)庫(kù)的全備份
5、建議聯(lián)機(jī)日志文件一定要實(shí)現(xiàn)鏡相在不同的磁盤(pán)上,避免這種情況的發(fā)生,因?yàn)槿魏螖?shù)據(jù)的丟失對(duì)于生產(chǎn)來(lái)說(shuō)都是不容許的。
?
?
?