自動刪除歸檔日誌的指令碼(尤其是dataguard環境)
轉自:
http://bbs.linuxtone.org/home.php?mod=space&uid=11671&do=blog&id=401
在此表示感謝,現在部落格突然消失的太多,所以paste以備用。
[@more@]自動刪除歸檔日誌的指令碼(尤其是dataguard環境)
|
自動刪除歸檔日誌的指令碼(尤其是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來管理歸檔了。
在自動刪除日誌需要考慮幾點:
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 <
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
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 <
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 <
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
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 <
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來管理歸檔了。
作者 space6212 http://space6212.itpub.net/post/12157/511689
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/91725/viewspace-1058049/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- oracle dataguard 自動刪除歸檔日誌Oracle
- DATAGUARD_standby刪除歸檔日誌的指令碼指令碼
- DataGuard已應用歸檔日誌刪除指令碼指令碼
- rac+dg環境刪除歸檔日誌
- 【ARCH】留存,Oracle11g之前Dataguard環境刪除歸檔指令碼Oracle指令碼
- crontab不能自動刪除歸檔日誌
- 如何定期自動刪除歸檔日誌
- 手動刪除歸檔日誌
- 歸檔日誌的刪除
- 備庫自動刪除已應用的歸檔日誌
- 指令碼定期自動刪除ASM下的歸檔檔案指令碼ASM
- oracle刪除歸檔日誌Oracle
- Oracle歸檔日誌刪除Oracle
- 刪除歸檔日誌檔案
- 配置rman來自動刪除應用過的歸檔日誌
- 日誌刪除指令碼指令碼
- dg刪除備庫已經應用的歸檔日誌指令碼指令碼
- 刪除data guard歸檔日誌
- 作用RMAN 刪除歸檔日誌
- oracle rman不能自動刪除歸檔日誌備份解決Oracle
- Oracle 11g 自動刪除ASM歸檔檔案指令碼OracleASM指令碼
- 刪除歸檔,保留最近的5個歸檔日誌
- oracle 刪除過期的歸檔日誌Oracle
- 歸檔日誌刪除的五種方法
- 【Oracle】 rman 刪除歸檔日誌的命令Oracle
- 手工rm刪除歸檔日誌對備份歸檔日誌的影響
- 定期刪除歸檔檔案的指令碼指令碼
- 當ORACLE歸檔日誌滿後如何正確刪除歸檔日誌Oracle
- 誤刪歸檔日誌除導致備份歸檔日誌失敗
- rman刪除舊的歸檔日誌問題
- Oralce資料庫關閉歸檔日誌並且刪除歸檔日誌資料庫
- RMAN delete archivelog命令刪除歸檔日誌及歸檔日誌拷貝deleteHive
- rman刪除歸檔日誌命令集
- 【警鐘】謹慎刪除歸檔日誌
- asm下如何自動刪除standby上已經applied過的歸檔日誌ASMAPP
- 一個刪除重做日誌檔案的參考指令碼指令碼
- 如何正確刪除ORACLE歸檔日誌檔案Oracle
- rman 刪除指定時間點的歸檔日誌