有些时候,数据库处于同步数据的状态,archive归档日志不停的增长会导致磁盘空间被大量耗用,以至于归档空间占满,而是导致数据库实例挂起。对于这种情形,可以使用一个shell脚本来定时自动清除这些归档日志,使数据库能正常运行。
1.清除归档日志shell脚本
#!/bin/bash
#定义运行环境
. ~/.bash_profile
ARCH_MAX_VALUE=75
DEL_lOGS_INST=49
KEEP_ARCH_DAYS=5
echo "================"
echo "================"
echo `date +%Y%m%d%t%T`
echo ""
#获取当前归档使用率
function getArchUsage() {
ARCH_USED=`
sqlplus -S /nolog << EOF
connect / as sysdba
set echo off feedback off heading off underline off
select PERCENT_SPACE_USED from v\\$flash_recovery_area_usage where FILE_TYPE='ARCHIVED LOG';
exit;
EOF`
}
#删除N天前的归档
function delArchLogDaysAgo() {
rman target / nocatalog log /dev/null <<EOF
crosscheck archivelog all;
delete noprompt force archivelog until time 'sysdate-$KEEP_ARCH_DAYS';
exit
EOF
}
function getArchLogSeq() {
sqlplus -s /nolog <<EOF
connect /as sysdba
spool /tmp/applied.log
set pagesize 0
set head off
set feedback off
set linesize 120
select thread#||':'||min(sequence#+$DEL_lOGS_INST) from v\$archived_log where status='A' and first_time<sysdate-1/3 group by thread#;
spool off
EOF
}
function CompareArchMaxValue() {
getArchUsage
#比较归档使用率与阈值
if [ $ARCH_USED -ge $ARCH_MAX_VALUE ];then
echo "\n"`date +%Y%m%d%t%T` Event_Message: flash_recovery_area_usage is $ARCH_USED% larger than $ARCH_MAX_VALUE%.Waiting to delete archive log ...
getArchLogSeq
DelArchLogs
#如果归档使用率小于阈值,输出当前归档使用率,结束该脚本
else
echo "\n"`date +%Y%m%d%t%T` Event_Message: flash_recovery_area_usage is $ARCH_USED% lower than $ARCH_MAX_VALUE%.
fi
}
#删除归档到指定sequence
function DelArchLogs() {
while read line
do
thread=`echo $line |awk -F ":" '{print $1}'`
sequence=`echo $line |awk -F ":" '{print $2}'`
echo "thread:$thread sequence:$sequence"
$ORACLE_HOME/bin/rman target / nocatalog <<EOF
#crosscheck archivelog all;
delete noprompt force archivelog until sequence $sequence thread $thread;
EOF
echo "\n"`date +%Y%m%d%t%T` Event_Message:Have deleted `echo $DEL_lOGS_INST+1|bc` archive logs.
done < /tmp/applied.log
CompareArchMaxValue
}
############################
#
#Main()
#
############################
delArchLogDaysAgo
CompareArchMaxValue
2. 脚本说明
2.1) 数据库的ORACLE_HOME,ORACLE_BASE,ORACLE_SID变量不妨在.bash_profile中设定;
2.2) 该脚本先执行一次归档删除,仅保留N天的归档日志;
2.3) 然后,检查flash_recovery_area_usage_dest的空间使用率,与设定的阈值(ARCH_MAX_VALUE)进行对比;
2.4) 如果,归档使用率小于阈值,则打印当前flash_recovery_area_usage_dest使用率,并结束脚本运行;
2.5) 如果,归档使用率小于阈值,则提取当前实例最旧的归档日志sequence,并加上一个值(DEL_lOGS_INST,该值加1就是每次每实例删除的归档个数),得到一个新的logseq,接下来我们就删除该logseq之前的所有归档日志(包括该logseq号的日志也删除);
2.6) 删除完一轮后,重新检查flash_recovery_area_usage_dest的空间使用率,继续2.3到2.6的步骤。
2.7) 根据需要将脚本部署到crontab。