2013年4月2日
如何清除Oracle控制文件中的无用记录,例如v$archived_log中的deleted归档日志记录
M
mac
Author
8 min
Read Time
54
Views
有这样一种需求,虽然controlfile中的archivelog和其他一些备份信息会被覆盖重用,收到参数control_file_record_keep_time的影响,但是我们没法手动触发这种重用,这导致有时候controlfile中的archivelog 记录过多,可能导致一些备份、恢复过程中的"control file sequential read"等待事件。
已知的一些解决方案,包括:
1. 重建控制文件, 例如 backup controlfile to trace后重建该控制文件,但要求有数据文件均存在
2. 设置control_file_record_keep_time=0 然后等待记录被重用, 太过被动了....
这里再介绍一种手动清除v$ARCHIVED_LOG中不管是DELETED还是available 记录的方法,注意不要在你的产品数据库上这样做:
SQL> select count(*) from v$archived_log;
COUNT(*)
----------
553
SQL> /
COUNT(*)
----------
553
SQL> execute sys.dbms_backup_restore.resetCfileSection( 11);
PL/SQL procedure successfully completed.
SQL> select count(*) from v$archived_log;
COUNT(*)
----------
0
PROCEDURE resetCfileSection(record_type IN binary_integer );
-- This procedure attempts to reset the circular controlfile section.
--
-- Input parameters:
-- record_type
-- The circular record type whose controlfile section is to be reset.
execute sys.dbms_backup_restore.resetCfileSection( 11); ==> 清理v$ARCHIVED_LOG对应的记录
execute sys.dbms_backup_restore.resetCfileSection(28); ==>清理v$rman_status对应的记录