您好,登錄后才能下訂單哦!
這篇文章主要介紹如何實現自動刪除歸檔日志的腳本,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
已有 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 <<EOF > $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 <sysdate-$retention
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 <<EOF
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 <<EOF > $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 <sysdate-$retention
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 <<EOF
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來管理歸檔了。
以上是“如何實現自動刪除歸檔日志的腳本”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。