awrrpt.sql在RAC下只能看到单节点数据,因其调用单实例函数AWR_REPORT_HTML,仅接受一个inst_num参数,默认取当前连接实例;必须改用awrgrpt.sql并输入ALL才能触发全局聚合函数AWR_GLOBAL_REPORT_HTML。

为什么用 awrrpt.sql 在 RAC 下只能看到单节点数据
因为 awrrpt.sql 本质是单实例脚本,它调用的是 DBMS_WORKLOAD_REPOSITORY.AWR_REPORT_HTML,这个函数只接受一个 inst_num 参数。你在节点1上连上去执行,哪怕集群有4个实例,它也默认只查当前实例(inst_num=1),不会跨节点聚合。常见现象是:报告里 “Global Cache Blocks Received” 这类 RAC 特有指标直接消失,Top SQL 只显示本节点的语句,而实际瓶颈可能在节点3的锁争用上。
必须用 awrgrpt.sql 并输 ALL 才能生成全局报告
进 SQL*Plus 后运行:@?/rdbms/admin/awrgrpt.sql,关键交互点只有两个:
- 当提示
Enter value for inst_num:时,必须输入ALL(全大写,不能是 all、All 或留空) -
DB Id要手动输入,RAC 环境下不能回车跳过;可用SELECT dbid FROM v$database;查 -
num_days是筛选快照列表的范围,不是报告时间跨度;选完后从列表里抄begin_snap和end_snap,别自己估算
PDB 场景下还要先切容器
如果你的目标是分析某个 PDB(比如 PDB_PRODCORE),不能在 CDB$ROOT 里直接跑 awrgrpt.sql。否则报告里全是 CDB 后台进程,业务 SQL 基本不出现。
- 先执行:
ALTER SESSION SET CONTAINER = PDB_PRODCORE; - 再查该 PDB 的
dbid:SELECT dbid FROM v$database;(注意:PDB 的 dbid ≠ CDB 的 dbid) - 然后运行:
@?/rdbms/admin/awrgrpt.sql,这时列出的快照 ID 仅限该 PDB 有数据的那些
权限和角色容易被忽略的细节
ORA-01031: insufficient privileges 或 ORA-00942: table or view does not exist 多半是因为没激活 SELECT_CATALOG_ROLE。即使你用 sqlplus / as sysdba 登录,也不能保证该角色已启用。
- 执行:
SELECT * FROM session_roles WHERE role = 'SELECT_CATALOG_ROLE';,有返回才说明激活 - 没返回?临时授予权限:
GRANT SELECT_CATALOG_ROLE TO sys;(仅限本次诊断,事后可回收) - RAC + PDB 组合场景下,切换容器后要重新验证角色是否仍激活
RAC 全局报告依赖 inst_num=ALL 这个开关,它触发底层 DBMS_WORKLOAD_REPOSITORY.AWR_GLOBAL_REPORT_HTML 函数;漏掉这一步,其余参数再准也没用。


















