DBA_HIST_WR_CONTROL中SNAP_INTERVAL显示的是CDB$ROOT全局配置,所有PDB共享同一快照频率,不存在PDB级独立设置;PDB性能分析须通过CON_ID过滤CDB快照中的子表数据(如DBA_HIST_ACTIVE_SESS_HISTORY)。
DBA_HIST_WR_CONTROL里看到的SNAP_INTERVAL不是PDB专属设置
你在pdb里查dba_hist_wr_control,看到的snap_interval值其实是cdb$root的全局配置,不是当前pdb生效的独立参数。所有pdb共享同一套快照采集节奏,根本不存在“某个pdb设成15分钟、另一个设成60分钟”这种事。
常见错误现象:ALTER SYSTEM SET awr_pdb_autoflush_enabled=true之后,SELECT * FROM AWR_PDB_SNAPSHOT仍为空 —— 因为这个视图只记录PDB级flush动作(非快照本身),且依赖底层CDB快照已存在;没CDB快照,它就永远没数据。
-
awr_pdb_autoflush_enabled=true只是允许PDB在CDB快照触发时,把本PDB的ASH内存数据刷入AWR表(如WRH$_ACTIVE_SESSION_HISTORY),不改变快照生成逻辑 - 真正控制快照频率的只有CDB$ROOT里的
DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS - PDB内执行该包会报
ORA-13541或ORA-01031: insufficient privileges,必须切回CDB$ROOT
为什么改了interval,PDB里还是看不到新快照
快照只在CDB$ROOT中生成,DBA_HIST_SNAPSHOT的CON_ID恒为0,你永远查不到CON_ID = 3的快照记录。所谓“PDB的快照”,本质是CDB快照中带CON_ID字段的子表数据,比如DBA_HIST_ACTIVE_SESS_HISTORY或DBA_HIST_SQLSTAT。
- 不要用
SELECT * FROM DBA_HIST_SNAPSHOT WHERE CON_ID = 3验证——这注定为空 - 验证是否生效,应查CDB$ROOT:
SELECT SNAP_INTERVAL, RETENTION FROM DBA_HIST_WR_CONTROL - 再确认快照是否真实生成:
SELECT MIN(SNAP_ID), MAX(SNAP_ID), COUNT(*) FROM DBA_HIST_SNAPSHOT - 等至少一个完整
SNAP_INTERVAL周期(比如设了30分钟,就等35分钟以上)再查,MMON不会在数据库刚启动后立刻按新节奏跑
awr_snapshot_time_offset的作用被严重高估
awr_snapshot_time_offset不是让每个PDB错峰采样,而是给CDB级快照加一个毫秒级偏移,避免多个实例(非多租户)在同一秒触发MMON。在单实例多PDB环境下,它对PDB数据采集无实质影响。
- 设
awr_snapshot_time_offset=1000000(即1秒)不会让PDB获得“自己的快照时间点” - 它只影响CDB快照的
END_INTERVAL_TIME微调,对CON_ID过滤后的PDB数据完整性毫无帮助 - 真正需要错峰的场景是RAC多实例,不是CDB+PDB架构
- 这个参数在12.2+版本中已标记为deprecated,后续版本可能移除
查PDB性能数据必须用带CON_ID的视图,不能靠“PDB快照”概念
没有PDB级别的AWR快照,只有CDB快照中归属某PDB的数据行。想查PDB1(CON_ID=3)的SQL耗时,必须从DBA_HIST_SQLSTAT或DBA_HIST_ACTIVE_SESS_HISTORY入手,且WHERE条件必须包含CON_ID = 3。
-
DBA_HIST_ACTIVE_SESS_HISTORY:含秒级采样,有CON_ID、SQL_ID、EVENT,适合定位等待瓶颈 -
DBA_HIST_SQLSTAT:每小时聚合,EXECUTIONS_DELTA是差值,需JOINDBA_HIST_SNAPSHOT按SNAP_ID排序后计算 - 别用
V$SQL替代——它只反映当前内存中的SQL,不是历史快照 - 手动创建快照:
EXEC DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT()必须在CDB$ROOT中执行,PDB里调用会失败
最易忽略的一点:所有PDB性能分析都依赖CDB$ROOT的快照存在性和CON_ID字段准确性。如果SYSAUX空间不足导致MMON flush失败,或者STATISTICS_LEVEL被设为BASIC,那么无论你在PDB里怎么设参数,都拿不到任何历史数据。











