暂无图片
暂无图片
9
暂无图片
暂无图片
暂无图片

Oracle Data Guard备库清理归档脚本

原创 lu9up的数据库笔记 2024-09-29
939

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点执行一次清理任务。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论