Oracle ADG容灾端部署Rman备份的一些实践经验

随着数据库中数据量的不断增加、业务的复杂性提高、各种政策颁布的系统容灾等级要求,数据库备份的工作及备份文件的有效性及备份文件的管理变得愈发重要。在Oracle数据库中提供了强大的备份和恢复工具,其中RMAN(Recovery Manager)是一个常用的备份工具。为了有效地管理备份存储空间和资源,Rman支持多种灵活的方式对备份文件的存储生命周期进行管理,如Rman自带备份文件保留周期管理策略,支持基于天数和冗余的两种方式模式;支持第三方介质管理对备份文件保留周期的管理策略。同时在Oracle 11G中,引入了ADG(active standby database)功能,使得备库可以启动到只读模式,此时可以在备份上运行业务,分担主库的压力,其中也包括在备份上执行对数据库进行Rman的备份,但是官方文档中要求在ADG环境中部署Rman备份,必须配置catalog数据库,并且需要将主库和备份的信息都注册到catalog数据库中,否则无法在主备库之间进行备份集元数据的同步和备份集的管理。其实在很多客户现场中,备份集元数据的管理基本上都是通过控制文件来管理的,并未采用catalog数据库,那是否意味着无法再ADG备库对进行Rman备份了呢?答案是否定,下面我们就简单的讲解一下,在ADG备库端,无Catalog数据库的情况下,怎么对数据库进行备份和备份文件的自动管理。关于ADG中通过在catalog环境中怎么部署ADG备库段的Rman备份,请直接参考官方文档即可。

下面就从简单的备份文件保留策略说起。

1,备份文件保留策略

备份文件的保留策略是通过设置 Rman中的RETENTION POLICY 参数来控制的,这个策略定义了备份文件在存储介质上保留的策略。在RMAN备份中,可以使用不同的保留策略来管理备份集的保留期限。其中,基于恢复窗口和冗余是两种常见的保留策略。

  1. 基于恢复窗口的保留策略:
    • 描述: 恢复窗口是指在特定时间范围内可以使用的备份集。基于恢复窗口的保留策略允许您设置备份在一定的时间窗口内有效,而超出该时间窗口的备份将被自动删除。
    • 配置方法: 在RMAN脚本或命令中,您可以使用CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF <n> DAYS;来设置基于恢复窗口的保留策略,其中<n>是您希望的恢复窗口的天数。
    • 影响: RMAN将自动删除超出指定恢复窗口的备份,以确保备份集的大小在可控范围内,同时提供了较短的恢复时间窗口。
  2. 基于冗余的保留策略:
    • 描述: 基于冗余的保留策略是指设置备份集的冗余副本数量。RMAN会保留足够数量的备份,以满足指定的冗余级别,而超出冗余级别的备份将被自动删除。
    • 配置方法: 使用CONFIGURE RETENTION POLICY TO REDUNDANCY <n>;来设置基于冗余的保留策略,其中<n>是您希望的冗余级别,即备份副本的数量。
    • 影响: 通过设置冗余级别,您可以确保在备份集中始终有足够数量的备份,以防止单点故障,并提供高可用性。RMAN会自动删除超出冗余级别的旧备份。

1. 查看当前的保留策略

在 RMAN 命令行或脚本中,您可以使用以下命令查看当前数据库的备份文件保留策略:

SHOW RETENTION POLICY;

2. 配置恢复窗口保留策略

可以通过 CONFIGURE RETENTION POLICY 命令来设置备份文件的恢复窗口的保留时间。以下是一个设置保留时间为7天的示例:

CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;

3. 配置冗余保留策略

也是通过 CONFIGURE RETENTION POLICY 命令来设置备份文件的冗余度,以下是一个设置冗余为天的示例:

CONFIGURE RETENTION POLICY TO REDUNDANCY 2;

2,ADG备库中配置保留策略

备份环境为只读环境,不支持手动修改备份文件的保留策略,默认继承备库在搭建时,主库控制文件中配置的备份文件报错策略,如果后期主库修改了备份文件保留策略,是不会自动同步到备库环境的。

下面是在备库环境主动修改备份文件的保留策略,会触发如下的报错:

RMAN> show all;

using target database control file instead of recovery catalog
RMAN configuration parameters for database with db_unique_name ORCLSTD are:
CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # default
CONFIGURE BACKUP OPTIMIZATION ON;
CONFIGURE DEFAULT DEVICE TYPE TO DISK; # default
CONFIGURE CONTROLFILE AUTOBACKUP OFF; # default
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '%F'; # default
CONFIGURE DEVICE TYPE DISK PARALLELISM 1 BACKUP TYPE TO BACKUPSET; # default
CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
CONFIGURE MAXSETSIZE TO UNLIMITED; # default
CONFIGURE ENCRYPTION FOR DATABASE OFF; # default
CONFIGURE ENCRYPTION ALGORITHM 'AES128'; # default
CONFIGURE COMPRESSION ALGORITHM 'BASIC' AS OF RELEASE 'DEFAULT' OPTIMIZE FOR LOAD TRUE ; # default
CONFIGURE ARCHIVELOG DELETION POLICY TO APPLIED ON ALL STANDBY;
CONFIGURE SNAPSHOT CONTROLFILE NAME TO '/oracle/app/oracle/product/11.2.0/dbhome_1/dbs/snapcf_orcl.f'; # default

