凌晨两点半,手机震了。屏幕上弹出一条告警:SYSAUX表空间使用率已超过95%。我揉了揉眼睛,第一反应不是赶紧去删数据,而是先问三个问题:它是怎么涨起来的?涨了多少?里面到底存了什么?
在Oracle数据库中,SYSAUX表空间是系统辅助表空间,从10g开始引入,专门用来承载AWR快照、统计信息历史、审计记录、优化器顾问、EM管理仓库等一堆“辅助功能”的数据。它的定位很清楚:帮DBA干活,替SYSTEM表空间分担压力。也正因为如此,它变成了一个什么都能往里塞的“杂物间”,一旦某个组件失控,整个表空间就会像吹气球一样鼓起来。更麻烦的是,SYSAUX空间耗尽会引发一系列连锁反应——AWR写不进去、统计信息收集失败、部分组件功能异常,严重时直接让数据库卡顿甚至hang住。
这篇文章不是泛泛的科普,而是把我处理这类故障的完整套路拆给你看:接到告警后的诊断动作、占用空间的真凶排查、安全的清理步骤、我踩过的三个坑,以及怎么把这类问题变成“不该再犯”的运维事故。无论你是刚接触Oracle的运维新人,还是已经被SYSAUX折磨过几回的老手,这套方法都值得直接拿来用。
1. 告警之后:先别动清理,用三个查询定位症状
很多人接到表空间告警的第一反应是“赶紧删点东西把空间腾出来”,这恰恰是最危险的。SYSAUX里存的不只是垃圾数据,还有大量性能诊断数据、历史统计信息和基线记录,删错了轻则丢失报表数据,重则影响优化器行为。我自己的习惯是:接到告警之后,先花5到10分钟做三件事,把症状彻底看清楚,再决定怎么动手。
1.1 第一次查询:整体使用率与增长速度
先看全局。通过DBA_DATA_FILES和DBA_TABLESPACE_USAGE_METRICS,确认SYSAUX当前的总大小、已用空间、剩余空间,以及过去一周的增长趋势。注意,使用率视图里的USED_SPACE单位是数据块,需要乘以块大小再换算成MB。
sql复制-- 查看表空间整体使用情况
SELECT a.tablespace_name,
ROUND(a.bytes / 1024 / 1024, 2) AS total_mb,
ROUND((a.bytes - b.free_bytes) / 1024 / 1024, 2) AS used_mb,
ROUND(b.free_bytes / 1024 / 1024, 2) AS free_mb,
ROUND((a.bytes - b.free_bytes) / a.bytes * 100, 2) AS used_pct
FROM (SELECT tablespace_name, SUM(bytes) bytes
FROM dba_data_files
WHERE tablespace_name = 'SYSAUX'
GROUP BY tablespace_name) a,
(SELECT tablespace_name, SUM(bytes) free_bytes
FROM dba_free_space
WHERE tablespace_name = 'SYSAUX'
GROUP BY tablespace_name) b
WHERE a.tablespace_name = b.tablespace_name;
这个查询只是确认现状。真正有意思的是增长速率——我会把最近一周或一个月的AWR快照(如果还能生成的话)拉出来,看SYSAUX的占用曲线是“平缓爬坡”还是“垂直起飞”。如果是几天内突然涨了几个GB,那大概率是某个后台任务或者配置变更引起的,比如审计策略被打开、统计信息收集异常、AWR基线被大量创建。如果是缓慢增长,那多半是保留策略设置不当,AWR数据越攒越多。
1.2 第二次查询:SYSAUX内部占用排行
确认整体之后,马上把矛头指向SYSAUX的内部组件。Oracle提供了一个专门视图V$SYSAUX_OCCUPANTS,它能告诉你每个组件占了多少空间,以及组件的名称和描述。这是诊断的最高效入口。
sql复制-- 查看SYSAUX内部所有组件占用情况
SELECT occupant_name,
occupant_desc,
space_usage_kbytes / 1024 AS usage_mb,
schema_name,
move_procedure
FROM v$sysaux_occupants
ORDER BY space_usage_kbytes DESC;
一般情况下,排在最前面的会是SM/AWR(AWR快照仓库)、SM/OPT(优化器统计信息历史)、SM/ADVISOR(顾问任务结果),以及可能存在的AUD$审计表。这一步能让你快速锁定大致方向。但要注意,V$SYSAUX_OCCUPANTS只统计组件自己上报的空间,并不精确到每个段对象;有些组件上报的数值与实际段大小有偏差,尤其是AWR相关的表,所以这个视图只能作为方向参考,不能作为清理依据。
1.3 第三次查询:定位到具体段对象
方向定下来之后,直接下钻到DBA_SEGMENTS,按段大小排序,把SYSAUX里占用空间最大的前20个对象揪出来。这一步才是“破案”的关键。
sql复制-- 查看SYSAUX表空间中占用空间最大的前20个段
SELECT *
FROM (SELECT segment_name,
