Rollback Segment 運作機制
- 事務循環使用 Extent,當前 Extent 滿則切換下一個。
- 多事務可同時寫同一 Extent,但單區塊僅屬於一個事務。
- Header 區塊含 Transaction Table,記錄事務狀態,頻繁修改,宜長駐 Buffer Cache。
- 為減少 Header 爭用:手工模式建多個 Rollback Segment,或啟用 9i 自動 Undo 管理。
Header 爭用診斷 (手工模式)
-- 等待統計
SELECT class, count FROM v$waitstat WHERE class LIKE '%undo%';
-- 總請求數
SELECT SUM(value) FROM v$sysstat WHERE name IN ('db block gets','consistent gets');
-- 任一類型等待/總請求 > 1% 即有爭用
-- 或彙總視圖
SELECT SUM(waits)*100/SUM(gets) "Ratio%", SUM(waits) "Waits", SUM(gets) "Gets"
FROM v$rollstat;
若 Ratio > 1%,建議增加 Rollback Segment。
直接證據:V$ROLLSTAT.WAITS、V$WAITSTAT undo header、V$SYSTEM_EVENT undo segment tx slot 計數 > 0。
減少 Undo 產生量
- 全表清空用
TRUNCATE 替代 DELETE。
- 應用層規律提交,避免長事務。
- 工具參數優化:
- Import:
COMMIT=Y + BUFFER 控制批次。
- Export:
CONSISTENT=N (非一致性讀加快、減少 Undo)。
- SQL*Loader:
ROWS=n 設定提交頻率。
小 Rollback Segment 潛在問題
- 事務因空間不足失敗 (ORA-01562 / ORA-01628)。
- Snapshot Too Old (ORA-01555) 三大成因:
- ITL 中 SCN 被沖刷,區塊 SCN 超過舊事務 SCN。
- Rollback Header Transaction Slot 被重用。
- Undo 資料已被覆寫。
9i 自動 Undo 管理 (AUM)
| 參數 | 說明 |
| UNDO_MANAGEMENT | AUTO (自動) / MANUAL (手工) |
| UNDO_RETENTION | Undo 保留秒數 (目標值,非硬性保證) |
| UNDO_TABLESPACE | 指定作用中 Undo 表空間 |
- 建庫時可建立,或後續獨立建立並
ALTER SYSTEM SET UNDO_TABLESPACE = ... 切換 (同一時刻僅一個 ACTIVE)。
- 非 ACTIVE Undo 表空間可刪除;若有查詢引用已提交事務會報錯。
Undo 表空間大小估算
Undo Space = (Undo_Retention * (Undo_Blocks_Per_Sec * DB_Block_Size)) + DB_Block_Size
SQL 精確計算:
SELECT (rd * (ups * overhead) + overhead) "Bytes"
FROM (SELECT value rd FROM v$parameter WHERE name='undo_retention'),
(SELECT SUM(undoblks)/SUM((end_time-begin_time)*10800) ups FROM v$undostat),
(SELECT value overhead FROM v$parameter WHERE name='db_block_size');
rd:保留秒數;ups:每秒 Undo 區塊數;overhead:區塊大小 (含 Header 開銷)。
- 上一篇文章: Oracle Latch 爭用診斷與解決:Shared Pool 與 Library Cache 熱點分析
- 下一篇文章: Oracle 鎖競爭與死鎖處理:原理、診斷與解決策略
Copyright ©
程式碼之家 All Rights Reserved