因此,在數(shù)據(jù)庫(kù)的日常維護(hù)工作中,如果只是一次兩次碰到ORA-01555錯(cuò)誤,一般都先忽略,但是如果經(jīng)常碰到該錯(cuò)誤,則要進(jìn)行一些調(diào)整以避免該錯(cuò)誤的再次發(fā)生。
1. 為什么會(huì)產(chǎn)生ORA-01555錯(cuò)誤?
這個(gè)錯(cuò)誤是由數(shù)據(jù)庫(kù)的讀一致性(Read consistency)引起的,當(dāng)查詢需要訪問(wèn)被修改的數(shù)據(jù)時(shí),它會(huì)到undo里訪問(wèn)該數(shù)據(jù)的前鏡像,如果該前鏡像已被覆蓋,查詢語(yǔ)句就會(huì)返回ORA-01555的錯(cuò)誤。
2. 導(dǎo)致ORA-01555錯(cuò)誤的主要原因有哪些?
1) undo太小
比較直觀的解決方法是DBA告訴數(shù)據(jù)庫(kù)應(yīng)用最長(zhǎng)的查詢需要多長(zhǎng)時(shí)間,并把UNDO_RETENTION設(shè)為這個(gè)值,同時(shí)相應(yīng)增大undo表空間大小。
但要從根本上解決undo太小問(wèn)題,還得從應(yīng)用端代碼調(diào)優(yōu)入手,減少查詢的運(yùn)行時(shí)間。
2) 延遲的塊清除
這種情況比較少見(jiàn),特別是在OLTP系統(tǒng)里,在OLAP系統(tǒng)里可能會(huì)碰到,解決方法是在每次大量的insert或update之后,記得用DBMS_STATS包掃描相關(guān)對(duì)象。