关于Oracle归档日志删除(前提是数据库处于归档模式 SQL>archive log list;--Automatic archival 为 Enabled),目前遇到过两种情况,一是先手动删除了归档文件(服务器直接删除),二是通过Rman删除,一方案可能会存在数据库信息冗余,二方案可能会造成实际归档文件数量大于数据库中记录的文件数量,解决方案:
一:手动删除归档文件(服务器直接删除)造成的问题解决
场景:服务器中直接删除归档文件,造成 v$archived_log 视图中记录的日志文件会多余实际归档文件数量,
1、首先查看归档日志目录下文件数量 ls -l | wc -l
2、执行SQL>select count(*) from v$archived_log;--检查数据库中记录的归档文件数量(正常情况下sql数量应该大于第一步查询的文件数量,因为已经删除了服务器归档文件)
3、进入Rman,
rman target /
执行 crosscheck archivelog all; --检查控制文件和实际物理文件的差别。(此时显示的文件数量应小于上面SQL的数量,原理同第二步)
然后执行 delete expired archivelog all; --删除控制文件中不存在的失效的归档日志
然后可以再次检查归档路径下文件数量与crosscheck数量是否相等,
A、若相等,则归档文件都是可以关联到的,
然后检查 SQL与归档文件数量是否相等,
1.1、若相等,则表名归档文件与控制文件记录的归档信息一一对应,可以结束退出。
1.2、若不等,即SQL查询数量大于归档文件数量,则表名数据库中记录的归档信息多余实际归档文件数量,
执行 SQL>select dest_id,sequence#,name,blocks from v$archived_log ; 会发现有很多NAME字段为空的数据
这种数据是通过非正常途径删除归档文件造成,可无需理会,若想让查询的数量与归档文件保持一致可采用以下方案
a)、rman>delete archivelog all;--删除所有归档文件
b)、rman>execute sys.dbms_backup_restore.resetCfileSection(11);--清空控制文件记录的归档信息,11代表归档
(SQL>