Oracle AWR(Automatic Workload Repository)是Oracle数据库中的一项性能监测功能,用于收集并保存数据库实例的性能数据,帮助管理者和开发者分析数据库的性能问题。然而,随着数据的积累,AWR会占用大量的数据库存储空间,因此需要定期清理过期数据,以免影响数据库的正常运行。
清理AWR数据的方法有很多种。最常用的是使用Oracle提供的官方脚本PURGE_DB.sh/BAT进行清理。该脚本可以将指定的时间段内的AWR数据删除。比如,清理一个月前的AWR数据,我们可以使用以下脚本:
$ORACLE_HOME/bin/adrci adrci> set home <path to the ADR home> adrci> purge -age 43200 -type awr adrci> exit
其中,-age参数表示删除几秒之前的数据(43200秒即30天),-type参数表示删除的数据类型,这里是AWR。如果要同时删除其他类型的数据,可以将-type参数替换为incident、alert log等。
除了脚本外,我们还可以直接使用SQL语句清理AWR数据。以下是一个清理一个月前AWR数据的SQL语句:
SQL> delete from dba_hist_snapshot where begin_interval_time < sysdate-30;
这个SQL语句会删除所有开始时间早于30天前的AWR快照数据。如果要清理其他类型的AWR数据,可以使用类似的删除语句,只需要替换表名和表中的列名即可。
需要注意的是,执行AWR数据的删除操作需要谨慎。如果删除了重要的历史性能数据,将会给排查问题带来困难。因此,我们需要根据实际情况进行清理。通常来说,建议至少保留三个月的AWR数据,以便查看历史性能情况,调查异常事件。
在执行AWR数据清理操作之前,我们还需要注意以下几点:
1.停止AWR自动快照功能
如果清理了历史数据,而AWR还在自动快照,那么它将记录新的快照数据,导致数据库的存储空间越来越大。因此,我们需要在清理数据时停止自动快照功能。
SQL> exec dbms_workload_repository.modify_snapshot_settings(interval => 0);
2.停止AWR自动清理功能
除了自动快照功能外,AWR还有自动清理功能。如果同时进行两个操作,可能会引起问题。因此,执行AWR清理操作时,最好先停止自动清理功能。
SQL> BEGIN dbms_workload_repository.modify_snapshot_settings(retention_days => 0); END;
3.清理AWR之前备份数据
清理AWR数据前,建议先备份数据。如果不小心清理了错误的数据,可以快速恢复到原始情况。
4.监控AWR的占用空间
清理AWR的数据后,需要关注AWR的占用空间是否正常。随着时间的推移,AWR会再次增长。可以使用以下SQL语句来监控空间使用情况:
SQL> select sum(space_used)/1024/1024/1024 "AWR Size (GB)" from dba_hist_database_instance;
在实际清理AWR数据时,需要根据实际情况进行操作。这篇文章提供了一些适用于大多数情况的方法和技巧,仅供参考。