UNDO表空间“不释放”实为过期段无法重用,根源是\_undo\_autotune开启导致undo\_retention失效、数据文件非自动扩展三者叠加;关闭\_undo\_autotune或切换新UNDO表空间方可恢复空间重用。
undo 表空间在 oracle 11g 中“不释放”不是真的卡死,而是空间没被回收重用 —— 根本原因在于 _undo_autotune 自动调优开启 + undo_retention 实际失效 + 数据文件非自动扩展 三者叠加,导致过期 undo 段无法及时覆盖,表空间物理文件也不收缩。
_undo_autotune 开启后 undo_retention 失效是常态
Oracle 11g 默认启用隐含参数 _undo_autotune=true,它会动态计算一个叫 TUNED_UNDORETENTION 的值(查 v$undostat),并强制覆盖你手动设的 undo_retention。
这意味着:
- 即使你执行了
alter system set undo_retention = 900,实际保留时间可能被拉长到几小时甚至更久 -
DBA_UNDO_EXTENTS.STATUS中大量显示UNEXPIRED(已提交但未到期),它们不能被覆盖,持续占空间 - 物理上数据文件不会缩小,哪怕所有事务都结束了
验证方式:
SELECT MAX(TUNED_UNDORETENTION) FROM v$undostat;如果这个值远大于你设的
undo_retention,就是它在起作用。
非自动扩展的 UNDOTBS 会让 Oracle “宁可撑死也不丢数据”
当 undo 表空间的数据文件设置为 autoextend off,Oracle 会认为“空间很珍贵”,于是:
- 优先延长 undo 保留时间,避免
ORA-01555(快照太旧) - 哪怕有大量
EXPIRED区段,也可能因算法保守而暂不重用 -
DBA_DATA_FILES.BYTES不变,dba_undo_extents里却长期存在几百个UNEXPIRED段
典型现象:
-
select status, count(*) from dba_undo_extents group by status返回大量UNEXPIRED -
select sum(bytes)/1024/1024 from dba_data_files where tablespace_name = 'UNDOTBS1'显示空间几乎占满 - 但
v$rollstat显示XACTS = 0(无活跃事务)
真正能“释放空间”的操作只有两种,且效果不同
物理空间(datafile 大小)不会自动缩小,所谓“释放”指的是让空间可被新事务重用:
关闭自动调优(最直接)
alter system set "_undo_autotune" = false scope=spfile;
重启后,undo_retention生效,UNEXPIRED会随时间自然转为EXPIRED并被覆盖-
切换到新 undo 表空间(见效快,但需停业务或协调 PDB)
CREATE UNDO TABLESPACE undotbs2 DATAFILE '/path/undotbs2.dbf' SIZE 2G AUTOEXTEND ON;
alter system set undo_tablespace = undotbs2;旧UNDOTBS1在确认无ACTIVE段后,可drop tablespace undotbs1 including contents and datafiles
注意:drop 前必须确保:
- 所有会话已切到新 undo
-
select status from dba_undo_extents where tablespace_name = 'UNDOTBS1'只剩EXPIRED -
v$transaction和v$session中无关联事务
_undo_autotune 关闭后,undo_retention 才真正可控;但即使关了,已分配的 datafile 也不会自动 shrink —— 这是 Oracle 的设计,不是 bug。想减小文件体积,只能重建 undo 表空间。


















