Dataguard的维护稍微麻烦点,不能删除尚未applied的归档日志,但是每次手工去核对就比较麻烦了,今天在pub上看到这样一个要求:“哪位有 standby数据库 定期删除已经apply的archive的shell脚本?”于是就写了个脚本,基本可以满足题目的要求:
1、已经在standby库apply的;
2、2天以上的
脚本如下(具体的脚本和初始化路径可见文章最后的下载tar包,在这里对这个脚本的内容进行下说明):
OS:
1 2 |
[oracle@standby1 etc]$ cat redhat-release Enterprise Linux Enterprise Linux AS release 4 (October Update 4) |
DB:
1 2 3 4 5 6 7 |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
#!/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.org # ######################################################################### ## 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 <------------------------从此处开始利用sqlldr将arch文件列表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表有争用。
此处下载del_appl_arc.tar
3条评论
load exisit archlog list to db
这一步sqlldr有存在的必要吗?
re Kamus:写shell的技能比较弱,所以图方便,都load数据库中去处理了.
这个脚本在备库上运行会有问题呀,必须修改才行,在备库上把dbsid改成备库的db_unique_name和sqlldr这段去掉就可以了