Decode360's Blog

          業(yè)精于勤而荒于嬉 QQ:150355677 MSN:decode360@hotmail.com

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 ::  :: 管理 ::
            302 隨筆 :: 26 文章 :: 82 評論 :: 0 Trackbacks
          損壞聯(lián)機(jī)日志的恢復(fù)方法
          ?

          1.損壞非當(dāng)前聯(lián)機(jī)日志
          ?
          大家都清楚,聯(lián)機(jī)日志分為當(dāng)前聯(lián)機(jī)日志和非當(dāng)前聯(lián)機(jī)日志,非當(dāng)前聯(lián)機(jī)日志的損壞是比較簡單的,一般通過clear命令就可以解決問題。
          ?
          1、關(guān)閉數(shù)據(jù)庫,刪除重做日志文件
          ?
          SQL> shutdown immediate;
          Database closed.
          Database dismounted.
          ORACLE instance shut down.
          ?
          C:>del D:\oracle\oradata\dodo\REDO03.LOG
          ?
          2、啟動數(shù)據(jù)庫,遇到ORA-00312 or ORA-00313錯誤,如
          ?
          SQL> startup;
          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'

          從這里我們知道日志組3的數(shù)據(jù)文件損壞了
          從報警文件可以看到更詳細(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

          可以知道,該組是非當(dāng)前狀態(tài),而且已經(jīng)歸檔。

          4、用CLEAR命令重建該日志文件

          SQL>alter database clear logfile group?3;

          如果是該日志組還沒有歸檔,則需要用:

          SQL>alter database clear unarchived logfile group?3;

          5、打開數(shù)據(jù)庫,重新備份數(shù)據(jù)庫

          SQL>alter database open;
          ?
          ?
          說明:

          1、如果損壞的是非當(dāng)前的聯(lián)機(jī)日志文件,一般只需要clear就可以重建該日志文件,但是如果該數(shù)據(jù)庫處于歸檔狀態(tài)但該日志還沒有歸檔,就需要強(qiáng)行clear。
          2、建議clear,特別是強(qiáng)行clear后作一次數(shù)據(jù)庫的全備份
          3、此方法適用于歸檔與非歸檔數(shù)據(jù)庫
          ?
          ?

          2.損壞當(dāng)前聯(lián)機(jī)日志

          歸檔模式下當(dāng)前日志的損壞有兩種情況:
          ?
          一、是數(shù)據(jù)庫是正常關(guān)閉,日志文件中沒有未決的事務(wù)需要實(shí)例恢復(fù),當(dāng)前日志組的損壞就可以直接用alter database clear unarchived logfile group n來重建。
          二、是日志組中有活動的事務(wù),數(shù)據(jù)庫需要介質(zhì)恢復(fù),日志組需要用來同步,有兩種補(bǔ)救辦法:
          ??? A. 最好的辦法就是通過不完全恢復(fù),可以保證數(shù)據(jù)庫的一致性,但是這種辦法要求在歸檔方式下,并且有可用的備份
          ??? B. 通過強(qiáng)制性恢復(fù),但是可能導(dǎo)致數(shù)據(jù)庫不一致。
          下面分別用來說明這兩種恢復(fù)方法

          1.通過備份來恢復(fù)
          ?
          1、關(guān)閉數(shù)據(jù)庫,刪除當(dāng)前Logfile,再打開數(shù)據(jù)庫時,遇到一個類似的錯誤

          SQL> shutdown immediate;
          Database closed.
          Database dismounted.
          ORACLE instance shut down.
          ?
          C:>del D:\oracle\oradata\dodo\REDO01.LOG
          ?
          SQL> startup;
          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'

          報警日志中的描述如下:
          ?
          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: 無法打開文件
          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

          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: 無法打開文件
          O/S-Error: (OS 2) 系統(tǒng)找不到指定的文件。

          4、拷貝有效的數(shù)據(jù)庫的全備份,并不完全恢復(fù)數(shù)據(jù)庫
          ?
          可以采用獲取最近的SCN的辦法用until scn恢復(fù)或用until cnacel恢復(fù)
          recover database until cancel

          先選擇auto,盡量恢復(fù)可以利用的歸檔日志,然后重新
          recover database until cancel

          這次輸入cancel,完成不完全恢復(fù),也就是說恢復(fù)兩次。

          SQL> recover database until cancel;
          Auto
          ……
          SQL> recover database until cancel;
          Cancel;

          5、利用alter database open resetlogs打開數(shù)據(jù)庫

          ?
          說明:
          1、這種辦法恢復(fù)的數(shù)據(jù)庫是一致的不完全恢復(fù),會丟失當(dāng)前聯(lián)機(jī)日志中的事務(wù)數(shù)據(jù)
          2、這種方法適合于歸檔數(shù)據(jù)庫并且有可用的數(shù)據(jù)庫全備份。
          3、恢復(fù)成功之后,記得再做一次數(shù)據(jù)庫的全備份。
          4、建議聯(lián)機(jī)日志文件一定要實(shí)現(xiàn)鏡相在不同的磁盤上,避免這種情況的發(fā)生,因?yàn)槿魏螖?shù)據(jù)的丟失對于生產(chǎn)來說都是不容許的。
          ?
          ?
          2.如果沒有備份,進(jìn)行強(qiáng)制性恢復(fù)

          1、打開數(shù)據(jù)庫,會遇到一個類似的錯誤

          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: 無法打開文件
          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

          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: 無法打開文件
          O/S-Error: (OS 2) 系統(tǒng)找不到指定的文件。

          4、把數(shù)據(jù)庫down掉

          SQL>shutdown immediate

          5、在spfile中加入如下參數(shù)

          _allow_resetlogs_corruption=TRUE

          6、重新啟動數(shù)據(jù)庫,利用until cancel恢復(fù)

          SQL>recover database until cancel;
          Cancel

          如果出錯,不再理會,發(fā)出:

          SQL>alter database open resetlogs;

          7、數(shù)據(jù)庫被打開后,馬上執(zhí)行一個full export

          8、shutdown數(shù)據(jù)庫,去掉_all_resetlogs_corrupt參數(shù)

          9、重建庫

          10、import并完成恢復(fù)

          11、建議執(zhí)行一下ANALYZE TABLE ...VALIDATE STRUCTURE CASCADE;
          ?

          說明:

          1、該恢復(fù)方法是沒有辦法之后的恢復(fù)方法,一般情況下建議不要采用,因?yàn)樵摲椒赡軐?dǎo)致數(shù)據(jù)庫的不一致
          2、該方法也丟失數(shù)據(jù),但是丟失的數(shù)據(jù)沒有上一種方法的數(shù)據(jù)多,主要是未寫入數(shù)據(jù)文件的已提交或未提交數(shù)據(jù)。
          3、建議成功后嚴(yán)格執(zhí)行以上的7到11步,完成數(shù)據(jù)庫的檢查與分析
          4、全部完成后做一次數(shù)據(jù)庫的全備份
          5、建議聯(lián)機(jī)日志文件一定要實(shí)現(xiàn)鏡相在不同的磁盤上,避免這種情況的發(fā)生,因?yàn)槿魏螖?shù)據(jù)的丟失對于生產(chǎn)來說都是不容許的。
          ?
          ?




          -The End-

          posted on 2008-12-18 22:37 decode360-3 閱讀(272) 評論(0)  編輯  收藏 所屬分類: DBA
          主站蜘蛛池模板: 比如县| 松滋市| 大荔县| 杭锦旗| 庆城县| 巧家县| 常宁市| 遂川县| 晋城| 万宁市| 呼和浩特市| 合作市| 上蔡县| 凤翔县| 进贤县| 德州市| 仙居县| 信宜市| 营山县| 锦屏县| 吉木萨尔县| 双峰县| 揭西县| 贺州市| 易门县| 文水县| 漳浦县| 龙游县| 乌拉特后旗| 周宁县| 屏东市| 宽城| 麻城市| 福安市| 白河县| 万源市| 阳原县| 永顺县| 中西区| 修文县| 文昌市|