PDB级AWR需先确认awr_pdb_autoflush_enabled=TRUE且SNAP_INTERVAL为+00000 01:00:00.0,再手动创建快照并指定AWR_PDB源生成报告,否则仍获CDB混杂数据。

必须先确认 PDB 是否启用独立 AWR
Oracle 12.2+ 才支持 PDB 级别独立 AWR,但默认关闭。不检查就直接跑 @?/rdbms/admin/awrrpt.sql,哪怕在 PDB 里执行,也只会生成基于 CDB 快照的报告(AWR_ROOT),内容混杂所有 PDB,无法定位单个 PDB 的瓶颈。
确认方式很简单:
- 连接到目标 PDB:
ALTER SESSION SET CONTAINER = your_pdb_name; - 查参数:
SHOW PARAMETER awr_pdb_autoflush_enabled—— 必须是TRUE - 查控制表:
SELECT SNAP_INTERVAL, RETENTION FROM cdb_hist_wr_control;—— 若SNAP_INTERVAL显示+00000 01:00:00.0(而非+40150 00:01:00.0),说明已切换为 PDB 自主快照周期
手动触发快照前先等 1 小时或主动创建
PDB 独立 AWR 默认每小时自动刷一次快照,但首次启用后不会立刻生效。如果刚打开 awr_pdb_autoflush_enabled,直接生成报告会报错:no snapshots found for the specified range。
两种应对方式:
- 等至少 1 小时,让后台进程自动生成首个 PDB 快照(查
SELECT * FROM awr_pdb_snapshot ORDER BY snap_id DESC;) - 立即手动创建:
EXEC DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT();—— 注意:该命令在 PDB 内执行,写入的是awr_pdb_snapshot表,不是dba_hist_snapshot
别跳过这步。很多用户卡在“选完时间范围却提示无快照”,根源就是没在 PDB 里真正生成过快照。
执行脚本时必须选 AWR_PDB,不能用默认
@?/rdbms/admin/awrrpt.sql 在 PDB 中运行后,会问:Specify the location of AWR Data。这里默认值是 AWR_ROOT,选它就白忙了。
务必输入:AWR_PDB
后续步骤和 CDB 一致:选格式(html)、输天数、选起止 snap_id(此时查的是 awr_pdb_snapshot,不是 dba_hist_snapshot)、命名文件。生成的报告只含当前 PDB 的 SQL、等待事件、ASH 数据,不含其他 PDB 干扰项。
常见错误:看到提示里写着 “AWR_ROOT - Use AWR data from root (default)” 就直接回车,结果报告里还带着别的 PDB 的 top SQL。
19c 及以后版本可跳过部分设置,但仍有隐性依赖
Oracle 19c 起,PDB 启用 AWR 的门槛降低,awr_pdb_autoflush_enabled 默认为 TRUE,但仍有两个关键点容易被忽略:
-
AWR_SNAPSHOT_TIME_OFFSET仍建议设为非零值(如1000000),否则多个 PDB 同时刷快照可能引发 I/O 冲突 - 即使参数开启,若 PDB 处于
READ ONLY状态,CREATE_SNAPSHOT()会失败 —— 需先ALTER PLUGGABLE DATABASE your_pdb OPEN READ WRITE;
生成报告本身不难,难的是让数据干净地隔离。PDB 级 AWR 不是开关一开就自动生效,它依赖快照源、权限上下文、参数协同,三者缺一不可。


















