Oracle定时删除归档日志文件
Tags: DBA脚本Oracle定时删除归档日志归档日志脚本分享
对于单实例的数据库,在没有DG的环境下,可以使用如下的脚本,保留归档日志2天:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | mkdir -p /home/oracle/log cat > /home/oracle/del_arc.sh <<"EOF0" #!/bin/bash export ORACLE_SID=lhrdb export ORACLE_HOME=/u01/app/oracle/product/12.2.0/dbhome_1 export NLS_LANG="american_america.ZHS16GBK" export NLS_DATE_FORMAT="YYYY-MM-DD HH24:Mi:SS" LOG_DIR=/home/oracle/log DATEL=`date '+%Y-%m-%d'` LOG_NAME=${LOG_DIR}/del_arc_${ORACLE_SID}_${DATEL}".log" $ORACLE_HOME/bin/rman log=$LOG_NAME target / <<EOF crosscheck archivelog all; delete force noprompt archivelog all completed before 'sysdate-2'; exit; EOF EOF0 |
修改ORACLE_SID和ORACLE_HOME即可。
对于DG环境,需要删除已经应用到备库的归档日志,可以使用如下的脚本,在主备库都需要部署:
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 | mkdir -p /home/oracle/log cat > /home/oracle/del_arc_dg.sh <<"EOF0" #!/bin/bash export ORACLE_SID=lhrdb export ORACLE_HOME=/u01/app/oracle/product/12.2.0/dbhome_1 export NLS_DATE_FORMAT="YYYY-MM-DD HH24:Mi:SS" LOG_DIR=/home/oracle/log DATEL=`date '+%Y-%m-%d'` LOG_NAME=${LOG_DIR}/deladgarc_${ORACLE_SID}_${DATEL}".log" SQL_NAME=${LOG_DIR}/deladgarc_${ORACLE_SID}_${DATEL}".sql" $ORACLE_HOME/bin/sqlplus -S / as sysdba <<EOF set feedback off heading off pagesize 0 linesize 100 col exec_sql format a50 spool ${SQL_NAME} SELECT 'delete archivelog sequence ' || A.SEQUENCE# || ' thread ' || A.THREAD# || ';' EXEC_SQL FROM V\$ARCHIVED_LOG A WHERE (A.THREAD#, A.SEQUENCE#, a.RESETLOGS_CHANGE#) IN (SELECT b.THREAD#, b.SEQUENCE#, b.RESETLOGS_CHANGE# FROM V\$ARCHIVED_LOG B WHERE B.APPLIED = 'YES' AND b.COMPLETION_TIME <= SYSDATE - 8) AND a.NAME NOT IN (SELECT b.DESTINATION FROM v\$archive_dest b WHERE b.DESTINATION IS NOT NULL) AND A.COMPLETION_TIME <= SYSDATE - 8 ORDER BY A.THREAD#, A.SEQUENCE#; spool off exit EOF $ORACLE_HOME/bin/rman log=$LOG_NAME target / <<EOF crosscheck archivelog all; delete noprompt expired archivelog all; @${SQL_NAME} exit; EOF EOF0 |
配置定时任务(每天下午5点执行删除任务):
1 2 3 4 5 6 7 | chmod +x del_arc.sh crontab -e 0 17 * * * /home/oracle/del_arc.sh systemctl status crond ps -ef | grep crond |