定期删除DG归档日志的脚本

作者在 2008-04-15 14:10:57 发布以下内容

Dataguard的维护稍微麻烦点,不能删除尚未applied的归档日志,但是每次手工去核对就比较麻烦了,今天在pub上看到这样一个要求:“哪位有 standby数据库 定期删除已经apply的archive的shell脚本?”于是就写了个脚本,基本可以满足题目的要求:

1、已经在standby库apply的;

2、2天以上的

脚本如下(具体的脚本和初始化路径可见文章最后的下载tar包,在这里对这个脚本的内容进行下说明):
OS:

[oracle@standby1 etc]$ cat redhat-release
Enterprise Linux Enterprise Linux AS release 4 (October Update 4)

DB:

BANNER
--------------------------------------------------------------------------------------------------
--
Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production

PL/SQL Release 9.2.0.4.0 - Production
CORE    9.2.0.3.0       Production
TNS for Linux: Version 9.2.0.4.0 - Production
NLSRTL Version 9.2.0.4.0 - Production

脚本部署路径为:/oracle/del_appl_arc/bin
脚本生成的日志路径:/oracle/del_appl_arc/log

#!/bin/sh
#########################################################################
#         This shell is for primary and standby database                #
#         to rm applied archivelog that before some day ago.            #
#                                                                       #
#       You can define "some day" in variables ${day_before}            #
#            This shell can be put in crontab for auto run              #
#                                                                       #
#            2008-01-18   writen by www.oracleblog.cn                   #
#########################################################################
 
## load profile file
. /oracle/.bash_profile
 
## Path Define
main_path=/oracle/del_appl_arc     
<----------------部署的主路径
bin_path=${main_path}/bin      <--------------------脚本所在路径
log_path=${main_path}/log      <---------------------脚本日志所在路径
arc_path=/oracle/arch      <-------------------------归档日志所在路径
 
cd ${bin_path}
 
##
Initial script
touch app_arc_name.sh
chmod +x app_arc_name.sh
 
##
rm applied archivelog that before ${day_before} day ago
day_before=1      <-------------------------------------假设删除1天前已经规定的日志,这个变量设置为1,你可以设置成其他。 
 
##
Db info
dbuser=test
dbpwd=test
dbsid=primary
 
##########
Main shell start here ##########
##
load exisit archlog list to db      <------------------------从此处开始利用sqlldrarch文件列表load到数据库中。
sqlplus ${dbuser}/${dbpwd}@${dbsid}<<EOF >/dev/null
drop table ${dbuser}.arc_log_list;
CREATE TABLE ${dbuser}.arc_log_list (arc_name VARCHAR2(2000));
exit;
EOF
 
ls -l ${arc_path}|awk '{print $9}' |grep arc >arc_log_list.tmp
 
echo "load data">>arc_log.ctl
echo "infile 'arc_log_list.tmp'">>arc_log.ctl
echo "replace into table arc_log_list">>arc_log.ctl
echo "fields terminated by X'09'">>arc_log.ctl
echo "(arc_name)">>arc_log.ctl
 
sqlldr ${dbuser}/${dbpwd}@${dbsid} control=arc_log.ctl log=sqlldr_run.log bad=sqlldr_badfile.bad
 
### Create shell for rm applied archive that before some day ago
sqlplus -s ${dbuser}/${dbpwd}@${dbsid}
<<EOF>/dev/null      <-------------利用load数据库中的arch列表和
set feedback off                                     <-------------数据库中v$archived_log,找出符合条件可以删除的arch,同时生成删除脚本。
set pages 0
set head off
set timing off
set echo off
spool app_arc_name.tmp
select 'rm -f '||'${arc_path}/'||arc_name from test.arc_log_list
intersect
select 'rm -f '||name from v\$archived_log
where DEST_ID=1 and name like '%.arc'
and SEQUENCE#<(select max(SEQUENCE#) from v\$archived_log where applied='YES')
and COMPLETION_TIME<=sysdate-${day_before};
spool
exit
EOF
 
##
Exec the shell in background mode
cat app_arc_name.tmp |grep -v spooling>app_arc_name.sh
./app_arc_name.sh
mv app_arc_name.sh rm_appl_arc_`date +"%Y%m%d%H%M"`.log
 
mv rm_appl_arc*.log ${log_path}
rm app_arc_name.tmp arc_log.ctl sqlldr_run.log arc_log_list.tmp

完成脚本后,你可以把脚本放入crontab中定期运行,以达到自动删除n天以前且已经applied的归档日志。注意crontab的部署把primary和standby的时间错开,如果同时进行,会对arc_log_list表有争用。

技术文章 | 阅读 3387 次
文章评论,共1条
zl芊芊zl(作者)
2008-04-15 14:18
1
Oracle归档日志的删除 
登录rman

1、Oracle8i
     
      RMAN&gt;change archivelog all delete 

2、Oracle9i及以上

    RMAN&gt;delete archivelog all;
游客请输入验证码