Oracle数据库ASM归档只保留最后一天?原来是delete input搞的鬼
概述
今天主要是记录一个比较奇怪的地方,之前ASM归档目录会保留几天,有一次全清空后导致后面ASM归档目录每次都只保留最后一天归档,看是不是因为RMAN在删除归档日志的同时删除空目录导致。
1、删除ASM所存归档
之前因为归档空间满,在删除归档的时候同事执行了命令:
delete archivelog until time 'sysdate-1';
删除之前ASM上是保留有几天的归档的,删除后只剩最后一天保留。
2、编写定期归档脚本
后来写了个自动删除5天以前的归档脚本(本来是3天,然后改成5天)
3、奇怪地方
观察了几天发现ASM都只保留了当天的归档,之前的归档不做保存。
这里我后来停了定期删除归档的脚本,但是还是有这情况,每天ASM上只保留最后一天归档。
4、查看实际备份情况
list backup of archivelog all completed before 'sysdate-7';
这个是在22号执行的,可以看到实际上是有备份的,但是备份路径为/backup,而不是在ASM上。而控制文件会自动备份在ASM上,即使/backup每天有自动备份。
可以看到归档不备份在ASM上,备份在本地/backup目录,控制文件备份在ASM上。
5、查看定时备份脚本
这里可以看到之前同事用了delete input的用法。
注意:
delete input 只备份一个路径下的archivelog,只删除备份的目标路径下的archivelog;
delete all input 只备份一个路径下的archivelog,删除所有路径下的archivelog;
6、考虑是否触发bug:RMAN在删除归档日志的同时删除空目录。
查询了metalink文档,发现有可能是Oracle的bug,metalink文档Bug No. 4431215描述了这个问题。
如果在ASM上建立的目录名称和SID前缀相同,则这个目录下的所有目录一旦为空,就会被ASM实例自动删除,不管这个目录是ASM自动建立,还是用户手工建立的。
解决这个问题的办法倒是很多,比如将归档目录设置到日志文件的目录中,或者改变主目录的名称使其和ORACLE_SID有所区别。还有更简单的办法,在归档目录下拷贝一个小文件,使得归档被删除后,归档目录不为空,从而避免路径被清除。
这里我复制了spfile文件,等23号再观察下情况。
7、测试验证
检查发现ASM上只保留了23号的归档文件,22号的自动删除了。不是因为bug(低版本才有可能,我的版本是11.2.0.4)导致。
总结:
delete input删除已备份的归档日志,因为我只有一个fra归档路径(ASM上),应该是检测到/backup已经备份归档日志了,所以删除了ASM那边。后面会分享更多DBA方面的内容,感兴趣的朋友可以关注一下~