ROLLBACK 時用前像恢復原值SCN < 查詢起始 SCN 的版本SELECT 只看啟動瞬間的資料庫快照SET TRANSACTION READ ONLY 或 SERIALIZABLE (影響並發與效能)| 類型 | 建立時機 | 用途 | 備註 |
|---|---|---|---|
| System | 建庫自動 | SYSTEM 表空間物件前像 | 不可刪除/離線 |
| Non-System (Private) | 手工建立 | 非 SYSTEM 表空間物件前像 | 在 init.ora ROLLBACK_SEGMENTS 列出自動上線 |
| Non-System (Public) | 手工建立 | OPS/RAC 環境共用 | 實例啟動自動上線 |
| Deferred | 表空間離線時自動 | 離線期間產生的回滾資訊 | 表空間上線自動刪除 |
SET TRANSACTION USE ROLLBACK SEGMENT rbs_name交易循序使用 Extents,滿則移至下一個 (Wrap)。多交易可共用同一 Extent,**但一個區塊只屬於單一交易**。
MAXEXTENTS 上限OPTIMAL = INITIAL + NEXT * (預估並發交易數 - 1)| 問題 | 現象 | 根因 | 對策 |
|---|---|---|---|
| ORA-01555 Snapshot Too Old | 長查詢失敗 | 回滾段太小/被覆寫、OPTIMAL 過小、提交太頻繁 | 增大回滾段、調大 OPTIMAL、使用大回滾段、減少長查詢並發 |
| ORA-01650 Unable Extend Rollback | DML 失敗 | 表空間滿、MAXEXTENTS 達上限 | 擴充表空間、增加回滾段、調大 MAXEXTENTS |
| 回滾段爭用 | 效能下降 | 回滾段數量不足、熱點段 | 增加回滾段數量 (建議: 交易數/4)、均勻分佈表空間 |
| Deferred Rollback Segment 殘留 | 表空間無法離線/刪除 | 異常關機導致未清理 | 啟動資料庫自動清理、或手工 DROP |
-- 建立 UNDO 表空間 CREATE UNDO TABLESPACE undotbs1 DATAFILE '/u01/oradata/undotbs01.dbf' SIZE 2G EXTENT MANAGEMENT LOCAL AUTOALLOCATE; -- 參數檔設定 UNDO_MANAGEMENT = AUTO UNDO_TABLESPACE = undotbs1 UNDO_RETENTION = 900 -- 秒,滿足 ORA-01555 需求
UNDO_RETENTION 秒內的前像-- 監控回滾段狀態
SELECT segment_name, status, extents, rssize, optsize, hwmsize, xacts
FROM dba_rollback_segs;
-- 監控爭用
SELECT class, count FROM v$waitstat
WHERE class IN ('system undo header','system undo block','undo header','undo block');
-- 監控 ORA-01555 風險
SELECT max(undoblks) FROM v$undostat; -- 10g+ 自動 UNDO 統計
回滾段是 Oracle 交易引擎的「時光機」。從手工精細調校到自動 UNDO 智能管理,核心邏輯不變:**為每個修改保留足夠久的前像,支撐回滾、恢復、一致性讀三大支柱**。掌握其運作機制,才能在 ORA-01555 風暴中從容應對。