萬盛學電腦網

 萬盛學電腦網 >> 數據庫 >> 數據庫綜合 >> 如何解決ORA-1555錯誤

如何解決ORA-1555錯誤

這是我們為大家提供的一篇介紹如何解決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錯誤的文章,希望對大家有所幫助!

copyright © 萬盛學電腦網 all rights reserved