RMAN> CONFIGURE RETENTION POLICY TO REDUNDANCY 2;

RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of configure command at 11/30/2023 20:59:47
RMAN-05021: this configuration cannot be changed for a BACKUP or STANDBY control file

那是否没有办法实现备库环境自定义备份文件的保留策略了呢?其实可以通过如下的两个版本:

  1. 修改主库控制文件的方法

    在主库修改备份文件的保留策略,然后将备份控制文件,在还原到备库环境,此时备库环境就继承了主库环境的备份文件的保留策略。

  2. 通过Rman命令制定备份集保留策略

    比如在Rman的delete命令中,手动制定备份集的保留策略,同样支持恢复窗口和冗余两种方式,如下

    • 恢复窗口模式

      DELETE NOPROMPT OBSOLETE RECOVERY WINDOW OF 2 DAYS;

    • 冗余模式

      DELETE NOPROMPT OBSOLETE REDUNDANCY 2;

3,ADG环境的备份元数据同步

上面内容实现了备份文件集的保留策略的管理,下面就是备份文件集的元数据在主库和备库之前的同步。首先我们聊聊什么是备份元数据?

备份的元数据指的是备份操作相关的信息和描述。这些元数据包括备份集的结构、备份的类型、备份的位置、备份集内的文件信息等。以下是一些常见的Oracle RMAN备份元数据:

  1. 备份集信息: RMAN备份创建一个或多个备份集,其中包含了备份的数据。备份集的元数据包括备份集的唯一标识符、创建时间、备份集的状态等。
  2. 备份集内的文件信息: RMAN备份集内包含了一个或多个数据库文件的备份。每个文件备份都有相关的元数据,包括文件名、大小、类型(全备份、增量备份等)、创建时间等。
  3. 备份集的位置信息: 元数据还包括备份集的存储位置,这可能是磁盘、磁带或其他媒体。这对于后续的恢复操作非常重要。
  4. 备份的类型和级别: RMAN支持全备份、增量备份等不同类型的备份,元数据中包含了备份的类型信息。此外,还包括备份的级别,例如完整备份、差异备份等。
  5. 恢复目标信息: 元数据中可能包含指示备份的恢复目标信息,例如完全恢复数据库、部分恢复等。

通过这些元数据,RMAN能够有效地管理备份和还原操作。它可以追踪备份的历史,了解每个备份的详细信息,以及确保备份集的一致性和完整性。这对于dba来说是非常重要的,特别是在需要执行数据库恢复操作时。

其实简单一点元数据库就是用于了解备份集的信息,用于后期数据库的还原和备份集本身的管理。

在ADG备库中备份集本身的管理通过上面配置的方法已经可以实现了,后续的目的就是数据库的还原了。其实生产环境中,如果有Adg的场景中,生产环境数据库不可用的情况,并且需要在生产数据库上直接执行还原的场景真心不多,可以说,从自己过去的工作经验中,还从来没有遇到过。有ADG场景中,主库不可用时,基本上都是通过容灾切换的方式来快速的恢复数据库服务的可用。

所以个人认为在ADG这些的场景中,无需去将备份集的元数据同步到主库中。如果真的要同步,可以采用catalog的方式,将文件系统中或者磁盘中的备份片注册到控制文件或者catalog数据库中,完成备份元数据库的同步。

4,ADG场景中有必要做Rman备份吗?

那是否有Adg的环境中,无法对数据库做Rman备份呢?当然是否定的,下面的一些场景中还是需要Rman备份集的。

  • 历史数据的还原。

  • 备份数据的归档存放。

  • 逻辑损坏、特殊的物理损坏场景(加密等)。

  • 最后的救命稻草。

  • ........

5,备份脚本分享

下面为自己的常用的一个Rman备份的脚本,每周日对数据库做全部,其它的时间对数据库做增量,此脚本是在原来NBU调用的脚本的基础之上改的。

脚本见最后附录。

6,Oracle MAA架构

前面聊到一个文件,就是有Adg环境中是否有必要再做Rman的备份,也提到了一些场景中会用到Rman的备份集。其实在我自己原来的工作履历中,给客户设计数据库备份的解决方案中,真的有很多客户没有给他们规划Rman的备份,为什么呢?Rman为Oracle MAA架构中的一部分,结合MAA中的技术、客户的需求和硬件的环境,无需Rman的技术仍然可以满足客户的需求。Oracle MAA的架构图如下:

图片引用Oracle在B站上公开分享的内容。

附录

#!/bin/sh


export LANG=en_US.UTF-8
SHELL_HOME=/home/oracle
RMAN_DATA=`date '+%Y%m%d%H'`

if [ ! -d "$SHELL_HOME/log" ]
then
        mkdir -p $SHELL_HOME/log
fi

