背景:
在前一篇博客中我們提到了如何啟動(dòng)或關(guān)閉oracle的歸檔(ARCHIVELOG)模式,在我成功設(shè)定數(shù)據(jù)庫(kù)為歸檔模式以后, 第二天再次嘗試連接數(shù)據(jù)庫(kù),報(bào)錯(cuò):ORA-00257。在網(wǎng)上找到了一圈資料,有些是說(shuō)歸檔日志寫(xiě)滿,刪除歸檔日志。有些是說(shuō)閃回日志寫(xiě)滿,關(guān)閉閃回日志。主要參考文獻(xiàn)有以下:
刪除歸檔日志文件的方法:http://www.blogjava.net/kuuyee/archive/2013/05/15/399287.html
惜分飛大大的博客:http://www.xifenfei.com/655.html
關(guān)閉閃回日志:http://uhesse.com/2010/06/25/turning-flashback-database-on-off-with-instance-in-status-open/
http://blog.csdn.net/panys/article/details/3838846
http://jingyan.baidu.com/article/425e69e6b142d1be15fc16dc.html
http://www.itpub.net/thread-784621-2-1.html
http://gundam.blog.51cto.com/1845787/1272843
http://junfengwang060905.blog.163.com/blog/static/94223330201111524912142/
首先我認(rèn)為是閃回日志寫(xiě)滿,但是查了數(shù)據(jù)庫(kù)以后發(fā)現(xiàn)我并沒(méi)可有開(kāi)啟閃回日志,那么就是歸檔日志文件寫(xiě)滿的緣故了。使用以下幾個(gè)命令可以看出當(dāng)前歸檔日志文件的使用情況:
select*from v$recovery_file_dest;selectsum(percent_space_used)*3/100from v$flash_recovery_area_usage;select*from v$flash_recovery_area_usage;select*fromv$version;
歸檔日志文件目錄、最大值(已經(jīng)設(shè)定為20G)、當(dāng)前使用值

可以看到ARCHIVED LOG的使用率是3.84%,這是因?yàn)槲乙呀?jīng)刪除掉歸檔日志文件了。在沒(méi)有刪除歸檔日志之前是99.46這樣打的數(shù)字,表明我們的歸檔日志已經(jīng)使用了大部分的空間。

所以進(jìn)入rman程序刪除歸檔日志
rman target sys/pass@prjdbcrosscheck archivelog all;deletearchivelog until time'sysdate';--刪除所有日志deleteexpired archivelogall;--刪除過(guò)期日志
深層分析
后來(lái)我想這樣手動(dòng)刪除也不是個(gè)辦法總得讓系統(tǒng)自動(dòng)刪除。后來(lái)就做了數(shù)據(jù)庫(kù)備份腳本。執(zhí)行的備份策略如下:
每周執(zhí)行增量0的備份,順便備份歸檔日志,并且刪除過(guò)期歸檔日志
每天執(zhí)行增量1的備份,順被備份歸檔日志,并且刪除過(guò)期歸檔日志。
因?yàn)槲覜](méi)有設(shè)定歸檔日志的有效期,所以一檔完成增量備份,那么之前的所有歸檔日志都會(huì)被刪除,相當(dāng)于只保留一天的歸檔日志。在執(zhí)行這個(gè)備份策略以后,發(fā)現(xiàn)還是會(huì)出現(xiàn)ORA-00257這樣的錯(cuò)誤。這個(gè)時(shí)候已經(jīng)不是簡(jiǎn)單刪除歸檔日志的問(wèn)題了,因?yàn)楫?dāng)前的歸檔日志目錄連一天的歸檔日志都發(fā)布下。所以考慮擴(kuò)大歸檔日志目錄,參考:http://langzhiwang888.iteye.com/blog/1675033
SQL>altersystemsetdb_recovery_file_dest_size=21474836480;---設(shè)置使用空間大小(20*1024*1024*1024),20GB
System altered
SQL>show parameter db_recovery_file_dest;---查看歸檔日志路徑限額
此時(shí)歸檔日志目錄最大值就變成了20G。按照這樣的設(shè)定再次重啟oralce。
實(shí)例
最近在進(jìn)行歷史數(shù)據(jù)導(dǎo)入的工作。要往我的數(shù)據(jù)庫(kù)當(dāng)中導(dǎo)入2G的歷史記錄,插入記錄有幾百萬(wàn)條。此時(shí)數(shù)據(jù)庫(kù)處于歸檔模式,對(duì)于每一個(gè)插入操作都會(huì)記錄到歸檔日志當(dāng)中去。在執(zhí)行這個(gè)歷史導(dǎo)入操作后3個(gè)小時(shí),歸檔日志就寫(xiě)滿了。此時(shí)我的問(wèn)題就來(lái)了,如果歸檔日志寫(xiě)滿的,我們的歷史導(dǎo)入操作還能正常進(jìn)行嗎?是否還能往數(shù)據(jù)庫(kù)當(dāng)中insert數(shù)據(jù)。在跟公司DBA請(qǐng)教一番以后得到答復(fù),如果處于歸檔模式,并且歸檔日志寫(xiě)滿,那么我的歷史數(shù)據(jù)導(dǎo)入操作會(huì)block中,直到我清空歸檔日志以后導(dǎo)入工作才能再進(jìn)行。