熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

Oracle重做日志丟失的故障處理

2013-11-13 15:27:24  來源: Oracle 

  Oracle重做日志

  Oracle的重做日志文件(Online redo logfile)循環記錄了數據庫所有的事務它的大小個數和存儲位置對數據庫性能和恢復有重要影響它一般由大小相同的幾組文件構成我們可以查看數據庫視圖v$logfile知道redo logfile的個數和存儲位置對每一個Oracle數據庫都要求至少具有兩個聯機重做日志

  每一次新的事務提交時Oracle將該事務寫入日志文件但並非此時也將修改的數據塊寫回原數據文件由於內存讀寫和磁盤I/O存在幾個數量級的效率差別Oracle通過減少數據文件的物理I/O讀寫來大大提高數據庫的性能同時又通過優先寫日志文件來保證數據的正確性和一致性基於這種機制重做日志文件在數據庫的實例恢復和介質恢復時至關重要是oracle數據庫最重要的物理文件之一

  如果數據庫在啟動時檢測到重做日志丟失數據庫將無法啟動如果數據庫在運行時切換日志文件組檢測到下一組或者全部的重做日志丟失數據庫將會崩潰由於磁盤介質損壞或者人為的誤刪除文件造成嚴重後果的事件近期時有發生本文列舉了重做日志丟失的數據庫恢復但如果按照冗余原則合理分布日志文件組的成員如果工程師了解日志文件的基本原理和使用原則就完全可以避免出現下列問題

  恢復方法

  故障現象

  SQL> startup mount

  Oracle Instance Started

  Database mounted

  ORA: open failed for members of log group of thread

  ORA: online log thread : /ORACLE/ORADATA/H/REDOLOG

  ORA: unable to open file

  OSD: unable to open file

  O/SError: (OS ) The system cannot find the file specified

  恢復注意事項

  以下所列舉的恢復方法都屬於不完全恢復或者強制恢復會丟失當前重做日志中的事務數據一旦操作不當將帶來數據丟失等嚴重後果請遵循以下幾個恢復原則

          請勿在生產系統上試用

          如果生產系統出現重做日志文件丟失的故障請勿自行操作破壞現場應該立刻聯系Oracle工程師

          恢復成功之後需要馬上做一次數據庫的全備份

          建議重做日志文件一定要實現鏡象在不同的磁盤上避免這種情況的發生

  恢復方法

          首先檢查重做日志文件狀態看看報錯的日志文件的狀態是否為Current

  SQL> select * from v$log;

  SQL> select * from v$logfile;

          如果重做日志文件狀態為Inactive我們可以直接清除該日志文件的內容

  SQL> alter database clear logfile /ORACLE/ORADATA/H/REDOLOG;

          如果重做日志文件狀態為Current恢復工作較為復雜有以下四種情況

  )通過下面步驟數據庫順利打開

  SQL> recover database until cancel;

  Type Cancel when prompted

  SQL>alter database open resetlogs;

  )第一種情況的recover database until cancel 操作遇到ORAORAORA錯誤需要整個數據庫的物理備份並根據歸檔日志恢復到錯誤時間點前提是數據庫是歸檔模式

  restore old backup

  SQL> startup mount

  SQL> recover database until cancel using backup controlfile;

  SQL> alter database open resetlogs;

  )如果數據庫是非歸檔模式只能恢復整個物理備份然後直接打開數據庫這種情況將丟失物理備份至故障發生前的全部數據

  )如果數據庫是非歸檔模式且沒有物理備份只能通過特殊的隱含參數允許數據庫不一致的狀況下打開數據庫這種恢復方法是沒有辦法之後的恢復方法將導致數據庫不一致一般情況下不要采用如確有需要請在Oracle的技術人員指導下使用該方法

  ?        關閉數據庫

  SQL>shutdown immediate

  ?        在init<sid>ora中加入如下參數

  _allow_resetlogs_corruption=TRUE

  ?        重新啟動數據庫利用until cancel恢復

  SQL>recover database until cancel;

  Cancel

  ?        打開數據庫

  SQL>alter database open resetlogs;

  ?        數據庫被打開後馬上執行一個全庫導出

  關閉數據庫在init<sid>ora中去掉_all_resetlogs_corrupt參數

  if ($ != jQuery) { $ = jQuerynoConflict(); }


From:http://tw.wingwit.com/Article/program/Oracle/201311/16743.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.