Oracle Data Guard备库清理归档脚本

1 说明

我们知道在Oracle Data Guard架构中归档模式是必须打开的,主库将日志传输到备库,最终存放到备库的归档日志文件中。随着系统的运行,归档日志文件会不断累积,如果不及时清理,则会造成归档空间被写满,影响系统运行。

ADG环境一般都说主库用于写操作,备库用来做查询操作(11g及以后)。但实际上,由于各种原因,备库一般很少提供给业务系统查询使用,备份也不在上面做(不一定对,不过至少在我参加工作两年来,换了两份工作里是这样的)。

所以,备库由于存在感很低,容易发生归档空间爆满的现象,备库就无法接收主库的归档。如果发现时已经过去了很久,并且主库的归档已经删除,出现GAP,这时候备库就要做恢复了。

因此,我们在搭建好环境后,非常有必要加强对备库的监管,并且配置一个定期清理归档日志的定时任务,就可以避免上述情况发生。

2 准备工作

准备工作主要是检查DG同步情况和创建脚本目录。

2.1 DG同步情况检查

一、检查数据库角色

确认主备库分别是哪个。

select db_unique_name,open_mode,switchover_status,database_role from v$database;

二、检查归档应用情况

在主备库都执行语句来查看归档日志是否一致。

set lines 200;
col name for a70
alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
select *
  from (select recid,name,thread#,sequence#,resetlogs_time,first_time,applied,status
		  from v$archived_log
		 order by sequence# desc)
  where rownum <= 20;

三、查看是否有 GAP

在主库上查询是否有GAP,为空则是没有。

select thread#, low_sequence#, high_sequence# from v$archive_gap;

四、查看是否有传输错误

主库查看归档传输是否有报错。

select dest_name, status, type, error from v$archive_dest_status where dest_name in('LOG_ARCHIVE_DEST_1','LOG_ARCHIVE_DEST_2'); 

五、查看进程

主库主要看 LNS 进程,此进程负责将主数据库的重做日志条目传输到备用数据库。备库主要看 MRP0 进程,此进程负责将接收到的归档日志应用到备用数据库上,以维持与主数据库的同步。MRP进程是ADG中的关键组件,它确保备用数据库的数据与主数据库保持一致。

select process ,status , sequence# from v$managed_standby;

六、检查备库lag

set lines 200
col name for a30
col value for a30
select * from v$dataguard_stats;

2.2 创建脚本目录

根据自己的习惯,选择一个路径创建脚本目录,oracle用户操作:

# su - oracle
$ cd /home/oracle
$ mkdir -p scripts/deleted_dgarch/src
$ mkdir -p scripts/deleted_dgarch/log
$ mkdir -p scripts/deleted_dgarch/sql

3 脚本

3.1 脚本说明

一、脚本实现的功能是

  • 清理一周前备库已经应用了的归档日志文件。

二、脚本实现逻辑是

  1. 获取最近应用的归档日志时间;
  2. RMAN基于这个时间删除一周前的归档日志文件。

3.2 部署脚本

一、deleted_dgarch.sql

此sql脚本文件的作用是获取最近应用的归档日志时间,并拼接成RMAN删除归档日志的脚本,脚本输出到/home/oracle/scripts/deleted_dgarch/sql/deleted_dgarch.rman。

创建脚本文件:

$ su - oracle
$ cd /home/oracle/scripts/deleted_dgarch/sql
$ vi deleted_dgarch.sql
$ chmod +x deleted_dgarch.sql

添加以下内容:

set lines 200
set echo off feedback off heading off termout off
spool /home/oracle/scripts/deleted_dgarch/sql/deleted_dgarch.rman
select 'delete noprompt archivelog all completed before ' || '"to_date(''' || to_char(max(first_time-7),'yyyy-mm-dd hh24:mi:ss') || ''',' || '''yyyy-mm-dd hh24:mi:ss' || ''')";' scripts from v$archived_log where applied = 'YES' and name is not null;
spool off
exit;

脚本测试:

# 1 运行脚本
$ sqlplus / as sysdba @/home/oracle/scripts/deleted_dgarch/sql/deleted_dgarch.sql

# 2 查看结果,可以将脚本拿到rman里执行看看有没有报错
$ cat deleted_dgarch.rman
delete noprompt archivelog all completed before "to_date('2024-09-20 02:00:02','yyyy-mm-dd hh24:mi:ss')";

二、deleted_dgarch.sh

此脚本的作用是调用deleted_dgarch.sql,创建脚本文件:

$ cd /home/oracle/scripts/deleted_dgarch/src
$ vi deleted_dgarch.sh
$ chmod +x deleted_dgarch.sh

脚本内容如下:

#!/bin/bash

if [ -f $HOME/.bash_profile ];
then
    . $HOME/.bash_profile
fi

# ---------------------------------------------------------------
# environment variables
# ---------------------------------------------------------------

export ORACLE_SID=orcladg
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=/u01/app/oracle/product/11.2/db_1

DATE=`date +'%Y%m%d%H'`

SCRBASE=/home/oracle/scripts/deleted_dgarch
SCRDIR=${SCRBASE}/src
SQLDIR=${SCRBASE}/sql
LOGDIR=${SCRBASE}/log

LOG_FILE=${LOGDIR}/${DATE}_${ORACLE_SID}_DELETED_DGARCH.log

# ---------------------------------------------------------------
# Create RMAN delete archive log script
# ---------------------------------------------------------------

echo -e "\n****** Create RMAN delete archive log script On `date +'%F %T'` ******\n" >> ${LOG_FILE}

sqlplus / as sysdba @${SQLDIR}/deleted_dgarch.sql

cat ${SQLDIR}/deleted_dgarch.rman >> ${LOG_FILE}

# ---------------------------------------------------------------
# RMAN delete archive log
# ---------------------------------------------------------------

echo -e "\n****** RMAN delete archive log On `date +'%F %T'` ******\n" >> ${LOG_FILE}

rman target / cmdfile=${SQLDIR}/deleted_dgarch.rman msglog ${LOG_FILE} append

# ---------------------------------------------------------------
# Finish
# ---------------------------------------------------------------

echo -e "\n****** RMAN delete archive log Finished On `date +'%F %T'` ******\n" >> ${LOG_FILE}

exit 0

4 脚本测试

4.1 运行脚本

$ cd /home/oracle/scripts/deleted_dgarch/src
$ ./deleted_dgarch.sh

image.png

4.2 查看日志

$ cd /home/oracle/scripts/deleted_dgarch/log
$ more 2024092613_orcladg_DELETED_DGARCH.log

image.png

5 创建定时任务

创建一个定时任务,可以每天执行这个清理脚本。删除归档的操作对资源耗费不高,可以每天多执行几次,特别是在日志切换比较频繁的数据库中,可以极大平坦每次占用的资源,降低系统负载,避免性能抖动。

$ su - oracle
$ crontab -e

添加以下内容:

# --------------------------------------------------------------------
# Delete Archive Log
# --------------------------------------------------------------------
0 0,6,12,18 * * *  sh /home/oracle/scripts/deleted_dgarch/src/deleted_dgarch.sh >/dev/null 2>&1

每6小时一次,在午夜、早上6点、中午和下午6点执行一次清理任务。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值