(續) [Study] Oracle9i Space Management Demystified (1)
[原文] Original file here
9i提供給DBA的利器之二: Automatic Undo Management
這是原文的第一個part,旨在介紹undo tablespace/undo segment。在讀這篇文章以前,心裡一直有訊息就是: 9i以前存放undo data的叫做rollback segment,9i稱為undo segment。以為只是名稱上的不同,作用機制應該一樣。現在終於清楚了解是不同的!於是相當三八的畫了圖,就來看圖說故事吧XD
雖然名字不同、作用機制不同,不過目的是一樣的:

Rollback Segment Reviewed
Rollback segment由一個transaction table(存放在header)與兩個以上的extents(由undo blocks)組成。每個extent可以被多個transaction存取,但同一時間只能由單一transaction寫入。
Extent是循環使用的。每個transaction會嘗試使用下一個"有空"的extent,如果每個extent都已經被佔用,server會再配置新的extent。
Automatic Undo Management
9i的這個新功能是透過undo tablespace來實現,tablespace裡的segment就叫undo segment(header同樣有一個transaction table),segment再往下的邏輯架構同rollback segment。
Undo tablespace啟用時,部份undo segments也同時online。每個transaction建立時,server會嘗試配給一個undo segment(transaction table)。當online的undo segments不夠用時,剩餘offline的undo segments 也會online來使用。若還是不夠,server會嘗試再配置新的undo segments,直到undo tablespace的空間不足了,才可能讓transaction共享同一個undo segment(最閒的那個)。
以上,就是rollback segment跟undo segment的差異。所以這樣的差異如何可以讓DBA的生命更美好呢XD?
- 只要create一個夠大的undo tablespace,undo segment的數量與大小oracle server都會接手,自動依需求動態調整。若是9i以前,rollback segments的數量與大小都需要仔細考慮,才能降低因transaction佔用而導致效率下降的問題。
- 跟auto undo management搭配的還有一個參數: UNDO_RETENTION。透過設定這個參數(秒數),可以決定undo data需要被保留至少多久的時間。如果有long run query,可以降低ORA-1555(shapshot too old)的錯誤。不過要特別注意的是,這個參數要undo tablespace的大小配合。否則你希望保留較久的undo data,可是允許的空間不足的話... 只能說: 巧婦難為無米之炊XD
- 承第一點,比起固定大小的rollback segment,因為undo segment大小動態調整,對於整個tablespace的空間利用也就較有效率。
所以如果是oracle 9i用戶,只要透過設定以下兩個初始化參數,就可以使用automatic undo management囉~
UNDO_MANAGEMENT=AUTO
COMPATIBLE=9.0.0
Sizing Undo Tablespace
所以,undo tablespace該給多大顯然是個重要的議題... 最簡單的方法是,如果我知道三件事情,那麼就可以決定"至少"要給多大的空間:
- 資料庫平均每秒需要用到多少個undo blocks?
- 每個undo block(data block)多大?
- 政策上要保留多久時間(秒)以前的undo data?
以上,2跟3都很好解決,就是初始化參數的DB_BLOCK_SIZE跟上面提到的UNDO_RETENTION。1呢... 我們可以從V$UNDOSTAT這個view裡得到答案。
V$UNDOSTAT這個表每十分鐘就會多一筆資料,統計每十分鐘產生了多少個undo blocks以及最久的query時間。數學上是這樣: "每十分鐘吃掉X個糖果,每秒吃幾個?" XD,不過當然是全部數據拿來平均比較準。最久的query時間也有點用處,可以讓DBA們參考決定undo_retention要設多久。
所以得到以上三個數字後,相乘,可以得到一個byte數,那就是最小需要的undo tablespace的大小囉~
呼~ 大致上就這樣,最基本的概念介紹完畢。原文裡還有其他資訊,請自閱。