一位网友遇到一个问题,他在生产系统执行RMAN命令删除归档日志时发现归档日志并未被删除。但在测试环境中这个命令却没有问题。
删除的命令是:delete archivelog all completed before 'xxxxx';
执行后检查ASM发现有很多归档日志并未被删除。
实际上并不是RMAN命令本身有问题。RMAN删除归档日志的依据是controlfile中记录的归档日志,而不是ASM中实际存在的归档日志。controlfile中有一部分内容是可以循环使用的,其中归档日志信息和备份信息就使用的是这部分空间。Oracle用参数control_file_record_keep_time来设置控制文件中可重用的记录在多久以后可以被重用。通常这个参数的缺省值是7。这就意味着7天前的归档日志和备份信息可能在控制文件中已经不存在了。而RMAN命令只能删除控制文件中记录的归档日志,对于那些很早以前的归档日志,它们在控制文件中的信息已经不存在了,RMAN就无法删除了。对于这部分归档日志,只能其它命令从ASM或文件系统上删除。
另外需要说明的是,用RMAN删除归档日志时,并不会删除控制文件中对应的归档日志信息,而只是在控制文件中设置delete状态,即v$archived_log的deleted列。
删除归档日志时,建议使用RMAN命令来删除。如果不使用RMAN命令而用操作系统命令或ASM命令删除日志后,最好更新一下控制文件信息,方法是:
RMAN> crosscheck archivelog all;
RMAN> delete expried archivelog all;
如果是RAC环境且archivelog存储在各节点的本地盘而未使用NFS,直接执行以上命令会导致其它节点上的所有archivelog都被标识为无效而被删除。这是因为归档日志不是共享的,执行命令的节点无法访问到其它节点上的归档日志。对于这种情况需要为每个节点分配一个metainance channel来解决。
RMAN > allocate channel for maintenance device type disk connect'sys/systemaudit@ora91';
RMAN > allocate channel for maintenance device type disk connect'sys/systemaudit@ora92';
RMAN > crosscheck archivelog all;RMAN> delete expried archivelog all;