必须先启用PDB级AWR并手动创建快照,再运行awrrpt.sql时显式指定AWR_PDB;否则默认获取CDB混杂数据,无法定位单个PDB的SQL或等待事件。

不能直接在PDB里跑 @?/rdbms/admin/awrrpt.sql 就得到干净的PDB报告——默认选 AWR_ROOT,结果全是CDB混杂数据,根本没法定位单个PDB的SQL或等待事件。
确认 PDB 是否真正启用了独立 AWR
Oracle 12.2+ 才支持 PDB 级 AWR,但默认关闭。不检查就动手,90% 的人会拿到错误报告。
- 先连到目标 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(表示按 PDB 自主周期),而不是+40150 00:01:00.0(那是 CDB 默认的 40150 天,等同于禁用)
手动创建 PDB 级快照,别依赖“等一小时”
即使参数设为 TRUE,首次启用后也不会立刻有快照。很多用户卡在 “no snapshots found for the specified range”,根源就是没真正在 PDB 里生成过快照。
- 必须在目标 PDB 内执行:
EXEC DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT(); - 验证是否成功:
SELECT * FROM awr_pdb_snapshot ORDER BY snap_id DESC FETCH FIRST 5 ROWS ONLY;—— 这张表只存在于 PDB 中,查不到说明快照没落库 - 注意:
CREATE_SNAPSHOT()在 PDB 内执行写入的是awr_pdb_snapshot,不是dba_hist_snapshot;在 CDB$ROOT 里执行则无效
运行脚本时必须显式指定 AWR_PDB
这是最常被跳过的致命步骤。脚本提示 “AWR_ROOT - Use AWR data from root (default)” 后直接回车,等于白做。
- 执行:
@?/rdbms/admin/awrrpt.sql - 当提示
Specify the location of AWR Data时,**必须输入AWR_PDB**,不能留空或回车 - 后续选时间范围时,查的 snap_id 来源是
awr_pdb_snapshot,不是dba_hist_snapshot;如果之前没手动建快照,这里仍会报错 - 生成的 HTML 报告里,
Top SQL、Wait Events、ASH全部只含当前 PDB 数据,不含其他 PDB 干扰项
Oracle 19c+ 仍有两个隐性坑
虽然 awr_pdb_autoflush_enabled 默认为 TRUE,但以下两点不处理,照样出问题:
-
AWR_SNAPSHOT_TIME_OFFSET建议设为非零值(如1000000),否则多个 PDB 同时刷快照可能引发 I/O 冲突 —— 需在CDB$ROOT中设置:ALTER SYSTEM SET awr_snapshot_time_offset = 1000000; - PDB 若处于
READ ONLY状态,CREATE_SNAPSHOT()会静默失败,不会报错但也不写入awr_pdb_snapshot—— 检查前先确认状态:SELECT open_mode FROM v$pdbs WHERE name = 'your_pdb_name';
真正麻烦的不是步骤多,而是每个环节都依赖上一个环节的输出结果:参数开了 ≠ 快照有了,快照有了 ≠ 脚本选对了源,选对了源 ≠ PDB 当前可写。漏掉任意一环,报告就不可信。











