awr快照保留时间需用dbms_workload_repository.modify_snapshot_settings修改,单位为分钟,retention必须≥interval×2;interval最小为1分钟但不建议低于15分钟;修改仅影响后续快照,需确保sysaux空间充足且实例open。
修改awr快照保留时间:dbms_workload_repository.modify_snapshot_settings
默认的8天保留期对多数生产库偏短,长期趋势分析或故障回溯容易丢数据。改保留时间必须用 dbms_workload_repository.modify_snapshot_settings,不能直接删表或改数据字典。
- 保留时间单位是分钟,比如想设为30天:传入
retention => 30*24*60(即43200) - 调用前确认SYSAUX表空间有足够空间——每多留1天,AWR可能多占几百MB到几GB,取决于负载和采集级别
- 执行需
DBA权限,且实例必须处于OPEN状态;如果遇到ORA-13502: Cannot modify AWR settings while database is in restricted mode,先检查是否启用了受限会话 - 修改立即生效,但不会清理已超期的快照——老数据仍会按原策略逐步过期,新策略只管后续生成的快照
调整快照生成频率:interval参数的实际影响
快照间隔不是“精确定时器”,而是“最小触发间隔”。即使设成10分钟,若上一个快照生成耗时超过10分钟(比如I/O压力大、ASH采样卡顿),下一个快照会顺延,不会并发执行。
- 标准值是60分钟(
interval => 60),高频采样(如5或10分钟)会显著增加SYSAUX写入压力和AWR报告生成延迟 - 若设置
interval => 0,表示禁用自动快照——此时只能手动用DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT触发 - 修改后可用
SELECT snap_interval, retention FROM dba_hist_wr_control;验证,注意该视图里时间显示为+000000000 01:00:00.0这类格式,小时部分就是interval值
为什么DBMS_WORKLOAD_REPOSITORY包常报ORA-13516错误
ORA-13516: AWR operation failed: Invalid input value for parameter 是最常遇到的报错,基本都源于参数类型或范围不对,不是权限或锁问题。
-
retention必须 ≥interval * 2,否则报错——系统强制要求至少保留两个快照周期的数据 -
interval最小允许值是1(1分钟),但Oracle官方不建议低于15分钟;设成0合法,但含义是“关闭自动采集” - 所有数值参数必须是整数,传入小数(如
interval => 5.5)会隐式转成5,但某些版本会直接报错,统一用TRUNC()或硬编码整数更稳 - 执行前别忘了
EXECUTE权限,不是光有SELECT就成——缺少EXECUTE ON SYS.DBMS_WORKLOAD_REPOSITORY也会报类似错误
跨PDB环境下的注意事项
CDB中修改AWR设置,默认只影响CDB$ROOT,各PDB沿用各自独立的控制参数。想统一管理,得在每个PDB里单独执行 MODIFY_SNAPSHOT_SETTINGS。
- 连接到具体PDB后执行才生效,用
ALTER SESSION SET CONTAINER = pdb1;切换后再调用 -
dba_hist_wr_control视图在PDB里查到的是本PDB的配置,CDB$ROOT里查到的是根容器配置,二者完全隔离 - 如果PDB未启用本地UNDO(即使用CDB级UNDO),仍可采集快照,但ASH数据粒度可能变粗,部分等待事件统计不准
实际改一次参数不难,难的是预估空间增长和判断是否真需要高频快照。很多人调成5分钟,结果两周后SYSAUX爆满,才发现没算清每天多出来的170+个快照要吃掉多少IO和归档空间。







