最常见原因是statistics_level设为basic,导致awr快照元数据存在但所有采样字段为空,报告全屏显示“no data exists for this section of the report”;需改为typical或all,并检查control_management_pack_access、sysaux空间及mmon进程状态。

STATISTICS_LEVEL参数设为BASIC导致快照无数据
AWR报告全屏显示“No data exists for this section of the report”,最常见原因是STATISTICS_LEVEL被设为BASIC。11g起,BASIC会禁用所有采样字段(SQL执行统计、等待事件、段I/O等),但快照元数据仍写入DBA_HIST_SNAPSHOT,造成“有快照、没数据”的假象。
验证命令:SELECT name, value FROM v$parameter WHERE name IN ('statistics_level', 'control_management_pack_access');
-
STATISTICS_LEVEL=BASIC→ 必须改为TYPICAL或ALL:ALTER SYSTEM SET STATISTICS_LEVEL=TYPICAL SCOPE=BOTH; -
CONTROL_MANAGEMENT_PACK_ACCESS=NONE→ 这是11.1–11.2的经典坑,即使STATISTICS_LEVEL正确,指标采集也会被许可证控制直接掐断,需联系Oracle支持启用诊断包 - 改完后必须重启MMON:执行
ALTER SYSTEM ENABLE RESTRICTED SESSION; ALTER SYSTEM DISABLE RESTRICTED SESSION;,否则新参数不生效
SYSAUX表空间不足或损坏阻塞快照写入
当ORA-01653出现在alert log中(如无法扩展SYS.SCHEDULER$_EVENT_LOG),说明SYSAUX已满或自动扩展被禁用,AWR根本无法写入新快照。
检查命令:SELECT TABLESPACE_NAME, STATUS FROM DBA_TABLESPACES WHERE TABLESPACE_NAME='SYSAUX';
- 确认状态为
ONLINE且有剩余空间:SELECT ROUND((TABLESPACE_SIZE - USED_SPACE) * 8 / 1024 / 1024, 2) free_mb FROM DBA_TABLESPACE_USAGE_METRICS WHERE TABLESPACE_NAME = 'SYSAUX'; - 若空间不足,优先清理历史ASH分区:
EXEC DBMS_WORKLOAD_REPOSITORY.DROP_SNAPSHOT_RANGE(low_snap_id => 1, high_snap_id => 1000);(注意:此操作不可逆) - 临时扩容(非生产环境慎用):
ALTER DATABASE DATAFILE '<syssaux_file_path>' RESIZE 4G;</syssaux_file_path>
MMON进程被Suspend或调度被禁用
日志中出现Suspending MMON slave action kewrmafsa_ for 82800 seconds或ORA-20200,说明MMON卡死或被策略挂起,快照调度完全中断。
确认当前快照设置:SELECT snap_interval, retention FROM dba_hist_wr_control;
- 若
snap_interval为+000000000 00:00:00.0,说明调度已被手动停用:EXEC DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(interval => 60); - MMON未响应时,不要直接重启实例;先尝试
ALTER SYSTEM ENABLE RESTRICTED SESSION; ALTER SYSTEM DISABLE RESTRICTED SESSION;强制重启后台进程 - 若仍无效,检查
v$session中是否有长时间卡在insert into wrh$_sql_bind_metadata的会话——这常因X$KQLFBC固定表膨胀导致,可执行ALTER SYSTEM FLUSH SHARED_POOL;缓解
WRH$_SQLTEXT过长触发ORA-06502截断失败
生成AWR报告时突然中断,报ORA-06502: character string buffer too small,且报告停在“Complete List of SQL Text”处,大概率是某条SQL文本超长(CLOB字段被PL/SQL过程截断时溢出)。
定位问题SQL:SELECT sql_id, LENGTH(sql_text) len FROM WRH$_SQLTEXT ORDER BY len DESC FETCH FIRST 5 ROWS ONLY;
- 该问题由Bug 7833620引起,官方补丁较重;临时方案是安全截断:
UPDATE WRH$_SQLTEXT SET sql_text = DBMS_LOB.SUBSTR(sql_text, 3000) WHERE LENGTH(sql_text) > 3000; - 注意:操作前务必在测试库验证,且
COMMIT后需重新生成报告 - 截断不影响运行时SQL执行,但报告中对应SQL将不完整;如需完整文本,可用报告中的
SQL_ID回查V$SQL
真正难排查的不是单一错误,而是多个条件叠加:比如STATISTICS_LEVEL=TYPICAL但CONTROL_MANAGEMENT_PACK_ACCESS=NONE,或者SYSAUX空间足够却因WRH$_ACTIVE_SESSION_HISTORY分区未归档导致插入失败。每次修复前,先跑一遍SELECT * FROM dba_hist_wr_control和v$parameter交叉验证,比盲目重启更省时间。











