2015-04-30 137 views
2

我有一個存儲過程做了非常大的更新。有時候作業失敗,出現錯誤ORA-30036 Unable to extend segment by 8 in undo tablespace 'undotbs2'ORA-30036間歇性發生

但是幾個小時後,我們重新開始工作,併成功完成。

我檢查並發現undotbs2已經將AUTOEXTENSIBLE設置爲YES,並且大小爲3 GB,所以我猜測undo表空間在那裏已經有相當體面的大小,並且自動空間管理已經打開。

我的問題是,爲什麼它在我們重新運行後成功完成?是否因爲其他交易同時使用了undotbs2?對於這個錯誤,Oracle提到「另一種方法是等待直到活動事務提交。」,「活動事務」是指除存儲過程之外發生的其他事務/ sql嗎?

Oracle版本是11.2.0.1.0

謝謝

+1

表空間/數據文件是自動擴展的,但是它達到了它的最大大小(從'dba_data_files.maxbytes'或者'dba_tablespaces.maxsize'),並且不能超過3GB?是的,其他會話可能正在使用它(這是'其他事務'所指的內容),但在增加大小限制之前,可能需要查明還有哪些內容正在運行以及正在使用空間。 –

回答

3

看起來你的UNDO表空間已經達到了它MAXSIZE。如果您的長期交易與其他冗長的交易一起進行,就會發生這種情況。

Oracle使用UNDO表空間來保留事務發出ROLLBACK後恢復數據所需的信息。也就是說,它的使用取決於在任何特定時刻有多少活動事務,以及每個事件正在改變多少信息。

由此產生的表空間的用法/大小可以 - 正如你所經歷的 - 是相當隨機的。

一個解決辦法可能是:

  • 增加MAXSIZE的UNDO表空間,因此它可以處理你的lenghty交易產生
  • 將實施修改信息的數量,所以它的問題吧,然後提交每一個,因此您的長途交易的UNDO信息可以被釋放。
+1

承諾破壞交易的原子性,當然... –

+0

是的,這是一個漫長的交易。不同的消息來源也提到,在兩者之間插入「COMMIT」可能會導致'ORA-01555快照太舊'錯誤。你能解釋一下這個現象嗎? – timpham

+0

[這裏](http://www.dba-oracle.com/t_ora_01555_snapshot_old.htm)是一個很好的解釋,當長時間運行的事務導致ORA-01555錯誤時會發生什麼。 – npe