因为rm,find方式删除了实际的归档日志也释放了空间,但对应的存储在控制文件中的归档信息并没有彻底清除。依旧占用着一些空间未
在开发环境及uat环境经常碰到需要清除归档日志的情形,对于这个问题方法有很多。可以直接使用rm方式清除归档日志,也可以使用find命令来查找符合条件的记录来清除归档日志,或者直接写个shell脚本来搞定。这样在dev或者uat还可以,但是在prod环境还是建议使用rman提供的命令来搞定比较妥当。因为rm,find方式删除了实际的归档日志也释放了空间,但对应的存储在控制文件中的归档信息并没有彻底清除。依旧占用着一些空间未能及时清除而需要控制文件通过age out方式来释放空间。本文描述了使用rman方式来清除归档日志,同时也可以将其部署到shell脚本中使用。
有关阅读本文需要的相关参考
oracle 归档日志
oracle 控制文件(controlfile)
oracle 联机重做日志文件(online log file)
linux/unix shell 脚本中调用sql,rman脚本
linux/unix shell 脚本清除归档日志文件
1、清除归档日志的方式
a、手动删除
使用rm 或者find方式来删除,通过该方式删除之后,在rman下可以通过 crosscheck archivelog all 校验归档是否失效,如下面的操作:
rm -rf arch_816906485_1_10.arc
find /u02/database/gobo1/archive/ -ctime +0 -delete
rman> crosscheck archivelog all
b、使用rman方式清除
rman清除方式会自动清除磁盘上的归档日志文件,,同时会释放控制文件中对应的归档日志的归档信息。
可以基于不同的条件来清除归档日志,如基于scn,基于sequence,基于time等方式。
对于上述的三种方式又可以配合from, until, between .. and .. 等等子句来限定范围,方式灵活多变。
下面的命令用于校验归档日志的有效性,列出无效的归档日志,以及以何种方式清除归档日志,列出几种常用的:
crosscheck archivelog all; --->校验日志的可用性
list expired archivelog all; --->列出所有失效的归档日志
delete archivelog until sequence 16; --->删除log sequence为16及16之前的所有归档日志
delete archivelog all completed before 'sysdate-7'; --->删除系统时间7天以前的归档日志,不会删除闪回区有效的归档日志
delete archivelog all completed before 'sysdate - 1'; --->同上,1天以前的
delete archivelog from time 'sysdate-1'; --->注意这个命令,删除系统时间1天以内到现在的归档日志
delete noprompt archivelog all completed before 'sysdate'; --->该命令清除所有的归档日志
delete noprompt archivelog all; --->同上一命令
2、演练使用rman清除归档日志
robin@szdb:~> export oracle_sid=gobo1
robin@szdb:~> rman target /
recovery manager: release 10.2.0.3.0 - production on thu jul 11 17:07:00 2013
copyright (c) 1982, 2005, oracle. all rights reserved.
connected to target database: gobo1 (dbid=733951103)
rman> host;
robin@szdb:~> cd /u02/database/gobo1/archive/
robin@szdb:/u02/database/gobo1/archive> ls
arch_816906485_1_10.arc arch_816906485_1_12.arc
arch_816906485_1_11.arc arch_816906485_1_13.arc
............
robin@szdb:/u02/database/gobo1/archive> rm -rf arch_816906485_1_10.arc arch_816906485_1_11.arc arch_816906485_1_12.arc
robin@szdb:/u02/database/gobo1/archive> exit;
exit
host command complete
rman> crosscheck archivelog all;
released channel: ora_disk_1
allocated channel: ora_disk_1
channel ora_disk_1: sid=1075 devtype=disk
archive log filename=/u02/database/gobo1/archive/arch_816906485_1_9.arc recid=2085 stamp=817211151
validation failed for archived log
archive log filename=/u02/database/gobo1/archive/arch_816906485_1_10.arc recid=2086 stamp=817250793
..............
validation succeeded for archived log
archive log filename=/u02/database/gobo1/archive/arch_816906485_1_90.arc recid=2166 stamp=820458049
crosschecked 83 objects
rman> list expired archivelog all;