前面介绍了如何迁移AWR数据,这里介绍如何删除不再需要的SNAPSHOT数据。
对于当前数据库生成的SNAPSHOT,是不需要手工处理的,和SNAPSHOT生成一样,Oracle在自动任务中会根据SNAPSHOT的保留期自动删除过期的快照信息。
SQL> select dbid, retention from dba_hist_wr_control;
DBID RETENTION
---------- ---------------------------------------------------------------------------
3812548755 +00007 00:00:00.0
96312462 +40150 00:00:00.0
3944144691 +40150 00:00:00.0
SQL> select dbid from v$database;
DBID
----------
3812548755
通过dba_hist_wr_control视图可以查询数据库中不同DBID对应的保留期。对于当前数据库,保留期是7天,而对于利用AWR迁移导入的SNAPSHOT而言,保留期设置超过了100年,也就是说Oracle不会自动清除这些SNAPSHOT。
如果修改对应DBID的保留期:
SQL> exec dbms_workload_repository.modify_snapshot_settings(1440, dbid => 96312462)
PL/SQL procedure successfully completed.
SQL> select dbid, retention from dba_hist_wr_control;
DBID RETENTION
---------- ---------------------------------------------------------------------------
3812548755 +00007 00:00:00.0
96312462 +00001 00:00:00.0
3944144691 +40150 00:00:00.0
但是测试发现,采用方法并不会导致Oracle自动清除导入的AWR快照数据。
那么只有使用dbms_workload_repository包来手工完成这个操作:
SQL> select min(snap_id), max(snap_id)
2 from dba_hist_snapshot
3 where dbid = 3944144691;
MIN(SNAP_ID) MAX(SNAP_ID)
------------ ------------
45189 47802
SQL> exec dbms_workload_repository.drop_snapshot_range(45189, 47802, 3944144691)
PL/SQL procedure successfully completed.
SQL> select * from dba_hist_snapshot where dbid = 3944144691;
no rows selected
这个操作很快可以完成,其实如果检查数据字典可以发现,Oracle仅仅修改了对应SNAPSHOT的状态,而并没有删除快照:
SQL> select dbid, status, count(*)
2 from wrm$_snapshot
3 group by dbid, status;
DBID STATUS COUNT(*)
---------- ---------- ----------
3812548755 0 89
96312462 0 50
3944144691 2 2614
而检查DBA_HIST_SNAPSHOT视图可以发现,这个视图的定义是只显示STATUS为2的记录:
SQL> select text
2 from dba_views
3 where view_name = 'DBA_HIST_SNAPSHOT';
TEXT
--------------------------------------------------------------------------------
select snap_id, dbid, instance_number, startup_time,
begin_interval_time, end_interval_time,
flush_elapsed, snap_level, error_count
from WRM$_SNAPSHOT
where status = 0