Oracle 12.2+才支持真正的PDB级AWR报告,需确认版本≥12.2.0.x、在目标PDB启用awr_pdb_autoflush_enabled、于CDB$ROOT执行awrrpt.sql并指定AWR_PDB,且合理配置快照时间偏移。

Oracle 12.2+ 才能真正生成 PDB 级 AWR 报告
低于 12.2 的版本(如 12.1)压根不支持 PDB 级快照,DBA_HIST_SNAPSHOT 中所有 CON_ID 都是 0,强行在 PDB 内运行 @?/rdbms/admin/awrrpt.sql 会报 ORA-13541 或静默失败。确认版本的唯一可靠方式是:SELECT banner_full FROM v$version,看到 12.2.0.x 或更高才继续。
必须在目标 PDB 中启用 awr_pdb_autoflush_enabled
即使版本达标,PDB 默认也不会生成自己的快照——awr_pdb_autoflush_enabled 默认为 FALSE。不设这个参数,DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT() 在 PDB 内调用无效,后续报告只能走 AWR_ROOT(即 CDB 快照 + CON_ID 过滤),不是真隔离。
操作步骤如下:
- 先切到目标 PDB:
ALTER SESSION SET CONTAINER = pdb_name; - 启用自动刷新:
ALTER SYSTEM SET awr_pdb_autoflush_enabled = TRUE; - 验证生效:
SELECT value FROM v$parameter WHERE name = 'awr_pdb_autoflush_enabled';返回TRUE
注意:该参数不能在 CDB$ROOT 设置,也不支持 SCOPE=SPFILE;它只对当前 PDB 生效,重启后需重设。
在 CDB$ROOT 中运行 awrrpt.sql 并选 AWR_PDB
awrrpt.sql 只能在 CDB$ROOT 下运行,且脚本本身不识别 ALTER SESSION SET CONTAINER。直接在 PDB 里执行必然报错,因为底层函数 DBMS_WORKLOAD_REPOSITORY.AWR_REPORT_HTML 要求 session 必须在根容器。
正确流程是:
- 连到
CDB$ROOT:ALTER SESSION SET CONTAINER = CDB$ROOT; - 执行脚本:
@?/rdbms/admin/awrrpt.sql - 关键一步:当提示
Enter value for awr_location:时,**必须输入AWR_PDB**(默认是AWR_ROOT) - 后续的
Database ID和Instance Number填 CDB 的即可(如DBID和inst_num = 1),脚本会自动按所选AWR_PDB数据源过滤出该 PDB 的快照范围
如果漏掉这步,报告里 SQL 列表仍带 PDB Name,Top SQL、Wait Events 等全是混合数据,不是你要的 PDB 级视图。
快照时间偏移和手动触发要小心
多个 PDB 同时启用 awr_pdb_autoflush_enabled 时,若快照撞在同一秒,会引发严重性能抖动(CP)。必须在 CDB$ROOT 设置 awr_snapshot_time_offset 错开采集时间:
-
ALTER SYSTEM SET awr_snapshot_time_offset = 1000000 SCOPE=BOTH;(单位微秒,即 1 秒) - PDB 内可单独调优快照间隔:
EXEC DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(interval => 60);(单位分钟) - 手动触发快照前务必确认已切到目标 PDB:
ALTER SESSION SET CONTAINER = pdb_name;,再执行EXEC DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT();
生成后查快照要用 CDB_HIST_SNAPSHOT(不是 DBA_HIST_SNAPSHOT),并加 WHERE CON_ID = <pdb_con_id></pdb_con_id> 过滤。


















