自動刪除歸檔日誌的指令碼(尤其是dataguard環境)

piscesfly發表於2012-04-27

轉自:

http://bbs.linuxtone.org/home.php?mod=space&uid=11671&do=blog&id=401

在此表示感謝,現在部落格突然消失的太多,所以paste以備用。

[@more@]

自動刪除歸檔日誌的指令碼(尤其是dataguard環境)

已有 236 次閱讀2011-12-16 21:02 |個人分類:oracle data guard

自動刪除歸檔日誌的指令碼(尤其是dataguard環境)
在歸檔模式下,要時刻注意磁碟空間不要被歸檔撐爆,尤其在dataguard環境中,更是需要定期清理已經apply的日誌,以免把硬碟撐爆。

在自動刪除日誌需要考慮幾點:
1. 日誌必須是已經被apply的
2. 日誌備份已經被備份過的
3. 為了保證一定的管理餘地,不要apply後馬上刪除,而應該根據實際情況設定一個刪除策略。
4. 指令碼要能夠相容primary和standby兩種狀態,且自動判斷狀態並執行不同的邏輯,否則在切換後,如果忘記修改指令碼,那就可能杯具了。

以下是我用於刪除歸檔日誌的一個指令碼,執行這個指令碼需要輸入一個引數來控制日誌的保留時間。
這個指令碼可用於primary端也可用於standby端,
1. 對於standby端,只要在儲存週期內且被apply的歸檔都會被刪除
2. 對於primary端,除了滿足儲存週期以及被apply條件外,還要保證歸檔已經被備份過才會被刪除

對於dataguard環境,雖然備份可以選擇在primary和standby端執行,但如果壓力不是非常大的話,為了管理方便,更建議在primary端執行。

詳細指令碼如下:

[oracle@dwapp1 DBA]$ cat delete_arch.sh
#!/bin/bash

##################################################################################################################
#
# This script is to delete the arch logs for the standby database after it has applied the logs to the instance.
#
##################################################################################################################

source /home/oracle/.bash_profile

#####################
usage()
{ #usage
echo " USAGE: `basename $0` $retention"
exit 2
}


ArgNum=1

if [ ! $# -eq $ArgNum ];then
echo " "
echo " Incorrect parameter"
usage
fi


retention=$1

script=`basename $0`

dir=/tmp
tmpf=$dir/.$script.tmp

# get archived log list for standby database
function GetLogListForStandby
{
sqlplus -S /nolog < $tmpf
connect / as sysdba
set head off
set feedback off
set pages 0
select name from(
select name,sequence#,row_number() over(partition by a.sequence# order by name) rn,
count(decode(applied,'YES',1,null)) over (partition by a.sequence#) cn from v$archived_log a
where completion_time and a.resetlogs_id in (
select i.resetlogs_id from v$database_incarnation i where status = 'CURRENT')
)
where rn=1 and cn=1
order by sequence#;
exit
EOF
return
}

function GetDBRole
{
sqlplus -S /nolog <connect / as sysdba
set head off
set feedback off
set pages 0
select controlfile_type from v$database;
exit
EOF
return
}

# get archived log list for primary database
function GetLogListForPrimary
{
sqlplus -S /nolog < $tmpf
connect / as sysdba
set head off
set feedback off
set pages 0
select name from(
select name,sequence#,row_number() over(partition by a.sequence# order by name) rn,
sum(backup_count) over(partition by a.sequence# ) bk_cnt,
count(decode(applied,'YES',1,null)) over (partition by a.sequence#) cn
from v$archived_log a where completion_time and a.resetlogs_id in (
select i.resetlogs_id from v$database_incarnation i where status = 'CURRENT')
)
where rn=1 and cn=1 and bk_cnt>0
order by sequence#;
exit
EOF
return
}

function GetDBRole
{
sqlplus -S /nolog <connect / as sysdba
set head off
set feedback off
set pages 0
select controlfile_type from v$database;
exit
EOF
return
}



# check database role
DBROLE=`GetDBRole`

NUM=0

if [ $DBROLE = "CURRENT" ];then
echo "It's a primary database ......"
# get archived log list for primary
GetLogListForPrimary

elif [ $DBROLE = "STANDBY" ];then
echo "It's a standby database ......"
# get archived log list for standby
GetLogListForStandby
fi

echo "deleting archived log files ......"

if [ -n $tmpf ]; then
for ARCH in `cat $tmpf`;do
if [ -f $ARCH ];then
NUM=`expr $NUM + 1`
rm -f $ARCH
fi
done
fi

rm -f $tmpf

echo "finished deleting $NUM files"


使用測試:需要輸入一個引數,用於設定儲存週期。以下例子是刪除3天前的歸檔

[oracle@dwapp1 DBA]$ ./delete_arch.sh 3
It's a primary database ......
deleting archived log files ......
finished deleting 12 files

設定定時任務自動執行

1 */4 * * * /home/oracle/DBA/delete_arch.sh 2


當然,對於非dataguard環境或者dataguard環境的primary端,更建議使用RMAN來管理歸檔了。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/91725/viewspace-1058049/,如需轉載,請註明出處,否則將追究法律責任。

相關文章