ORA-13541错误源于baseline moving_window_size与retention天数不匹配:moving_window_size必须≤retention向下取整天数;修改前需先调小moving_window_size,再改retention;interval最小10分钟且retention≥interval×2。

直接改 DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS 会报 ORA-13541 错误,不是参数填错,而是 baseline 窗口大小和 retention 冲突了——这是 Oracle 12c+ 的硬性校验,绕不开。
查当前配置:别只看 dba_hist_wr_control
执行以下语句能同时看到快照策略和 baseline 约束:
SELECT * FROM dba_hist_wr_control; SELECT dbid, baseline_name, baseline_type, moving_window_size FROM dba_hist_baseline;
关键点:
-
SNAP_INTERVAL和RETENTION字段单位是「天+时:分:秒」格式,比如+00008 00:00:00.0表示 8 天 -
moving_window_size是以「天」为单位的整数,必须 ≤RETENTION对应的天数(向下取整) - 默认 baseline 名为
SYSTEM_MOVING_WINDOW,moving_window_size通常等于当前RETENTION天数
改 retention 前必须先调 moving_window_size
比如你想把保留时间从 8 天改成 3 天,不能直接跑:
BEGIN
DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(
interval => 60,
retention => 3*24*60); -- 单位是分钟
END;
因为当前 moving_window_size = 8,而 3 天(4320 分钟)
- 执行
EXEC DBMS_WORKLOAD_REPOSITORY.MODIFY_BASELINE_WINDOW_SIZE(3) - 再执行
MODIFY_SNAPSHOT_SETTINGS,且retention参数值对应天数不能小于 3 - 如果
moving_window_size是 8,你设retention => 7*24*60(7 天)就合法;设成 6 天(4320×6=25920)也合法
interval 和 retention 的单位与取值边界
两个参数都以「分钟」为单位,但有隐含限制:
-
interval最小支持 10 分钟(10),不建议低于 30 分钟,否则 AWR 表膨胀快、I/O 压力大 -
retention必须 ≥interval × 2,否则系统拒绝(内部要求至少存两个快照) - 若设
interval => 0,表示关闭自动快照采集,但已有 baseline 和历史数据不受影响 - 修改后不会删除已有快照,只影响后续生成行为
验证是否生效,重点看三处
改完别只查 dba_hist_wr_control,还要确认:
- 执行
SELECT * FROM dba_hist_baseline,确认moving_window_size已更新 - 查最近几个快照时间间隔:
SELECT snap_id, begin_interval_time FROM dba_hist_snapshot ORDER BY snap_id DESC FETCH FIRST 5 ROWS ONLY - 用
DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT()手动触发一次,观察是否被新策略接纳(比如设了 30 分钟间隔,手动打完快照后,下个自动快照应在 30 分钟后出现)
最易忽略的是 baseline 窗口和 retention 的数值对齐——moving_window_size 是天数,retention 是分钟,换算时别四舍五入,Oracle 取的是向下取整后的天数做比较。











