根本原因是当前会话无权限查询dba_hist*视图或awr快照范围不匹配;需确认用户权限、awr保留期、实例状态(status=open)、dbid/inst_num/快照id参数准确,且html报告须通过web服务器访问而非双击打开。
运行 @?/rdbms/admin/addmrpt.sql 为什么没输出报告?
根本原因通常是当前会话没权限查 dba_hist* 视图,或 awr 快照范围不匹配。这个脚本本质是调用 dbms_addm 包生成 addm 分析结果,不是直接导出文本——它依赖后台已采集的 awr 数据。
- 确保用户有
SELECT_CATALOG_ROLE或显式授予SELECT权限给DBA_HIST_SNAPSHOT、DBA_HIST_SEG_STAT等表 - 检查 AWR 保留期:
SELECT retention FROM dba_hist_wr_control;,若快照已被清理(比如只保留 8 天),而你要查上周的区间,就必然无结果 - 脚本默认使用最近两次快照(
LAST_TWO_SNAPS),但若实例刚重启过、或采样间隔被改大(如设成 2 小时一次),可能中间没足够数据支撑 ADDM 分析 - 运行前先确认实例状态:
SELECT instance_name, status FROM v$instance;,STATUS必须是OPEN,否则addmrpt.sql会静默退出
addmrpt.sql 的三个关键参数怎么填才不报错?
它接受三个位置参数:数据库 ID(dbid)、实例号(inst_num)、分析起止快照 ID(begin_snap 和 end_snap)。最容易错的是前两个——它们不是“随便填”,而是必须和当前环境对得上。
-
dbid:从v$database查,不是db_name,也不是ORACLE_SID;执行SELECT dbid FROM v$database;拿到后直接粘贴,别手输 -
inst_num:单实例填 1;RAC 环境必须填目标实例编号,查SELECT instance_number FROM gv$instance WHERE instance_name = 'xxx'; - 快照范围必须满足:
begin_snap ,且两者都存在于 <code>dba_hist_snapshot中;建议先跑SELECT snap_id, begin_interval_time FROM dba_hist_snapshot ORDER BY snap_id DESC FETCH FIRST 10 ROWS ONLY;看可用快照
报告里 “FINDING” 和 “RECOMMENDATION” 对不上怎么办?
ADDM 报告里的建议不是 SQL 重写指南,而是基于资源争用路径的根因推断。常见错觉是看到 “SQL_ID xxx 占 CPU 高”,就以为该优化那条 SQL——其实 ADDM 可能真正指向的是共享池不足、或 PGA 设置太小导致大量硬解析,那条 SQL 只是表象。
- 重点看每个
FINDING下的Affected Area字段:如果是Database Instance或Memory Configuration,说明问题在实例级配置,不是某条 SQL 的锅 -
RECOMMENDATION里出现increase sga_target或adjust pga_aggregate_limit时,要结合v$sgastat和v$pgastat实际值判断是否真缺内存,不能直接照搬 - 如果报告里反复出现
Buffer Cache相关发现,但db_cache_size已设得很大,就得查是否有大量全表扫描或索引失效——ADDM 不会告诉你哪个表没建索引,它只说“缓存效率低”
为什么 addmrpt.sql 生成的 HTML 报告打开是空白?
这是 Oracle 12c+ 常见问题,根源是脚本默认输出路径在服务器本地($ORACLE_HOME/rdbms/admin),且生成的是相对路径引用的 HTML + JS 文件。你用浏览器直接双击打开,JS 加载失败,页面就空了。
- 别双击打开,用
sqlplus连接后运行脚本时加spool导出纯文本:SPOOL /tmp/addm_report.txt,再@?/rdbms/admin/addmrpt.sql,最后SPOOL OFF - 若非要 HTML 版,必须把整个输出目录(含
addmrpt_*.html和同名.js文件)一起下载到本地,用 Web 服务器(如 Python 的python3 -m http.server)起个临时服务访问,不能直接 file:// - Oracle 19c 起推荐用
DBMS_ADDM.GET_REPORT函数直接取 CLOB,再用 PL/SQL 写文件,绕过脚本路径陷阱
ADDM 不是万能诊断器,它只能分析 AWR 已采集的维度;如果某类等待事件(比如 enq: TX - row lock contention)没被采样进 ASH,ADDM 就看不到锁竞争。真正难的从来不是跑出报告,而是判断报告里哪条 Finding 是噪音、哪条背后连着业务逻辑缺陷。










