pdb级awr报告需显式指定数据源为awr_pdb,否则默认生成cdb级报告;须启用awr_pdb_autoflush_enabled参数并确认快照已采集。

直接在PDB里执行 @?/rdbms/admin/awrrpt.sql 会默认生成CDB级报告,不是你想要的PDB专属数据——必须显式指定数据源为 AWR_PDB,否则看到的SQL、等待事件、ASH信息全是CDB视角,和目标PDB无关。
如何确认PDB已启用AWR快照采集
PDB默认不自动采集快照,需手动开启。否则 DBA_HIST_SNAPSHOT 在PDB里查不到本PDB的快照记录,后续报告无数据可取。
- 先切到目标PDB:
ALTER SESSION SET CONTAINER = pdb1; - 检查参数是否启用:
SHOW PARAMETER awr_pdb_autoflush_enabled,值必须为TRUE - 若未启用,执行:
ALTER SYSTEM SET awr_pdb_autoflush_enabled = TRUE; - 确认快照间隔和保留策略是否合理(建议至少保留8天):
SELECT * FROM CDB_HIST_WR_CONTROL; - 手动触发一次快照验证:
EXEC DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT();,再查SELECT COUNT(*) FROM AWR_PDB_SNAPSHOT;看是否有新记录
生成PDB级AWR报告的关键步骤
脚本本身不变,但交互过程中的选择项决定报告归属。很多人卡在“选错数据源”这一步,导致报告标题写着PDB名,内容却是CDB全局统计。
- 登录时用CDB root用户:
sqlplus / AS SYSDBA(不能用PDB本地用户登录) - 执行:
@?/rdbms/admin/awrrpt.sql - 当提示
Specify the location of AWR Data时,必须输入:AWR_PDB(不是默认的AWR_ROOT) - 接下来会列出当前CDB下所有已注册的PDB,输入目标PDB的编号(不是名称)
- 时间范围选择逻辑和CDB一致,但快照ID只来自该PDB自身的
AWR_PDB_SNAPSHOT表
常见错误:报告里SQL占比异常低或为空
这不是脚本问题,而是PDB级AWR的数据捕获机制导致的——它只抓取在该PDB上下文中执行、且未被快速淘汰的SQL。如果SQL硬解析频繁、绑定变量未复用,或PDB共享池压力大,就会漏掉关键语句。
-
Captured SQL account for X% of Total这个百分比在PDB报告中天然偏低,低于50%很常见;CDB报告里可能高达90%,但那包含所有PDB - 避免多个PDB同时刷快照造成争抢:设置
AWR_SNAPSHOT_TIME_OFFSET参数(如1000000微秒),让各PDB错峰采样 - 若需完整SQL覆盖,可临时调高PDB的TOPNSQL设置:
EXEC DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(topnsql => 'MAXIMUM'); - 注意:PDB报告中
DB/Inst字段仍显示CDB名(如CDB/CDB),这是正常行为,别因此误判报告类型
最易被忽略的一点:PDB的AWR数据物理上仍存于CDB的SYSAUX表空间,但逻辑隔离靠 CON_ID 和 AWR_PDB_SNAPSHOT 视图实现。一旦忘记在交互中选 AWR_PDB,脚本就退回到CDB模式,连快照列表都只显示CDB级ID,根本看不到PDB自己的快照编号。











