《Oracle程式設計藝術》學習筆記 21 ORA

2022-04-09 08:19:00 字數 2204 閱讀 8313

oracle的多版本模型會使用回滾段(undo段)資料依照語句或事務(取決於隔離模式)開始時的原樣來重建塊。

回滾段是迴圈使用的,當事務提交以後,該事務占用的回滾段事務表會被標記為非活動,回滾段空間可以被覆蓋重用。

造成ora-01555錯誤有三個可能原因:undo段太小;提交太頻繁;延遲的塊清除。

undo段太小

有2個解決辦法,

1)減少查詢的執行時間(調優)。應該首先嘗試這種方法。這樣就能降低對undo段的需求,不需求太大的undo段。

2)允許undo表空間擴大,為之留出擴充套件的空間,並增加undo保持時間。

管理系統中的undo有兩種方法,自動undo管理(automatic undo management)和手動undo管理(manual undo management)。

可以通過undo_management引數來設定(auto表示自動管理,manual表示手工管理)。推薦使用自動管理。

在自動管理下,通過undo_retention引數告訴oracle要把undo保留多長時間,要大於執行執行時間最長的事務所需的時間,可以用v$undostat來確定長時間執行的查詢的持續時間。另外,要確保磁碟上已經預留了足夠的空間,使undo段能根據所請求的undo_retention增大。

oracle會根據併發工作負載來確定要建立多少個undo段,以及每個undo段應該多大。資料庫甚至在執行時可以在各個undo段之間重新分配區段。

提交太頻繁

如果在讀取表的同時,另外的會話在修改這個表,就會同時生成查詢所需的undo資訊,查詢可能會利用這些undo資訊來得到讀一致檢視。如果另外的會話提交了所做的更新,就會允許系統重用剛剛填寫的undo段空間,就有可能擦除了舊的undo資料。如果查詢隨後要用到這些undo信,就會收到乙個ora-01555:snapshot too old錯誤訊息。

所以提交的太頻繁是造成ora-01555錯誤的乙個可能原因(比如對乙個塊上的10行資料,每次修改1行並提交,就會對這個塊生成10次undo映象資料)。

延遲的塊清除

什麼是塊清除?

發生延遲塊清除情況下,如果乙個塊已被修改,下乙個會話訪問這個塊時,可能必須檢視最後乙個修改這個塊的事務是否還是活動的。一旦確定該事務不再活動,就會完成塊清除。

oracle會從塊首部的itl事務槽(該事務槽指向回滾段段頭的事務槽),確定前乙個事務所用的回滾段,然後試圖從這個回滾段首部的事務槽來獲得該事務的提交scn,如果事務的前映象資訊已經被覆蓋,並且查詢scn也小於回滾段中記錄的最小scn,那麼oracle將無法判斷查詢scn和事務提交scn的大小,此時出現延遲塊清除導致的ora-01555錯誤。

可見,要從乙個延遲的塊清除收到ora-01555錯誤,以下條件都必須滿足:

· 首先做了乙個修改並commit,塊沒有完成自動塊清除(例如修改了太多的塊,在sga塊緩衝區快取的10%中放不下)。

· 其他會話沒有接觸這些塊,而且在我們這個「倒霉」的查詢命中這些塊之前,任何會話都不會接觸它們。

· 從scn=t1開始開始乙個長時間執行的查詢,這個查詢最後會讀到上面所說的未完成塊清除的其中的一些塊。由於讀一致性必須將資料回滾到scn=t1時的狀態。

· 開始查詢時,上面執行修改的事務的事務條目可能還在undo段的事務表中。但是查詢期間,系統中執行了多個提交。執行事務沒有接觸上面這些已修改的塊(如果確實接觸到,就會執行塊清除,也就不存在問題了)。由於出現了大量的commit,undo段中的事務表要迴繞並重用事務槽,現在最初執行修改的事務在回滾段的事務表中的條目已經被覆蓋。

· 由於提交太多,undo段中記錄的最低scn現在超過了t1(高於查詢的讀一致scn)。

現在,如果查詢到達最初已經修改並提交的某個塊,就會遇到麻煩。由於最初執行修改的事務條目已經被覆蓋,所以無法查詢最初執行修改的事務的scn,而且undo段中記錄的最低scn現在超過了t1,在這種特殊的情況下,查詢無法確定塊的commit scn是大於還是小於t1,也就不清楚查詢能否使用這個塊映像。這就導致了ora-01555錯誤。

如果在乙個表執行select時(沒有應用其他dml操作)出現了ora-01555錯誤,就是因為延遲的塊清除引起的。解決辦法:

1)減少查詢的執行時間(調優)。

2)保證使用的事務「大小適當」。確保沒有不必要地過於頻繁地提交。

3)使用dbms_stats掃瞄相關的物件,載入之後完成這些物件的清理。由於塊清除是極大量的update或insert造成的,所以很有必要這樣做。

4)允許undo表空間擴大,為之留出擴充套件的空間,並增加undo保持時間。

作者:nowornever

《Oracle程式設計藝術》學習筆記 23 段

段就是占用儲存空間的資料庫物件,占用儲存空間的每乙個物件最後都會儲存在乙個段中,如表 索引 回滾段等。段的型別 1 表段 2 表分割槽段 table partition 或子分割槽段 subpartition 這種段型別用於分割槽,與表段很相似。分割槽表由乙個或多個分割槽段 table partit...

《Oracle程式設計藝術》學習筆記 23 段

段就是占用儲存空間的資料庫物件,占用儲存空間的每乙個物件最後都會儲存在乙個段中,如表 索引 回滾段等。段的型別 1 表段 2 表分割槽段 table partition 或子分割槽段 subpartition 這種段型別用於分割槽,與表段很相似。分割槽表由乙個或多個分割槽段 table partit...

程式設計藝術學習筆記(1)

序言習題 1 通過一系列的替代,將四個變數的值 a,b,c,d 變為 b,c,d,a 用最少的步驟 開門菜,然而還是有很多值得思考的地方。能幫助人理解計算機對於賦值的操作。通過觀察,可以認為這是乙個a i 賦值給a i 1 的操作。最少的步驟,只需要五步即可。需要乙個t來作輔助,t a,a b,b ...