天天看点

Linux shell 脚本清除归档日志

  有些时候,数据库处于同步数据的状态,archive归档日志不停的增长会导致磁盘空间被大量耗用,以至于归档空间占满,而是导致数据库实例挂起。对于这种情形,可以使用一个shell脚本来定时自动清除这些归档日志,使数据库能正常运行。

1.清除归档日志shell脚本

#!/bin/bash

#定义运行环境

. ~/.bash_profile

ARCH_MAX_VALUE=75

DEL_lOGS_INST=49

KEEP_ARCH_DAYS=5

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

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;

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