ora-01555根本原因是undo表空间物理空间不足且未启用retention guarantee,而非undo_retention参数过小;须先检查autoextensible状态与真实使用率,再结合v$undostat.maxquerylen设置合理值并启用保证机制。

Oracle 19c 中无法“配置自动撤销保留”——UNDO_RETENTION 是软建议,真正起作用的是空间 + RETENTION GUARANTEE + 自动调优机制的组合,缺一不可。
为什么 UNDO_RETENTION 设了也不生效
很多人执行 ALTER SYSTEM SET UNDO_RETENTION = 3600 后仍频繁遇到 ORA-01555,是因为该参数在 19c 中仅作为“下限参考值”,Oracle 是否遵守它,完全取决于:undo_tablespace 是否有足够物理空间、是否启用 RETENTION GUARANTEE、以及当前负载下自动调优是否被触发。
关键事实:
- 若 undo 表空间是 AUTOEXTEND 类型(推荐),19.7+ 版本会基于 v$undostat.maxquerylen 自动上调实际保留时长,但前提是空间够用;
- 若是固定大小表空间,且未启用 RETENTION GUARANTEE,Oracle 直接忽略 UNDO_RETENTION,按空间压力动态回收未过期 undo;
- 查看真实生效值请查 v$undostat.tuned_undoretention,不是 v$parameter 里的值。
必须同时做的两件事:开保证 + 确保空间可伸缩
只改参数不解决根本问题。主库(含 RAC 所有实例)必须同步执行:
-
ALTER SYSTEM SET UNDO_RETENTION = <value> SCOPE=BOTH</value>,其中<value></value>应 ≥(SELECT MAX(maxquerylen) * 1.5 FROM v$undostat WHERE begin_time > SYSDATE - 1)(单位秒) -
ALTER TABLESPACE <undotbs_name> RETENTION GUARANTEE</undotbs_name>,替换<undotbs_name></undotbs_name>为实际表空间名(如UNDOTBS1) - 确认对应数据文件已启用自动扩展:
SELECT autoextensible FROM dba_data_files WHERE tablespace_name = '<undotbs_name>'</undotbs_name>,若为NO,必须补上:ALTER DATABASE DATAFILE '<file_path>' AUTOEXTEND ON NEXT 100M MAXSIZE 10G</file_path>
漏掉任意一项,ORA-01555 或 ORA-30036(空间耗尽)就会交替出现。
ADG 备库报 ORA-01555?根子永远在主库
备库的读一致性完全依赖主库生成并传输的 undo 数据。备库自身不生成 undo,也不受本地 UNDO_RETENTION 控制。
所以:
- 备库出现 ORA-01555,第一反应不是查备库参数,而是立刻检查主库的:v$undostat.maxquerylen 峰值、dba_data_files 空间余量、RETENTION GUARANTEE 是否启用;
- 主库没开 RETENTION GUARANTEE,哪怕设了 7200 秒,长查询在备库 flashback query 时照样拿不到旧镜像;
- RAC 环境下,所有实例的 UNDO_RETENTION 必须一致,否则跨实例事务可能因保留策略不统一而失败。
不能 shrink undo 表空间?那就换
想“释放 undo 占用空间”?别试 ALTER TABLESPACE ... SHRINK SPACE —— 所有 11g+ 版本都会报 ORA-30044。也不能直接 RESIZE 数据文件,大概率触发 ORA-03297(HWM 钉住)。
唯一安全路径是切换表空间:
- CREATE UNDO TABLESPACE undotbs_new DATAFILE '/path/undotbs_new01.dbf' SIZE 4G AUTOEXTEND ON MAXSIZE 8G
- ALTER SYSTEM SET undo_tablespace = undotbs_new
- 等待旧表空间中 v$transaction 为空、v$undostat 的 unxpstealcnt 不再增长,再 DROP TABLESPACE undotbs_old INCLUDING CONTENTS AND DATAFILES
这个过程不是“收缩”,而是重建——旧 undo 段随事务自然过期后,新空间才真正腾出来。中间窗口期必须留足,尤其对长事务或启用了 Flashback Data Archive 的库。











