Oracle 12.2+才支持真正的PDB级AWR报告,12.1及更早版本不支持PDB级快照;需在PDB中启用awr_pdb_autoflush_enabled并设置AWR_SNAPSHOT_TIME_OFFSET以避免冲突。
Oracle 12.2+ 才支持真正的 PDB 级 AWR 报告
12.1 及更早版本不支持 pdb 级快照或报告,所有 dba_hist_snapshot 记录的 con_id 都是 0,强行在 pdb 内执行 @?/rdbms/admin/awrrpt.sql 会报 ora-13541 或提示找不到快照。只有 12.2 及以上版本才真正允许 pdb 拥有独立快照和报告能力。确认版本最直接的方式是:select banner_full from v$version,看到 12.2.0.x 或更高才继续往下操作。
必须先在 PDB 内启用 AWR 自动刷新(awr_pdb_autoflush_enabled)
即使版本达标,PDB 默认仍不生成自己的快照。不设置这个参数,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 生效,且重启后需重新设置(除非写入 PDB 的 spfile,但极少这么做)。
生成快照时要区分 CDB 和 PDB 的 snap_id 空间
启用 awr_pdb_autoflush_enabled 后,PDB 会拥有自己独立的快照序列,其 snap_id 与 CDB 的完全不重叠。这意味着:
- 在 PDB 内执行
EXEC DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT();,生成的是 PDB 自己的快照,DBA_HIST_SNAPSHOT查不到(它只存 CDB 快照),但CDB_HIST_SNAPSHOT或DBA_HIST_SNAPSHOT加CON_ID过滤能查到对应记录 - 报告脚本中选择
AWR_PDB时,脚本会自动从 PDB 的快照视图读取数据;选AWR_ROOT则从 CDB 快照中按CON_ID提取,二者结果可能不同(尤其当 PDB 快照频率高于 CDB 时) -
SNAP_INTERVAL在 PDB 级可单独调整(通过DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS),但需注意:CDB 和 PDB 的快照时间偏移要错开,否则并发采集会拖慢系统
报告生成时必须手动指定 AWR_PDB 位置,且避开默认时间冲突
运行 @?/rdbms/admin/awrrpt.sql 后,关键一步是回答:Enter value for awr_location:。此时必须输入 AWR_PDB,否则默认走 AWR_ROOT,得到的是“过滤版”而非“原生 PDB 级”报告。另外,多个 PDB 若同时启用自动刷新,容易因快照撞在同一秒导致 CPU 尖峰,务必设置:
-
ALTER SYSTEM SET AWR_SNAPSHOT_TIME_OFFSET = 1000000;(推荐值,表示按 PDB 名哈希自动偏移) - 或设为 0–3599 范围内的整数,确保各 PDB 偏移不同(如 PDB1=100,PDB2=200)
这个参数只在 PDB 内生效,且不能动态修改后立即生效——需等下一个快照周期才起作用。最容易被忽略的是:即使设置了偏移,首次手动 CREATE_SNAPSHOT() 仍会立刻执行,不会等待偏移时间,所以观察效果要等自动刷新触发后。