RMAN_LOG_FILE=${SHELL_HOME}/log/`echo  ${0}|awk -F  '/' '{print $NF}'`_${RMAN_DATA}.out

if [ -f "$RMAN_LOG_FILE" ]
then
        rm -f "$RMAN_LOG_FILE"
fi

RMAN_IMAGE_DIR=/oracle/backup/orcl
echo "rman image output directory:${RMAN_IMAGE_DIR}">>$RMAN_LOG_FILE

 
echo Script $0 >> $RMAN_LOG_FILE
echo ==== started on `date` ==== >> $RMAN_LOG_FILE
echo >> $RMAN_LOG_FILE
ORACLE_HOME=/oracle/app/oracle/product/11.2.0/dbhome_1
export ORACLE_HOME
ORACLE_SID=orcl
export ORACLE_SID


COMPRESSED=1
echo   "compressed type: $COMPRESSED" >> $RMAN_LOG_FILE


TARGET_CONNECT_STR=sys/manager
 


RMAN=$ORACLE_HOME/bin/rman



echo >> $RMAN_LOG_FILE
echo   "RMAN: $RMAN" >> $RMAN_LOG_FILE
echo   "ORACLE_SID: $ORACLE_SID" >> $RMAN_LOG_FILE
echo   "ORACLE_USER: $ORACLE_USER" >> $RMAN_LOG_FILE
echo   "ORACLE_HOME: $ORACLE_HOME" >> $RMAN_LOG_FILE



echo  >> $RMAN_LOG_FILE



echo >> $RMAN_LOG_FILE

INCR_DATA=`date '+%A'`

if [ "$INCR_DATA" = "Sunday" ]
then
        echo "Full backup requested" >> $RMAN_LOG_FILE
        BACKUP_TYPE="INCREMENTAL LEVEL=0"
        TAG_NAME="HOT_DB_BK_LEVEL_0_"$RMAN_DATA
else 
        echo "Differential incremental backup requested" >> $RMAN_LOG_FILE
        BACKUP_TYPE="INCREMENTAL LEVEL=1"
        TAG_NAME="HOT_DB_BK_LEVEL_1_"$RMAN_DATA
 
fi


if [ "$COMPRESSED"="1" ]
then
    COMPRESS_TYPE="as compressed backupset"
    echo "enable compressed backupset" >> $RMAN_LOG_FILE
else 
    COMPRESS_TYPE='';
    echo "disable compressed backupset" >> $RMAN_LOG_FILE
fi

echo "BACKUP_TYPE">> $RMAN_LOG_FILE
echo ${BACKUP_TYPE} >> $RMAN_LOG_FILE


ORACLE_HOME=$ORACLE_HOME
export ORACLE_HOME
ORACLE_SID=$ORACLE_SID
export ORACLE_SID
$RMAN target $TARGET_CONNECT_STR nocatalog msglog $RMAN_LOG_FILE append << EOF
RUN {
ALLOCATE CHANNEL ch00 TYPE DISK;
ALLOCATE CHANNEL ch01 TYPE DISK;
# crosscheck archivelog 
CROSSCHECK ARCHIVELOG ALL;
# crosscheck backup image
CROSSCHECK BACKUP;
#DELETE OBSOLETE BACKUP IMAGE
DELETE NOPROMPT OBSOLETE RECOVERY WINDOW OF 13 DAYS;
#DELETE EXPIRED BACKUP IMAGE
DELETE NOPROMPT EXPIRED BACKUP; 
BACKUP
    $COMPRESS_TYPE
    $BACKUP_TYPE
    SKIP INACCESSIBLE
    TAG $TAG_NAME
    FILESPERSET 2
    # recommended format
    FORMAT '${RMAN_IMAGE_DIR}/bk_%s_%p_%t'
    DATABASE;
RELEASE CHANNEL ch00;
RELEASE CHANNEL ch01;
# backup all archive logs
ALLOCATE CHANNEL ch00 TYPE DISK;
ALLOCATE CHANNEL ch01 TYPE DISK;
BACKUP
   $COMPRESS_TYPE
   filesperset 20
   TAG $TAG_NAME
   FORMAT '${RMAN_IMAGE_DIR}/al_%s_%p_%t'
   ARCHIVELOG ALL DELETE INPUT;
RELEASE CHANNEL ch00;
RELEASE CHANNEL ch01;
#
# Note: During the process of backing up the database, RMAN also backs up the
# control file.  This version of the control file does not contain the
# information about the current backup because "nocatalog" has been specified.
# To include the information about the current backup, the control file should
# be backed up as the last step of the RMAN section.  This step would not be
# necessary if we were using a recovery catalog or auto control file backups.
#
ALLOCATE CHANNEL ch00 TYPE DISK;
BACKUP
    # recommended format
    TAG $TAG_NAME
    FORMAT '${RMAN_IMAGE_DIR}/cntrl_%s_%p_%t'
    CURRENT CONTROLFILE;
RELEASE CHANNEL ch00;
}
EOF
exit

echo Script $0 >> $RMAN_LOG_FILE
echo ==== end on `date` ==== >> $RMAN_LOG_FILE
echo >> $RMAN_LOG_FILE