(06)重做日誌損壞的恢複

來源:互聯網
上載者:User

       當資料庫做了DML或DDL操作之後,LGWR進程會將這些操作記錄到重做日誌中。

  Oracle最少要包含兩個日誌組。 一個日誌組可以有多個日誌成員,每個成員互為鏡像, 內容完全一致。

      重做日誌損壞嚴重時,會造成資料庫不能開啟或造成運行狀態下的資料庫被中止。特別是當前活動紀錄組因為檔案系統損壞或其它原因

  整個損壞時,恢複會是件非常麻煩的事。

  下面是幾種損壞情況下的恢複方法.

一. 刪除損壞的日誌群組成員

   1.確定出現介質失敗的日誌成員
       SELECT member FROM v$logfile WHERE status='INVALID';
   2.如果介質失敗的日誌成員是當前日誌組的成員,則需要將其變為非當前日誌組
     alter system switch logfile;
   3.刪除損壞的日誌群組成員
       alter database drop logfile member '/u01/app/oracle/oradata/xcldb/REDO1_2.LOG';
   4.增加日誌成員
     alter database add logfile member '/u01/app/oracle/oradata/xcldb/REDO1_3.LOG' to group 組號;

二.非活動紀錄組損壞
  1. open狀態下,非活動的日誌群組成員全部損壞

     直接清除掉損壞的日誌組,使LGWR進程可以繼續。     
     alter database clear unarchived logfile group 組號;
     清除過後,Oracle會重建立日誌組的所有成員。
     要注意的是,因為之前損壞的日誌群組成員沒有被歸檔,所以最好重新做好備份。

  2. close狀態下,非活動(INVALID)的日誌群組成員全部損壞
   可刪除原有日誌組,增加新日誌組
   2.1. alter database add logfile group 新組號
   ('/u01/app/oracle/oradata/xcldb/redo4_1.log',
    '/u01/app/oracle/oradata/xcldb/redo4_2.log') size 10m reuse;
   2.2. alter database drop logfile group 舊組號;
   2.3. alter database open;

三.當前日誌組的所有成員都損壞
   3.1. open狀態下,當前活動的日誌群組成員全部損壞
    必須使用資料檔案備份,歸檔日誌執行基於取消的不完全恢複
    1. SQL>startup mount   
    2. 如果有資料檔案備份,將冷備份的資料檔案還原回去
    3. 執行不完全恢複
       SQL>recover database until cancel
    SQL>cancel
    4.resetlogs方式open資料庫
    SQL>alter database open resetlogs;

   但上面的情況下,很少會有合適的冷備份,可按下面的方法做:
    1. 設定兩個隱含參數: 

       SQL>ALTER SYSTEM SET _allow_resetlogs_corruption=TRUE SCOPE=SPFILE; 

       SQL>ALTER SYSTEM SET _allow_error_simulation=TRUE SCOPE=SPFILE;

        _allow_resetlogs_corruption 跳過檔案頭的一致性檢查,強制啟動資料庫
        _allow_error_simulation     增進scn
       如果使用了隱含參數仍不能開啟的話,就只能再採取其它方法做恢複了。
    2.使用修改過後的pfile來啟動資料庫
       SQL>shutdown immediate
       SQL>startup
       如果有開閃回區,關掉閃回
       SQL>alter database flashback off;
    3. open資料庫
       SQL>alter database open resetlogs;
    4. 此時資料庫的當前日誌仍在被損壞的日誌組上
       強制切換日誌組
       SQL>alter system switch logfile;
       重新查詢日誌狀態,直到日誌組轉到其它日誌組上
       SQL> select a.group#,a.status,b.member from v$log a,v$logfile b where a.group#=b.group#;
    5. 將非當前的已損壞的那個日誌組給刪了
       SQL> alter database drop logfile group 損壞了的組號;
       SQL> alter system switch logfile;
       SQL> alter database add logfile group 新組號
            ('/u01/app/oracle/oradata/xcldb/redo4_1.log',
             '/u01/app/oracle/oradata/xcldb/redo4_2.log') size 10m reuse;
       SQL> alter system switch logfile;
       重新查詢確認下日誌狀態
       SQL> select a.group#,a.status,b.member from v$log a,v$logfile b where a.group#=b.group#;
   6. 經過上面的步驟,資料庫應當已正常了,此時只要把隱含參數拿掉重啟就正式結束恢複了。
      SQL>ALTER SYSTEM SET _allow_resetlogs_corruption=FALSE SCOPE=SPFILE; 
      SQL>ALTER SYSTEM SET _allow_error_simulation=FALSE SCOPE=SPFILE;
      SQL>shutdown immediate
      SQL>startup
 
   3.2. close狀態下,當前活動的日誌群組成員全部損壞
  因為是關閉狀態,資料檔案,控制檔案等都處於完全一致的狀態 
    SQL>recover database until cancel
    SQL>alter database open resetlogs;
 
  resetlogs 選項開啟資料庫後,會重建所有日誌成員,並且過去

  的備份不能直接使用,所以需重新備份所有資料檔案和控制檔案。


MAIL: xcl_168@aliyun.com

BLOG: http://blog.csdn.net/xcl168


相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.