Oracle 19c无自动业务过期数据清理功能,仅支持显式配置的底层存储回收;ORA-01653需先排查数据文件MAXSIZE、文件系统空间及SMALLFILE限制;真正可自动清理的仅审计、AWR和临时段三类,且须手动启用策略并满足前提条件。Oracle 19c **没有“自动空间优化功能”来管理过期数据**——这是个常见误解。它不会像某些NoSQL或时序数据库那样自动识别并删除业务意义上的“过期数据”(比如订单表里3年前的状态为'CLOSED'的记录)。所谓“自动”,仅限于底层存储回收(如临时段、AWR快照、审计记录),且全部依赖显式配置或事件触发,不是按业务时间字段自动扫描清理。
ORA-01653 报错时,别急着写 DELETE 脚本
很多 DBA 看到表空间报满、ORA-01653,第一反应是“查出过期数据删掉”。但实际问题往往在存储层:
-
AUTOEXTENSIBLE = 'YES'但MAXSIZE卡在 1G 或 32G,扩容到顶就停住 - 数据文件所在文件系统磁盘已满(
ORA-01119会同时出现在 alert log) - 表空间是 SMALLFILE 类型,单个数据文件逼近 32GB 上限,RESIZE 已无效
SELECT file_name, bytes/1024/1024 AS curr_mb, maxbytes/1024/1024 AS max_mb, autoextensible FROM dba_data_files WHERE tablespace_name = 'USERS';确认是不是真缺空间,还是配置半残。
真正能“自动清理”的只有三类对象,且需手动开闸
Oracle 19c 中以下组件支持基于策略的自动清理,但必须主动启用,不是默认打开:
-
DBMS_AUDIT_MGMT:统一审计数据(AUDSYS表空间)——需调用INIT_CLEANUP+SET_LAST_ARCHIVE_TIMESTAMP+CLEAN_AUDIT_TRAIL -
DBMS_SCHEDULER的窗口任务(如MAINTENANCE_WINDOW):可配置自动清理 AWR 快照,依赖STATISTICS_LEVEL = TYPICAL和SYSAUX空间余量 -
DBMS_SPACE_ADMIN的临时段合并:仅对 LMT 临时表空间有效,靠ALTER TABLESPACE TEMP COALESCE触发,非实时
COALESCE 不等于“清空”,它只合并相邻空闲 extent;CLEAN_AUDIT_TRAIL 不会删未归档的审计记录,必须先设归档时间戳。
V$TEMPSEG_USAGE 显示残留?大概率不用管
查询 V$TEMPSEG_USAGE 发现大量 STATUS = 'INACTIVE' 记录,别立刻怀疑泄露:
- 对应会话的
LAST_CALL_ET > 3600,但 OS 层ps -p <spid></spid>已不存在 → 是僵死会话残留,SMON 每 5 分钟才轮询一次,等它下次扫描自然消失 -
V$SORT_SEGMENT.USED_EXTENTS = 0→ 这是已释放但字典未刷新的“幽灵段”,无法人工干预,只能等 SMON 合并时顺带抹除 - 临时文件显示 100% 占用 ≠ 真没空间 → 看
V$TEMP_SPACE_HEADER.FREE_BLOCKS,Oracle 不收缩 tempfile,空闲块仍可重用
DROP_SEGMENTS 事件清理,可能因 ST 锁等待失败,还可能跳过分布式事务挂起导致的段——根源不解决,清理无意义。
真正容易被忽略的是:所有“自动”动作都建立在精确的策略配置和状态前提上。比如 AWR 清理依赖 DBA_HIST_WR_CONTROL 中的 RETENTION 值,而这个值若设为 NULL 或 0,哪怕窗口任务跑再多次也不会删一条快照。











