之前写了些关于迁移AWR数据的文章(详见以下列表),在我的数据库中,经常会导入很多客户数据库的AWR数据,所以过一段时间就要对这些历史数据进行清理。
清理AWR数据利用dbms_swrf_internal包就可以很容易实现。比如清理前我的数据库里存在以下的数据库AWR信息。
Instances in this Workload Repository schema
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DB Id Inst Num DB Name Instance Host
------------ -------- ------------ ------------ ------------
* 1520519778 1 STREAM stream STREAM
2854872633 2 TGJZL tgjzl2 tgsjzl2
1645778343 2 B1ACDB B1ACDB2 acdbs
2400249746 1 CNDERPDB cnderpdb1 p5a1
2400249746 2 CNDERPDB cnderpdb2 p5b1
2854872633 1 TGJZL tgjzl1 tgsjzl1
1645778343 1 B1ACDB B1ACDB1 acdbm
1247539900 1 B1EDB B1EDB EDB
可以看出,DB_ID为2854872633的数据库也就是DB_NAME为TGJZL的数据库和DB_ID为2400249746也就是DB_NAME为CNDERPDB的数据库还有DB_ID为1645778343 的数据库是RAC环境,DB_NAME为B1EDB的数据库是单实例环境,对于RAC环境,我们只需要清理一次就可以,ORACLE会自动将实例1和实例2的AWR信息都清理掉。下面演示下如何利用dbms_swrf_internal包来清理AWR数据。
SQL> exec dbms_swrf_internal.unregister_database(2854872633);
PL/SQL 过程已成功完成。
SQL> exec dbms_swrf_internal.unregister_database(1645778343);
PL/SQL 过程已成功完成。
SQL> exec dbms_swrf_internal.unregister_database(2400249746);
PL/SQL 过程已成功完成。
SQL> exec dbms_swrf_internal.unregister_database(1247539900);
PL/SQL 过程已成功完成。
此时,我的数据库中只剩本地数据库的AWR信息。
DB Id Inst Num DB Name Instance Host
------------ -------- ------------ ------------ ------------
* 1520519778 1 STREAM stream STREAM
如果要清理本地数据库的AWR信息,dbms_swrf_internal包就无能为力了。
SQL> exec dbms_swrf_internal.unregister_database(1520519778);
BEGIN dbms_swrf_internal.unregister_database(1520519778); END;
*
第 1 行出现错误:
ORA-13521: 不允许对本地数据库 ID (1520519778) 执行注销操作
ORA-06512: 在 "SYS.DBMS_SWRF_INTERNAL", line 99
ORA-06512: 在 line 1