通过RMAN删除归档日志不释放问题
我的生产环境中归档日志满了,通过如下脚本删除后,空间并没有释放,看有网友有相关的解决思路,可以跟大家一起分享一下:
RMAN> crosscheck archivelog all;
RMAN> delete expried archivelog all;
关于rm删除文件空间不释放的问题可以写成一个FAQ了
一般说来不会出现rm掉不释放空间的情况
出现这样的情况一般是由于有进程在向文件中写数据或有进程正在访问文件
而此时rm文件则会出现不释放空间的情况
理解这样的问题需要理解rm的操作内含
一个文件的存放有数据部分和指针部分,而指针位于文件系统的头
删除操作系统的一个文件与oracle drop表的实质有些相似
处理掉指针,文件数据部分占用的空间就可以写入新内容了
之所以出现rm不释放即为有进程在用这个文件而引起操作系统认为这个文件未实质释放,从而df或bdf空间统计不正确
这一类问题的解决方法一般说来可以重启操作系统,重新umount及mount那个文件系统
这并不是一个好方法
我建议的操作方法如下:
1、下载一个lsof软件装上,google上可以搜到
2、找到正在用被删文件的进程
lsof | grep deleted
3、kill掉相应的进程空间就释放了
其它建议:
1、清理alert.log listerner.log这些日志文件时最好用">文件"这样的操作方式,不要用rm。
2、清理归档日志最好用backup … delete input这样的方式。
3、如果你的操作系统总出现rm不释放空间的问题,该请sa好好查查系统问题了,同时可以在rm前用lsof看一下有无进程在用这个文件。
4、解决问题的方法很多,最好不要用重启数据库或重启操作系统这样的方法
其它解决方法如下:
一位网友遇到一个问题,他在生产系统执行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;