前面介绍了如何迁移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