Linux shell 腳本清除歸檔日志


  有些時候,數據庫處於同步數據的狀態,archive歸檔日志不停的增長會導致磁盤空間被大量耗用,以至於歸檔空間占滿,而是導致數據庫實例掛起。對於這種情形,可以使用一個shell腳本來定時自動清除這些歸檔日志,使數據庫能正常運行。

1.清除歸檔日志shell腳本

#!/bin/bash


#定義運行環境

. ~/.bash_profile

ARCH_MAX_VALUE=75
DEL_lOGS_INST=49
KEEP_ARCH_DAYS=5
ARCH_USED=0

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

#比較歸檔使用率與閾值
#AIX系統推薦使用if判斷,Linux系統推薦使用awk輔助判斷
ARCH=`awk -v num1="$ARCH_USED" -v num2="$ARCH_MAX_VALUE" 'BEGIN{print(num1>num2)?"0":"1"}'`
if [ $ARCH -eq 0 ];then
echo -e "\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 -e "\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 -e "\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。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM