oracle 11g 彻底弃用手动回滚段,因启动时若 undo_management=manual 会报 ora-01552 致实例无法打开,且 create rollback segment 语句已废弃并报 ora-00439;所有 dml 回滚统一由自动管理的 undo 表空间承载。

Oracle 11g 中已完全弃用手动管理的回滚段(rollback segments),必须使用自动管理的 UNDO 表空间。任何试图配置传统回滚段的操作都会失败或被忽略,强行启用会触发 ORA-01552 等错误。
为什么不能用 rollback segment?
Oracle 9i 起默认启用自动 UNDO 管理,11g 彻底移除手动回滚段支持:
- 启动时若
undo_management=MANUAL,实例无法打开,报错ORA-01552: cannot use system rollback segment for non-system tablespace -
CREATE ROLLBACK SEGMENT语句在 11g 中已被废弃,执行即报ORA-00439: feature not enabled: Manual Undo Management - 所有 DML 的回滚信息统一由
UNDO_TABLESPACE中的数据文件承载,不再有独立的回滚段对象
UNDO 表空间的核心配置项
大吞吐量业务下,UNDO 配置不当会导致 ORA-01555(快照过旧)、事务阻塞或 UNDO 表空间暴涨。关键参数如下:
-
undo_management=AUTO(必须,且不可更改) -
undo_tablespace=UNDOTBS1(指定一个专用 UNDO 表空间,不建议共用 SYSTEM 或其他用户表空间) -
undo_retention=1800(单位秒;建议设为最长运行查询的预计执行时间,OLTP 场景通常 900–3600,报表类可设更高) -
_undo_autotune=false(强烈建议关闭;11g 默认开启的自动调优会动态收缩 UNDO 区,高并发下易引发ORA-01555)
示例:
ALTER SYSTEM SET undo_retention = 3600 SCOPE=BOTH;
UNDO 表空间大小怎么定?
不能只看 undo_retention,必须结合实际写入速率估算:
- 查当前 UNDO 每秒生成量:
SELECT (SUM(undoblks)*8192)/SUM(((end_time-begin_time)*86400)) AS bytes_per_sec FROM v$undostat; - 所需最小空间 ≈
bytes_per_sec × undo_retention,再加 20% 缓冲 - 数据文件必须启用
AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED,避免写满卡住事务 - 禁止将 UNDO 表空间放在 NFS 或低 IOPS 存储上;SSD/NVMe 是底线,RAID 10 推荐
容易被忽略的三个细节
大吞吐场景下,以下三点常被跳过,但直接影响稳定性:
- UNDO 表空间不能是
FORCE LOGGING模式——它本身不参与归档,强制日志反而增加 LGWR 压力 - 避免在 UNDO 表空间中创建任何用户对象,
CREATE TABLE ... TABLESPACE UNDOTBS1会静默失败或损坏内部结构 -
v$transaction.used_ublk和v$undostat.maxquerylen必须定期监控;前者突增说明长事务堆积,后者接近undo_retention值就预示风险











