背景:
在前一篇部落格中我們提到了如何啟動或關閉oracle的歸檔(ARCHIVELOG)模式,在我成功設定資料庫為歸檔模式以後, 第二天再次嘗試連線資料庫,報錯:ORA-00257。在網上找到了一圈資料,有些是說歸檔日誌寫滿,刪除歸檔日誌。有些是說閃回日誌寫滿,關閉閃回日誌。主要參考文獻有以下:
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;--刪除過期日誌
深層分析
後來我想這樣手動刪除也不是個辦法總得讓系統自動刪除。後來就做了資料庫備份指令碼。執行的備份策略如下:
- 每週執行增量0的備份,順便備份歸檔日誌,並且刪除過期歸檔日誌
- 每天執行增量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中,直到我清空歸檔日誌以後匯入工作才能再進行。