歸檔日誌滿導致的資料庫掛起故障處理

kuqlan發表於2011-10-06

當資料庫執行在歸檔模式時,如果沒有做好備份策略或歸檔檔案和備份檔案放到同一個邏輯區,則偶爾會遇到歸檔日誌滿導致系統掛起事故。在這樣情況下,重啟資料庫不僅沒有用而且將問題更復雜化(記得重啟後在HA模式下的共享儲存也不見了,進行了手工mount後進行手工刪除部分歸檔日誌)。

根據實際環境有不同處理方法,如下是比較通用的處理過程:

1、檢視資料庫日誌檔案(alert_log

2、檢視用於歸檔日誌或備份的磁碟空間

3、刪除歸檔日誌物理檔案,歸檔日誌一般都是位於目錄下

4把歸檔日誌的物理檔案刪除後,Oracle就可以恢復正常了,但是還沒完全把歸檔日誌刪除乾淨。登入Rman,執行如下 兩條命令:

  crosscheck archivelog all;

  delete noprompt expired archivelog all;

本人也經歷了幾次,雖然當時沒有做記錄,現在覺得還是有必要進行總結分享。

[@more@]

當資料庫執行在歸檔模式時,如果沒有做好備份策略或歸檔檔案和備份檔案放到同一個邏輯區,則偶爾會遇到歸檔日誌滿導致系統掛起事故。在這樣情況下,重啟資料庫不僅沒有用而且將問題更復雜化(記得重啟後在HA模式下的共享儲存也不見了,進行了手工mount後進行手工刪除部分歸檔日誌)。

根據實際環境有不同處理方法,如下是比較通用的處理過程:

1、檢視資料庫日誌檔案(alert_log

2、檢視用於歸檔日誌或備份的磁碟空間

3、刪除歸檔日誌物理檔案,歸檔日誌一般都是位於目錄下

4把歸檔日誌的物理檔案刪除後,Oracle就可以恢復正常了,但是還沒完全把歸檔日誌刪除乾淨。登入Rman,執行如下 兩條命令:

  crosscheck archivelog all;

  delete noprompt expired archivelog all;

本人也經歷了幾次,雖然當時沒有做記錄,現在覺得還是有必要進行總結分享。

1、檢視資料庫日誌檔案(alert_sid.log

檢視日誌檔案最後100行記錄:$tail -100lf alert_sid.log

2、檢視用於歸檔日誌或備份的磁碟空間

LinuxUnix下可以透過檢視空間使用情況: $df -h

如果使用Oracle ASM儲存技術,則透過如下命令檢視:

$export ORACLE_SID=+ASM1

$asmcmd

ASMCMD> lsdg

3、刪除歸檔日誌物理檔案,歸檔日誌一般都是位於歸檔目錄下

刪除歸檔日誌既可以手工刪除,也可以透過RMAN來刪除。如果採用手工刪除則需要進行本文第4步驟來清理控制檔案內容。

在檔案系統管理模式下手工刪除方法:

$ls -lrt --該命令按時間升序顯示檔案

$rm filename --filename為要刪除的檔名

ASM管理模式下手工刪除方法:

ASMCMD> cd archivelog

ASMCMD> ls

2011_10_05/

2011_10_06/

ASMCMD> cd 2011_10_05

ASMCMD> ls -lrt ----該命令按時間升序顯示檔案

ASMCMD> rm filename --filename為要刪除的檔名

4把歸檔日誌的物理檔案刪除後,Oracle就可以恢復正常了,但是還沒完全把歸檔日誌刪除乾淨。登入Rman,執行如下 兩條命令:

  RMAN> crosscheck archivelog all;

  RMAN> delete noprompt expired archivelog all;

透過如上處理過程,可以讓系統執行恢復正常。但是透過這個方式後清理出來空間肯能並不是很大。在一般情況先如果採用RMAN備份方案,則建議將執行如下幾行Rman命令,這樣可能清理因備份不安計劃執行等原因造成一些過期或重複的備份檔案;

RMAN> crosscheck backup;

RMAN> delete noprompt expired backup;

RMAN> delete noprompt obsolete;

RMAN> resync catalog;

最終還要總結其他兩種情況:

刪除某幾天前所有歸檔日誌的方法

當出現應急情況下,如果對資料庫備份方案熟悉,則透過如下Rman命令也可以刪除某幾天之前的所有歸檔日誌。刪除7天前所有歸檔日誌:

RMAN>run{

DELETE ARCHIVELOG UNTIL TIME 'SYSDATE-7';

}

RMAN>crosscheck archivelog all;

RMAN>delete noprompt expired archivelog all;

UNIX/LINUX下也可以透過FIND找到7天前的歸檔資料,使用EXEC子操作刪除

  find /archivelog -xdev -mtime +7 -name "*.dbf" -exec rm -f {} ;

  這樣做仍然會在RMAN裡留下未管理的歸檔檔案

  仍需要在RMAN裡執行下面2條命令

  RMAN>crosscheck archivelog all;

  RMAN>delete expired archivelog all;

db_recovery_file_dest_size 引數

從Oracle10g開始,db_recovery_file_dest_size引數一般用來存放歸檔日誌(archivelog)和rman的備份集(backupset),預設值一般為2G,當備份和歸檔日誌超過該引數是也會出現ORA-19815錯誤。解決辦法就是增大db_recovery_file_dest_size 的引數值:

SQL> show parameter db_recovery_file_dest_size

NAME TYPE VALUE

------------------------------------ ----------- ------------------------------

db_recovery_file_dest_size big integer 2G

SQL> alter system set db_recovery_file_dest_size=4G;

系統已更改。

SQL> show parameter db_recovery_file_dest_size

NAME TYPE VALUE

------------------------------------ ----------- ------------------------------

db_recovery_file_dest_size big integer 4G

SQL>

透過以上街上Rman命令刪除不必要的資料並同步控制檔案或catalog庫內容。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/18841027/viewspace-1055471/,如需轉載,請註明出處,否則將追究法律責任。

相關文章