awrrpt.sql在pdb内直接运行会报ora-13541等错误,因其底层函数要求session必须位于cdb$root,且pdb无独立wrm_database_instance元数据;12.2+启用awr_pdb_autoflush_enabled后,需在cdb$root中选awr_pdb选项才能生成真正pdb级报告。
oracle 12c多租户下,awrrpt.sql 脚本本身不支持直接生成纯 pdb 级别 awr 报告——它只能在 cdb$root 中运行,且输出默认包含所有 pdb 的混合数据;真正能按 pdb 过滤并聚焦的报告,必须依赖 pdb 级别启用的 awr 自动刷新机制(12.2+)或手动指定容器上下文 + 正确视图过滤。
为什么直接在 PDB 里运行 awrrpt.sql 会报错或无效
在 PDB 内执行 @?/rdbms/admin/awrrpt.sql 时,脚本底层调用 DBMS_WORKLOAD_REPOSITORY.AWR_REPORT_HTML,而该函数要求当前 session 必须位于 CDB$ROOT,否则触发 ORA-13541 或权限类错误。即使你连的是 PDB,脚本仍尝试从 V$DATABASE 读取 DBID 和实例信息,但 PDB 没有独立的 WRM$_DATABASE_INSTANCE 元数据,导致查询失败或静默返回空结果。
- 错误现象:
ERROR at line 1: ORA-13541: system moving window baseline size (86400) greater than retention (7200)—— 实际是上下文切换失败,不是 baseline 配置问题 - 不能靠
ALTER SESSION SET CONTAINER = pdb1后再跑awrrpt.sql:脚本不识别该切换,仍以 CDB 视角初始化参数 -
awrrpt.sql不接受con_id或pdb_name参数,无任何 PDB 过滤入口
12.2+ 启用 PDB 级 AWR 后,如何用 awrrpt.sql 生成“逻辑上 PDB 级”的报告
前提是你已在目标 PDB 启用了 awr_pdb_autoflush_enabled=true,且修改了 SNAP_INTERVAL(默认 40150 天,必须设为合理值如 +00000 00:15:00.0),此时 PDB 会产生自己的快照记录(存于 AWR_PDB_SNAPSHOT 表,非 DBA_HIST_SNAPSHOT)。
- 进入 CDB$ROOT,确认 PDB 快照已生成:
SELECT con_id, snap_id, begin_interval_time FROM cdb_hist_snapshot WHERE con_id = <pdb_con_id> AND rownum </pdb_con_id> - 运行
awrrpt.sql时,在 “Location of AWR Data” 提示处选择AWR_PDB(不是默认的AWR_ROOT)——这是关键一步,选错就回到 CDB 混合视图 - 后续提示中输入的
Database ID和Instance Number仍填 CDB 的 DBID 和任意有效 inst_num(如 1),脚本会自动按当前选定的 AWR 数据源(AWR_PDB)过滤出该 PDB 的快照范围 - 报告中 Top SQL、Wait Events 等章节将只显示该 PDB 的数据,且 SQL 列表里不再出现
PDB Name列(因为已是单 PDB 上下文)
不启用 PDB 级 AWR 时,如何用 CDB 视图“模拟”PDB 报告
若仍使用传统 CDB 统一快照(CON_ID = 0 在 DBA_HIST_SNAPSHOT),则无法通过 awrrpt.sql 直接隔离 PDB,但可用 SQL 手动聚合关键指标:
- 查某 PDB(
con_id = 3)最近 1 小时的平均 I/O 等待时间:SELECT event, SUM(wait_time_milli)/SUM(total_waits) avg_ms FROM dba_hist_system_event e JOIN dba_hist_snapshot s USING (snap_id) WHERE e.con_id = 3 AND s.begin_interval_time > SYSDATE - 1/24 AND event LIKE 'db file%' GROUP BY event; - 避免用
V$SQL替代:它不含历史维度,且 PDB 内V$SQL只反映当前内存中的游标,与 AWR 时间线无关 - 注意
DBA_HIST_SQLSTAT的EXECUTIONS_DELTA是累积差值,需按SNAP_ID排序后两两相减,不能直接 SUM - 所有过滤必须基于
CON_ID字段,且仅对明确声明支持多租户的视图有效(如DBA_HIST_ACTIVE_SESS_HISTORY、DBA_HIST_SQLSTAT;DBA_HIST_SNAPSHOT的CON_ID永远为 0)
awrrpt.sql 在多租户下的典型误操作和兼容性陷阱
很多人以为只要进了 PDB 就能“自然”获得 PDB 级报告,实际整个链路对版本、参数、脚本路径都敏感:
- 12.1 及更早版本:根本不存在
AWR_PDB选项,awrrpt.sql的 Location 提示里只有AWR_ROOT,强行选 PDB 名称会报错 - 未设置
AWR_SNAPSHOT_TIME_OFFSET:多个 PDB 同时刷快照可能引发 CPU 尖峰,尤其在高并发 OLTP 场景;建议设为1000000(系统自动错开) - RAC 环境下,
awrrpt.sql默认只取当前连接实例,即使你在 CDB$ROOT 也看不到其他节点的 PDB 数据——跨实例对比必须用awrgrpt.sql并输ALL -
awrrpt.sql输出的 HTML 报告里,“Instance Efficiency Percentages”等指标若异常高(如 Buffer Nowait% = 99.99%),大概率是因为它只采了单节点缓存行为,掩盖了 RAC 全局争用
真正决定是否能拿到干净 PDB 级报告的,不是脚本怎么选,而是底层有没有为该 PDB 单独采集快照——这由 awr_pdb_autoflush_enabled 和 SNAP_INTERVAL 共同控制。其他所有操作,都是在这个前提下的调用路径选择。漏掉任一配置,awrrpt.sql 就只是个带 PDB 名字的 CDB 报告生成器。











