ORA-01555 是 Oracle DBA 職業生涯中遇到頻率最高、且最易誤判的錯誤之一。它不會導致數據損壞或丟失,僅阻斷當前查詢,但頻繁發生意味著 Undo 管理或應用設計存在結構性缺陷。本文從讀一致性機制出發,徹底剖析根因、誤區與系統級解決方案。
Oracle 承諾:查詢啟動瞬間 (SCN) 的數據快照在整個查詢過程中保持不變。當查詢需要訪問被修改的數據塊時:
現象:高併發 DML 產生大量 Undo,循環覆蓋速度 > 長查詢回溯需求。
表層處方(治標):
-- 1. 設置合理保留時間(單位:秒)
ALTER SYSTEM SET UNDO_RETENTION = 3600 SCOPE=BOTH; -- 1小時,根據最長查詢時間設定
-- 2. 保證 Undo 表空間足夠大(含自動擴展)
ALTER TABLESPACE undotbs1 ADD DATAFILE '/u01/oradata/undotbs02.dbf' SIZE 10G AUTOEXTEND ON MAXSIZE 50G;
根治方案(治本):
機制:大量 DML 後,數據塊 ITL 中仍殘留舊事務 SCN,後續查詢誤以為需要回溯 Undo,實際 Undo 已失效。
高發場景:數據倉庫批量載入(Direct Path Load)、大批量 UPDATE/DELETE、分區交換後。
解決方案:
-- 批量操作後主動觸發塊清理(掃描相關對象)
EXEC DBMS_STATS.GATHER_TABLE_STATS(ownname => 'SCHEMA', tabname => 'TARGET_TABLE', estimate_percent => 100, method_opt => 'FOR ALL COLUMNS SIZE AUTO', cascade => TRUE);
-- 或執行全表掃描強制清理
ALTER SESSION SET EVENTS '10231 TRACE NAME CONTEXT FOREVER, LEVEL 10';
SELECT /*+ FULL(t) */ COUNT(*) FROM target_table t;
| 誤區 | 真相 | 正確行動 |
|---|---|---|
| 「增大 UNDO_RETENTION 就能解決」 | 參數僅為「目標值」,空間不足時仍會覆蓋 | 必須配套足夠大的 Undo 表空間 + 開啟 RETENTION GUARANTEE |
| 「啟用 RETENTION GUARANTEE 徹底杜絕」 | 空間耗盡時 DML 會報 ORA-30036 無法提交 | 僅用於核心報表庫,OLTP 系統慎用 |
| 「查詢慢就加索引」 | 錯誤索引可能增加 DML 產生的 Undo 量 | 全局 SQL 調優,平衡查詢與 DML 開銷 |
| 「ORA-01555 只有長查詢才會遇到」 | 短查詢若遇到「延遲塊清理」同樣會報錯 | 批量操作後執行統計收集/塊清理 |
-- 1. 查看當前 Undo 使用情況
SELECT tablespace_name, file_name, bytes/1024/1024 MB, autoextensible, maxbytes/1024/1024 MAX_MB
FROM dba_data_files WHERE tablespace_name = (SELECT value FROM v$parameter WHERE name = 'undo_tablespace');
-- 2. 監控 ORA-01555 發生頻率(需開啟審計或查詢 Alert Log)
SELECT * FROM dba_audit_trail WHERE returncode = 1555;
-- 3. 識別長查詢(運行超過 UNDO_RETENTION)
SELECT sql_id, sql_text, elapsed_time/1e6 SEC, executions, rows_processed
FROM v$sql
WHERE elapsed_time/1e6 > (SELECT value FROM v$parameter WHERE name = 'undo_retention')
AND executions > 0
ORDER BY elapsed_time DESC;
-- 4. 檢查是否有「延遲塊清理」風險對象
SELECT owner, segment_name, segment_type, blocks
FROM dba_segments
WHERE segment_type IN ('TABLE','TABLE PARTITION')
AND blocks > 10000 -- 大對象優先
ORDER BY blocks DESC;
V$UNDOSTAT 中的 UNXPSTEALCNT(非期望盜取計數)、SSOLDERRCNT(ORA-01555 計數)ORA-01555 不是「錯誤」,而是資源約束下的保護機制。它提醒您:要么給更多 Undo 空間,要么縮短查詢時間,要么清理殘留 SCN。將其視為性能調優的「體檢報告」而非單純故障,才能從根本上消除隱患,構建穩健的數據庫服務能力。