這是我們為大家提供的一篇介紹如何解決ORA-1555錯誤的文章,接下來就讓我們一起來了解一下吧!
ORA-1555錯誤簡單的說就是針對一個數據塊產生一致讀時發生了錯誤。一致讀就是指ORACLE利用回滾段來臨時重構一個和事務或查詢開始時的 塊狀態相同的快照塊的過程。如果一個塊改變了多次,可能就會有多個快照塊的。
一個事務或查詢開始執行時,ORACLE會產生一個SCN來記錄這個開始時刻點,這個SCN也就叫做SNAPSHOT SCN。ORACLE僅僅看基於SNAPSHOT SCN的快照記錄。如果塊中有活動的事務或BLOCK SCN> SNAPSHOT SCN時,就產生了一致讀。如果是沒有活動的事務但沒有產生COMMIT SCN的塊 ,先產生DELAY BLOCK CLEANOUT,再比較COMMIT SCN與SNAPSHOT SCN的大小,如果COMMIT SCN小於SNAPSHOT SCN則直接使用該塊,否則要產生一致讀。
產生ORA-1555的可能情況:
1 一個長時間運行的查詢,並同時針對查詢需要的塊有DML處理(主要是update和delete)
2 當查詢和插入並發時
3 延遲塊清除
4 交叉fetch和commit
5 回滾段發生錯誤
情況1 一個長時間運行的查詢,並同時針對查詢需要的塊有DML處理(主要是update和delete)
當一個查詢開始之後,正好某一個update更改了其中的一個記錄,當查詢掃描到該記錄時,就需要一致讀,回滾空間中去查找原值。如果這個查詢的時間非常長,而那條記錄修改之後,很快就被提交了,導致回滾空間中的記錄可以被清除,並且這個數據庫事務本身也比較多,回滾空間的覆蓋比較塊,在查詢結束之前,回滾段中的記錄空間就被新的記錄覆蓋占用了,導致查詢找不到原值,從而產生ORA-1555錯誤。
Solution:
1、業務控制,禁止對同一個表的長時間查詢和更新處理同時進行,要分開執行
2、增大回滾段的大小
3、增加回滾段的個數
4、不使用OPTIMAL選項,已經被使用的空間就不會很快收縮回來,可以使commit之後的記錄保持盡可能長的時間
5、推遲對DML語句的COMMIT
6、優化查詢語句,比如並行查詢,目的是減小查詢的時間
7、為要查詢的表建立只讀SNAPSHOT,這樣對表記錄的修改就不會影響到查詢,但該表不能是太大的表
情況2 當查詢和插入並發時
一般情況下,當我們查詢一個表,同時對這個表作插入,這時是不需要一致讀的。當然這種情況下也不可能產生ORA-1555錯誤。
當作全表掃描的時候,oracle會掃描所有位於HWM之下的空間,而對於HWM之上的空間將忽略。也正因為如此,當我們插入的數據位於HWM之下的時候,如果同時還有例如全表掃描這部分空閒的空間,就會產生一致讀,就有可能會導致ORA-1555錯誤。 特別是在VLDB和OPS系統中,因為在這些系統中,很多時候都會對表作pre-allocate,當作了預分配之後,如果作一次大批量的delete,將會有非常多的可用空間位於HWM之下。
Solutions:
1、情況1的所有解決方法這裡同樣適用
2、不要預分配區(pre-allocate extent)
3、使用tuncate來刪除表記錄,使HWM收縮。
4、使用直接路徑選項導入數據,使插入的數據在HWM之上。
情況3 延遲塊清除
關於延遲塊清除的概念,可以參考後面的附錄。
Solution:
1、使用oracle並行服務器OPS,將DML操作分割到不同的實例上執行
2、在批處理中使用SET TRANSACTION USE ROLLBACK SEGMENT為事務單獨指定一個回滾段。
3、可以在DML之後,立即執行一個全表掃描和analyze indexes來強制立即進行塊清除。
情況4 交叉fetch和commit
這種比較典型的情況是在一個過程中使用了如下的結構:
cursor c1 is select * from bigemp;
begin
for c1rec in c1 loop
update mydual set a=a;
commit;
end loop;
end ;
Solution:
1、檢查過程,避免這種交叉提取和提交的情況出現。
2、延遲commit
3、在查詢語句中,增加“ order by 1 ”的語句,這樣會在臨時段中保留ORDER BY的結果,可以避免一些一致讀。
情況5 回滾段發生錯誤的解決方法:
由這種原因導致的ORA-01555錯誤是極少數的。一般情況下,也只有在那些不支持大文件的操作系統會發生這種情況。
Solution:
1、檢查init.ora中的參數文件,show parameter CORRUPT,可以將結果提交給ORACLE SUPPORT SERVICES。如果這樣的參數存在,建議重 建數據庫。
2、檢查操作系統是否支持ORACLE。檢查操作系統的錯誤日志和ORACLE的錯誤日志。
3、向Oracle Support Services尋求幫助。
補充情況6:
在oracle 9i之後,使用auto的undo,就很少出現ORA-1555錯誤了,但是也不能完全排除這個錯誤,比如以下錯誤:
ORA-01555 caused by SQL statement below (Query Duration=11952 sec, SCN: 0x0842.1a1d737c)
這種情況下,主要是查詢的時間超長,超過了undo_retention設置的時間10800秒,從而產生前面的情況1和情況2的錯誤。
Solution:
主要的解決方法,還是優化查詢,包括語句的優化和索引的優化。
以上就是我們為大家提供的介紹如何解決ORA-1555錯誤的文章,希望對大家有所幫助!