联系:手机/微信(+86 17813235971) QQ(107644445)
作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责任的权利.]
Oracle Data Guard 是通过归档文件来进行数据同步的。 主库的归档文件,我们可以在RMAN 备份的时候进行删除,但是备库的归档文件无法自动删除,需要写脚本来定时删除。
#!/bin/bash export ORACLE_HOME=/opt/oracle/product/10.2.0/db_1 export ORACLE_SID=zjch export ARCHIVE_DIR=/opt/oracle/oradata/zjch/archive export LOG_FILE=/home/oracle/logs/del_archive.log echo "开始删除归档日志:`date`……">>$LOG_FILE if [ `whoami` != 'oracle' ] then echo "Error: You must be oracle to execute.">>$LOG_FILE exit 99 fi del_seq=`ls -tr $ARCHIVE_DIR/|grep -v stdarch | head -1|cut -f2 -d_` $ORACLE_HOME/bin/sqlplus -silent "/ as sysdba" <<XFF>tmp.log set pagesize 0 feedback off verify off heading off echo off select max(sequence#) from v\$ARCHIVED_LOG where APPLIED='YES'; exit; XFF max_sn=`cat tmp.log` rm tmp.log max_sn=$(( $max_sn - 20 )) #我这里是保留最近的20个归档文件,这个具体情况自己决定 while [[ ${del_seq} -lt ${max_sn} ]] do echo "${ARCHIVE_DIR}/1_${del_seq}_681145105.dbf">>$LOG_FILE rm ${ARCHIVE_DIR}/1_${del_seq}_681145105.dbf #这里是我定义归档文件的格式,具体根据自己的归档文件格式来匹配,关键是匹配日志的sequence no。 del_seq=$(( $del_seq + 1 )) done echo "删除归档日志结束:`date`……">>$LOG_FILE #清楚controlfile中信息 $ORACLE_HOME/bin/rman target / <<XIFENFEI>>$LOG_FILE crosscheck archivelog all; delete expired archivelog all; YES exit; XIFENFEI echo "………………………………………………………………………………………………………………………">>$LOG_FILE
重点是在读取现在存在的归档日志文件中sequence最小值时,
使用了ls -tr $ARCHIVE_DIR/|grep -v stdarch | head -1|cut -f2 -d_