RAC环境下必须用awrgrpt.sql并输入ALL才能生成全局AWR报告,因awrrpt.sql仅调用单实例函数AWR_REPORT_HTML,只接受一个inst_num参数,无法聚合多节点数据,导致Global Cache等RAC指标缺失、Top SQL仅反映本节点负载。
直接结论:用 @?/rdbms/admin/awrrpt.sql 脚本,但 RAC 环境下必须改用 @?/rdbms/admin/awrgrpt.sql 并输入 ALL,否则只出单节点数据。
因为 awrrpt.sql 底层调用的是 DBMS_WORKLOAD_REPOSITORY.AWR_REPORT_HTML,该函数只接受一个 inst_num 参数。你在节点1上执行,它就只查 inst_num=1 的快照 —— 即使集群有4个实例,RAC 特有指标(如 Global Cache Blocks Received)会消失,Top SQL 也只反映本节点负载。实际瓶颈可能在节点3的锁争用上,但你完全看不到。
常见问题表现:
gc buffer busy acquire)awrgrpt.sql 调用的是 DBMS_WORKLOAD_REPOSITORY.AWR_GLOBAL_REPORT_HTML,这才是真正支持多实例聚合的函数。关键交互点只有两个:
Enter value for inst_num: 时,必须输入 ALL(全大写,不能是 all、All 或留空)DB Id 不能回车跳过;RAC 环境下要手动输入,可用 SELECT dbid FROM v$database; 查num_days 是筛选快照列表的时间范围(比如输 3 就列出最近3天内的快照),不是报告跨度;选完后从列表里抄 begin_snap 和 end_snap,别自己估算如果你要分析的是某个 PDB(例如 PDB_PRODCORE),不能在 CDB$ROOT 里直接跑 awrgrpt.sql。否则报告全是 CDB 后台进程(ora_w001_* 类进程),业务 SQL 几乎不出现。
操作顺序必须是:
ALTER SESSION SET CONTAINER = PDB_PRODCORE;
dbid:SELECT dbid FROM v$database;(注意:PDB 的 dbid ≠ CDB 的 dbid)@?/rdbms/admin/awrgrpt.sql,这时列出的快照 ID 才是该 PDB 实际有数据的那些SELECT_CATALOG_ROLE 可能未激活,需重新验证:SELECT * FROM session_roles WHERE role = 'SELECT_CATALOG_ROLE';;没返回就临时授予权限:GRANT SELECT_CATALOG_ROLE TO sys;
ORA-01031: insufficient privileges 或 ORA-00942: table or view does not exist 多半不是因为没用 sysdba 登录,而是 SELECT_CATALOG_ROLE 没激活。即使你用 sqlplus / as sysdba 登录,该角色默认也不一定启用。
特别注意:
inst_num=ALL 是触发全局聚合的唯一开关,漏掉这一步,其余参数再准也没用oracle 用户可写,否则脚本静默失败,不报错但无文件生成最常被跳过的动作是:输 ALL 之前没确认当前连接的是目标 PDB,也没查对应 dbid。这两个点一错,生成的报告要么内容错位,要么根本跑不起来。