程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> 怎樣恢復Oracle重做日志丟失的竅門

怎樣恢復Oracle重做日志丟失的竅門

編輯:Oracle數據庫基礎

如果數據庫在啟動時檢測到重做日志丟失,數據庫將無法啟動。如果數據庫在運行時切換日志文件組,檢測到下一組或者全部的重做日志丟失,數據庫將會崩潰。所以有必要學習下Oracle重做日志恢復的技巧。

由於磁盤介質損壞或者人為的誤刪除文件,造成嚴重後果的事件近期時有發生。本文列舉了重做日志丟失的數據庫恢復,但如果按照冗余原則合理分布日志文件組的成員,如果工程師了解日志文件的基本原理和使用原則,就完全可以避免出現下列問題。

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

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

恢復方法

故障現象

  1. SQL> startup mount        
  2. Oracle Instance Started        
  3. Database mounted        
  4. ORA-00313: open failed for members of log group 1 of thread 1        
  5. ORA-00312: online log 1 thread 1: '/Oracle/ORADATA/H817/REDO01.LOG'        
  6. ORA-27041: unable to open file        
  7. OSD-04002: unable to open file        
  8. O/S-Error: (OS 2) The system cannot find the file specifIEd.   

Oracle重做日志恢復注意事項

以下所列舉的恢復方法,都屬於不完全恢復或者強制恢復,會丟失當前重做日志中的事務數據。一旦操作不當,將帶來數據丟失等嚴重後果,請遵循以下幾個恢復原則:
1. 請勿在生產系統上試用。
2. 如果生產系統出現重做日志文件丟失的故障,請勿自行操作破壞現場,應該立刻聯系Oracle工程師。
3. 恢復成功之後,需要馬上做一次數據庫的全備份。
4. 建議重做日志文件一定要實現鏡象在不同的磁盤上,避免這種情況的發生。

恢復方法
1.        首先檢查重做日志文件狀態,看看報錯的日志文件的狀態是否為Current

  1. SQL> select * from v$log;        
  2. SQL> select * from v$logfile;   

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

  1. SQL> alter database clear logfile '/Oracle/ORADATA/H817/REDO01.LOG';
    3.  如果重做日志文件狀態為Current,恢復工作較為復雜,有以下四種情況:
    1)通過下面步驟,數據庫順利打開
  1. SQL> recover database until cancel;                  
  2. Type Cancel when prompted         
  3. SQL>alter database open resetlogs;  

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

  1. restore old backup        
  2. SQL> startup mount        
  3. SQL> recover database until cancel using backup controlfile;        
  4. SQL> alter database open resetlogs;    

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

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

  1. 關閉數據庫  
  2. SQL>shutdown immediate   
  3. 在init<sid>.ora中加入如下參數   
  4. _allow_resetlogs_corruption=TRUE   
  5. 重新啟動數據庫,利用until cancel恢復   
  6. SQL>recover database until cancel;   
  7. Cancel   
  8. 打開數據庫  
  9. SQL>alter database open resetlogs;   

數據庫被打開後,馬上執行一個全庫導出。
關閉數據庫,在init.ora中去掉_all_resetlogs_corrupt參數

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved