ORA-00257歸檔日誌寫滿的解決方法

xwdreamer發表於2014-06-23

背景:

在前一篇部落格中我們提到了如何啟動或關閉oracle的歸檔(ARCHIVELOG)模式,在我成功設定資料庫為歸檔模式以後, 第二天再次嘗試連線資料庫,報錯:ORA-00257。在網上找到了一圈資料,有些是說歸檔日誌寫滿,刪除歸檔日誌。有些是說閃回日誌寫滿,關閉閃回日誌。主要參考文獻有以下:

 
刪除歸檔日誌檔案的方法: http://www.blogjava.net/kuuyee/archive/2013/05/15/399287.html
惜分飛大大的部落格:http://www.xifenfei.com/655.html

 

首先我認為是閃回日誌寫滿,但是查了資料庫以後發現我並沒可有開啟閃回日誌,那麼就是歸檔日誌檔案寫滿的緣故了。使用以下幾個命令可以看出當前歸檔日誌檔案的使用情況:
select * from v$recovery_file_dest;
select sum(percent_space_used)*3/100 from v$flash_recovery_area_usage;
select * from v$flash_recovery_area_usage;
select * from v$version;

歸檔日誌檔案目錄、最大值(已經設定為20G)、當前使用值

可以看到ARCHIVED LOG的使用率是3.84%,這是因為我已經刪除掉歸檔日誌檔案了。在沒有刪除歸檔日誌之前是99.46這樣打的數字,表明我們的歸檔日誌已經使用了大部分的空間。

所以進入rman程式刪除歸檔日誌

rman target sys/pass@prjdb
crosscheck archivelog all;
delete archivelog until time 'sysdate'; --刪除所有日誌
delete expired archivelog all;--刪除過期日誌

深層分析

後來我想這樣手動刪除也不是個辦法總得讓系統自動刪除。後來就做了資料庫備份指令碼。執行的備份策略如下:

  1. 每週執行增量0的備份,順便備份歸檔日誌,並且刪除過期歸檔日誌
  2. 每天執行增量1的備份,順被備份歸檔日誌,並且刪除過期歸檔日誌。

因為我沒有設定歸檔日誌的有效期,所以一檔完成增量備份,那麼之前的所有歸檔日誌都會被刪除,相當於只保留一天的歸檔日誌。在執行這個備份策略以後,發現還是會出現ORA-00257這樣的錯誤。這個時候已經不是簡單刪除歸檔日誌的問題了,因為當前的歸檔日誌目錄連一天的歸檔日誌都釋出下。所以考慮擴大歸檔日誌目錄,參考:http://langzhiwang888.iteye.com/blog/1675033

SQL> alter system set db_recovery_file_dest_size=21474836480;---設定使用空間大小(20*1024*1024*1024),20GB
System altered
SQL> show parameter db_recovery_file_dest;---檢視歸檔日誌路徑限額

此時歸檔日誌目錄最大值就變成了20G。按照這樣的設定再次重啟oralce。

例項

最近在進行歷史資料匯入的工作。要往我的資料庫當中匯入2G的歷史記錄,插入記錄有幾百萬條。此時資料庫處於歸檔模式,對於每一個插入操作都會記錄到歸檔日誌當中去。在執行這個歷史匯入操作後3個小時,歸檔日誌就寫滿了。此時我的問題就來了,如果歸檔日誌寫滿的,我們的歷史匯入操作還能正常進行嗎?是否還能往資料庫當中insert資料。在跟公司DBA請教一番以後得到答覆,如果處於歸檔模式,並且歸檔日誌寫滿,那麼我的歷史資料匯入操作會block中,直到我清空歸檔日誌以後匯入工作才能再進行。

 

 

相關文章