有些時候,數據庫處於同步數據的狀態,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。