AWR默认只在CDB$ROOT生成全局快照,PDB级自动快照默认关闭(AWR_PDB_AUTOFLUSH_ENABLED=FALSE),导致PDB性能数据混杂、资源争用无法归因、隔离性问题被掩盖,且cdb_hist_snapshot中PDB快照时间不同步,唯有启用PDB级AWR才能准确反映各PDB真实运行状态。

AWR默认只在CDB$ROOT生成全局快照
Oracle 12c默认关闭PDB级自动快照,AWR_PDB_AUTOFLUSH_ENABLED参数默认为FALSE。这意味着即使你有5个PDB,AWR也只在CDB$ROOT(CON_ID = 0)采集快照,所有PDB的性能数据被混在同一个报告里。你看到的“Top SQL”可能是PDB1的慢查询,也可能是PDB2的硬解析风暴,但报告不告诉你来源。
PDB间资源争用无法在CDB级AWR中分离
多个PDB共享同一套CPU、内存和I/O资源,但CDB级AWR不区分资源消耗归属。例如:DB CPU占比高,你无法判断是PDB_A的并行查询吃光了CPU,还是PDB_B的Resource Manager把OTHER_GROUPS限速到1%导致大量resmgr:cpu quantum等待。只有PDB级AWR才能定位到具体容器的V$RSRC_SESSION_INFO视图数据和Resource Limit Statistics小节。
PDB级AWR能暴露CDB层看不到的隔离性问题
以下现象在CDB级AWR里会被掩盖,但在PDB级报告中直接可见:
-
MAX_IOPS或MAX_MBPS生效时触发的I/O rate limit等待事件(仅出现在对应PDB的报告中) - PDB内用户执行
SELECT * FROM DBA_TABLES返回空——这不是SQL问题,而是多租户下数据字典视图隔离机制导致,PDB级AWR配合CON_ID过滤可确认会话是否真在目标容器 -
ALTER SESSION SET CONTAINER = pdb_name失败后残留的跨容器会话,在CDB报告里表现为“未知会话”,在PDB报告里则根本不会出现
不启用PDB级快照,cdb_hist_snapshot里PDB数据会严重失真
即使手动在PDB中执行DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT,若未设置AWR_PDB_AUTOFLUSH_ENABLED=TRUE且未调DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS指定PDB快照间隔,快照时间戳会漂移。比如你查cdb_hist_snapshot发现CON_ID = 3的快照时间比CON_ID = 0晚45秒,说明该PDB的数据没对齐,对比分析会得出错误结论。
真正容易被忽略的是:PDB级AWR不是“更细粒度的报表”,而是唯一能反映PDB真实运行状态的数据源。Resource Manager限制、I/O配额、字典视图隔离、甚至用户连错容器,这些都不是SQL写得差导致的,但它们全都会在PDB级AWR里留下不可辩驳的痕迹。


















