ORA-12953 SYSAUX空间爆满时,必须通过DBMS_WORKLOAD_REPOSITORY包安全清理AWR快照,严禁直删DBA_HIST_*或WRH$表;需先查并调整保留策略,再手动删除快照范围;WRH$表误删将致AWR报告失效,仅能由Oracle Support指导修复;DBA_HIST_DATABASE_INSTANCE数据异常需用REMOVE_SNAPSHOT_RANGE清理错误实例快照;空间释放后HWM不降须执行SHRINK SPACE或RESIZE数据文件。
ORA-12953:SYSAUX空间爆满,DBA_HIST_*表占满怎么办
直接删 dba_hist_snapshot 或手动 drop table 会报错、锁库、甚至破坏 awr 完整性——oracle 不允许直删 awr 基表。真正安全的入口只有一个:dbms_workload_repository 包。
清理必须走保留策略或显式快照范围删除,否则元数据和物理段会不一致,下次 AWR_REPORT 可能报 ORA-13516 或跳过历史周期。
- 先查当前保留天数:
SELECT retention FROM dba_hist_wr_control; - 临时缩短(比如从 8天缩到 3天):
EXEC DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(retention => 4320);(单位是分钟) - 立即生效,但不会立刻释放空间;需等下一次自动清理窗口(默认凌晨2点)或手动触发:
EXEC DBMS_WORKLOAD_REPOSITORY.DROP_SNAPSHOT_RANGE(low_snap_id => 1000, high_snap_id => 2000);
误删 WRH$_ 表导致 AWR 报告失效怎么办
WRH$_ 开头的表(如 WRH$_SYSSTAT)是 AWR 的底层堆表,Oracle 内部用物化视图日志+快照刷新机制维护。一旦被 DROP 或 TRUNCATE,AWR_REPORT_TEXT 会返回空结果或 ORA-00942,且无法通过重建恢复。
唯一补救路径是用 DBMS_SWRF_INTERNAL(非公开包,仅限 Oracle Support 指导下使用)重注册快照元数据,但风险极高;生产环境更稳妥的做法是:停用 AWR 采集 → 导出当前有效快照 → 重建 SYSAUX 表空间(极端情况)→ 重导入。
- 确认损坏程度:
SELECT table_name FROM dba_tables WHERE table_name LIKE 'WRH$%' AND owner = 'SYS' AND status != 'VALID'; - 禁止自行运行
catawr.sql或重运行awrrpti.sql脚本,可能覆盖已有快照定义 - 如果只是部分
WRH$_表缺失但DBA_HIST_*视图仍可查,说明物化视图未断裂,可暂不处理
诊断库(DBA_HIST_DATABASE_INSTANCE)数据异常导致跨库比对失败
诊断库中 DBA_HIST_DATABASE_INSTANCE 记录每个数据库实例的启动时间、DBID、版本等关键锚点信息。若该表里存在重复 DBID + 不同 INSTANCE_NUMBER 的记录,或 STARTUP_TIME 明显错乱(如早于建库时间),会导致 AWR_DIFF_REPORT_TEXT 无法对齐时间轴,报 ORA-13541。
这不是空间问题,而是逻辑一致性问题。不能删,只能修正:
- 查异常记录:
SELECT dbid, instance_number, startup_time, COUNT(*) FROM dba_hist_database_instance GROUP BY dbid, instance_number, startup_time HAVING COUNT(*) > 1; - 确认是否为 RAC 多实例误采集(常见于未正确配置
instance_name);若是,应统一用DBMS_WORKLOAD_REPOSITORY.REMOVE_SNAPSHOT_RANGE清理掉错误实例的快照段 - 切勿 UPDATE
DBA_HIST_DATABASE_INSTANCE—— 它是只读视图,底层是WRM$_DATABASE_INSTANCE,直接改会破坏字典完整性
SYSAUX 空间释放后仍显示高水位(HWM)不降
即使删完快照,SELECT bytes/1024/1024 FROM dba_segments WHERE tablespace_name = 'SYSAUX' AND segment_name LIKE 'WRH$%'; 总和下降了,但表空间总使用率没变——这是因为 Oracle 不自动收缩数据文件,高水位线卡在原处,DBA_FREE_SPACE 里也看不到新增空闲块。
必须手工 shrink segment 或 resize datafile,但有前提:
- 确认表空间为本地管理(
EXTENT MANAGEMENT LOCAL),且段空间管理为AUTO(99% 默认) - 对单个大段 shrink:
ALTER TABLE wrh$_sysstat SHRINK SPACE CASCADE;(注意:需表启用行移动:ALTER TABLE wrh$_sysstat ENABLE ROW MOVEMENT;) - 收缩数据文件前,先查最小可 resize 值:
SELECT file_id, bytes, maxbytes, (bytes - NVL((SELECT SUM(bytes) FROM dba_free_space WHERE file_id = a.file_id), 0)) used_bytes FROM dba_data_files a WHERE tablespace_name = 'SYSAUX';,再执行ALTER DATABASE DATAFILE '/path/to/sysaux01.dbf' RESIZE 2G;
shrink 和 resize 都要独占 IO,建议在低峰期做;如果用了 ASM,RESIZE 不适用,得靠 REBALANCE 或迁移段。

















