DM8备份和还原以及实时主备搭建

一、备份和还原

1.1 联机备份

数据库处于运行状态、并正常提供数据库服务情况下进行的备份操作,我们称为联机备份。数据库处于关闭状态时进行的备份操作,被称为脱机备份。一般生产环境下多数会选择联机备份,即在数据库运行的情况下进行数据库的备份。另备份还可以区分为库备份、表空间备份和表备份,这里主要是进行整库的全备。

1.1.1 准备工作

联机备份要求数据库处于归档模式下,DM8可以联机配置归档模式或者手动配置。

  • 联机配置归档,即在数据库运行的状态下,使用sql语句完成归档的配置,基础语法是:alter database <add|modify|delete> archivelog;
    例如:
alter database mount;
alter database add archivelog 'dest = /data/dameng/arch_dsc0, type=local, file_size=1024, space_limit=2048, arcg_flush_buf_size=16, hang_flag=1;
alter database archivelog;
alter database open;
  • 手动配置归档,即通过修改参数文件dm.ini和dmarch.ini来配置归档模式
    例如:
    dmarch.ini文件内容如下:
  [ARCHIVE_LOCAL1] 
    ARCH_TYPE = LOCAL 
    ARCH_DEST = /data/dameng/arch
    ARCH_FILE_SIZE = 1024 
    ARCH_SPACE_LIMIT = 2048
    ARCH_HANG_FLAG = 1

然后修改dm.ini文件中参数ARCH_INI=1,再启动数据库,此时数据库即运行在归档模式下。

1.1.2 联机使用sql语句进行备份

主要语法是backup database backupset '<备份集路径>'; 当然语法中还可以增加其他参数配置,如指定备份名、备份类型、压缩级别、并行数等。
这里我们选择库级全备份,指定备份集路径,其余使用缺省配置:backup database backupset '/backup/data/dameng/full_backup_01';

可以在指定目录下查看到生成的备份文件:

1.2 脱机还原

数据库的还原一般是在脱机状态下进行,DM8提供了脱机备份还原工具DMRMAN,这里我们主要是使用它的脱机还原功能。

1.2.1 DMRMAN登录

DMRMAN 是 DM 提供的命令行工具,无需额外安装。安装 DM 数据库后,DMRMAN 可执行程序与数据库其他可执行程序一样位于安装路径的bin目录下。进入所在目录直接执行命令:
./dmrman
退出的话,在DMRMAN控制台中输入exit即可。

1.2.2 使用DMRMAN进行脱机还原

dmrman进行数据库还原主要是通过三步,即先还原数据库基本文件;然后进行数据一致性的恢复;最后更新db_magic。

  • 数据库还原
    主要语法是restore database <restore_type> from backupset '<备份集路径>',当然还有提供了其他的参数以应对更为复杂的恢复需求。
    我们这里选择在一个初始化的数据库基础上进行简单的数据库还原:

    • 校验待还原备份集的合法性
      check backupset '/backup/data/daemeng/full_backup_01'

    • 还原数据库:可以指定dm.ini进行还原,
      restore database '/data/DAMENG/dm.ini' from backupset '/backup/data/dameng/full_backup_01'

      也可以指定 REUSE DMINI 子句进行数据库还原,此时会将备份集中备份的 dm.ini 中除路径相关的 INI 参数外,均拷贝到当前 dm.ini 上,
      restore database '/data/DAMENG/dm.ini' reuse dmini from backupset '/backup/data/dameng/full_backup_01'

  • 数据库恢复
    即恢复数据一致性,可以基于归档日志恢复或者是基于备份集恢复,主要语法是recover database '<ini_path>' with archivedir '<归档日志目录>'或者recover database '<ini_path>' from backupset '<备份集目录>',这里我们选择从备份集恢复,
    recover database '/data/DAMENG/dm.ini' from backupset '/backup/data/dameng/full_backup_01'

  • 更新db_magic
    数据库更新是指更新数据库的 DB_MAGIC,并将数据库调整为可正常工作状态,与数据库恢复一样使用 RECOVER 命令完成。基本语法是recover database '<ini_path>' update db_magic;
    recover database '/data/DAMENG/dm.ini' update db_magic

至此数据库恢复完成,可以重新启动数据库并验证恢复结果。

二、数据守护

2.1 概述

DM 数据守护(DM Data Watch)的实现原理非常简单:将主库(生产库)产生的 Redo 日志传输到备库,备库接收并重新应用 Redo 日志,从而实现备库与主库的数据同步。DM 数据守护的核心思想是监控数据库状态,获取主、备库数据同步情况,为 Redo 日志传输与重演过程中出现的各种异常情况提供一系列的解决方案。

2.2 守护进程

守护进程是管理数据守护系统的核心部件,监视器(dmmonitor)负责发起命令,守护进程负责解析、处理、转发命令。守护进程提供了数据库监控、故障检测、故障处理、故障恢复等各种功能。

2.3 监视器

通过监视器,可以监控数据守护系统的运行情况,获取主备库状态、守护进程状态以及主备库数据同步情况等信息。有普通监视器和确认监视器两种类型。监视器的基本作用如下:

  • 监控数据守护系统
  • 管理数据守护系统
  • 确认状态信息
  • 发起故障自动接管命令

2.4 配置文件说明

与DM数据守护相关的配置文件包括:dm.ini、dmmal.ini、dmarch.ini、dmwatcher.ini、dmmonitor.ini等。

  • dm.ini中相关的主要参数有:INSTANCE_NAME、PORT_NUM、DW_INACTIVE_INTERVAL、ALTER_MODE_STATUS、ENABLE_OFFLINE_TS、MAL_INI、ARCH_INI、RLOG_SEND_APPLY_MON等;
  • dmmal.ini中相关的主要参数有:MAL_CHECK_INTERVAL、MAL_CONN_FAIL_INTERVAL、MAL_INST_NAME、MAL_HOST、MAL_PORT、MAL_INST_HOST、MAL_INST_PORT、MAL_DW_PORT、MAL_INST_DW_PORT等;
  • dmarch.ini中相关的主要参数有:ARCH_TYPE、ARCH_DEST等;
  • dmwatcher.ini中相关的主要参数有:DW_TYPE、DW_MODE、INST_OGUID等。

三、实时主备搭建

使用数据守护来搭建一个实时的主备环境,现有测试环境如下:
服务器A:192.168.100.11 主库
服务器B:192.168.100.12 备库

3.1 准备工作

配置数据守护之前,必须先通过备份还原方式同步各数据库的数据,确保各数据的数据保持完全一致。主库可以是新初始化的数据库,也可以是正在生产、使用中的数据库。备库在备份还原前,需要先准备初始化一个新库。
所以我们在两台服务器上都初始化一个数据库,然后通过联机备份加脱机恢复的方式准备好主备数据库,操作方法可以查看上面的备份和还原过程。

3.2 配置实时主备

这里只准备了两台服务器,暂时没有配置监视器,主要是主备数据库和对应守护进程。

3.2.1 配置主库

  • 配置主库dm.ini,主要修改如下配置:

      INSTANCE_NAME = GRP1_RT_01 
      PORT_NUM = 5236 #数据库实例监听端口
      DW_INACTIVE_INTERVAL = 60 #接收守护进程消息超时时间
      ALTER_MODE_STATUS = 0 #不允许手工方式修改实例模式/状态/OGUID
      ENABLE_OFFLINE_TS = 2 #不允许备库 OFFLINE 表空间
      MAL_INI = 1 #打开 MAL 系统
      ARCH_INI = 1 #打开归档配置
      RLOG_SEND_APPLY_MON = 64 #统计最近 64 次的日志发送信息
    
  • 配置dmmal.ini

  • 配置dmarch.ini

  • 配置dmwatcher.ini

  • 以mount的方式启动主库
    ./dmserver /data/DAMENG/dm.ini mount

  • 配置OGUID和设置主库模式
    ./disql登录数据库:

    sp_set_para_value(1, 'ALTER_MODE_STATUS', 1);
    sp_set_oguid(453332);
    alter database primary;
    sp_set_para_value(1, 'ALTER_MODE_STATUE', 0);
    

3.2.2 配置备库

  • 配置备库dm.ini,与主库相比,实例名称修改为INSTANCE_NAME = GRP1_RT_02

  • 配置dmmal.ini,与主库配置相同;

  • 配置dmarch.ini,与主库相比,ARCH_DEST = GRP1_RT_01

  • 配置dmwatcher.ini,与主库相同。

  • 以mount的方式启动备库

  • 配置备库的OGUID和设置备库模式:

    sp_set_para_value(1, 'ALTER_MODE_STATUS', 1);
    sp_set_oguid(453332);
    alter database standby;
    sp_set_para_value(1, 'ALTER_MODE_STATUE', 0);
    

3.2.3 启动守护进程

这里我们采用的是服务的方式启动,即用DM提供的注册脚本注册好守护进程的服务:
./dm_service_installer.sh -t dmwatcher -watcher_ini /data/DAMENG/dmwatcher.ini -p DMSERVER,按此注册的服务名为:DmWatcherServiceDMSERVER。
systemctl start DmWatcherServiceDMSERVER

[NOTE]
主备库都启动守护进程,可以在配置日志目录下查看对应日志,如:tail -f /home/dmdba/dmdbms/log/dm_dmwatcher_GRP1_RT_01_202401.log

3.2.4 查看确认

分别登录主备库,查询以下SQL确认主备状态:

SELECT
    CASE
        WHEN "STATUS$" = '1' THEN 'Startup'
        WHEN "STATUS$" = '2' THEN 'After Redo'
        WHEN "STATUS$" = '3' THEN 'MOUNT'
        WHEN "STATUS$" = '4' THEN 'OPEN'
        WHEN "STATUS$" = '5' THEN 'SUSPEND'
    END "库状态" ,
    CASE
        WHEN "ROLE$" = '0' THEN 'Normal'
        WHEN "ROLE$" = '1' THEN 'Parmary'
        WHEN "ROLE$" = '2' THEN 'Standby'
    END "模式" 
FROM
    v$database;

四、引申应用

4.1 背景说明

现有一环境是由两个主备组成,即环境A下有主库P-A和备库S-A,环境B是有主库P-B和备库S-B,整个环境B都是作为环境A的备用,即B是A的副本。

4.2 要求

编写shell脚本,使得需要重建B时直接备份P-A然后还原成P-B和S-B,并且重建B的主备模式。

4.3 测试环境

P-A:192.168.100.10
P-B: 192.168.100.11
S-B: 192.168.100.12

4.4 脚本编写

  • 在P-A上配置好免密传输后,应用备份脚本 dm_backup_full.sh 如下:

    #!/bin/bash
    # on DM V8
    # 执行脚本以对备份端进行全库备份,备份完成后将备份文件传送到恢复端,再配合恢复端的dm_restore.sh脚本进行恢复
    #auth:cuckoo
    
    DISQLEX=/home/dmdba/dmdbms/bin/disql  #典型安装后disql命令的绝对路径,根据实际情况修改
    
    # 备份目标数据库信息
    M_INF=SYSDBA/SYSDBA@127.0.0.1:5236
    
    # 备份目标数据库日志信息
    DM_LOG=/home/dmdba/dmdbms/log/dm_BAKRES_$(date +%Y%m).log   # 缺省配置下DM数据库的日志存储位置,根据实际情况修改
    
    # 备份存储信息
    BACKUP_HOME=/backup/data/dameng  # 备份主目录
    BACKUP_DIR=$BACKUP_HOME/full_backup_$(date +%Y%m%d%H%M%S)  # 备份存储目录
    
    # 日志信息
    LOG_DIR=/backup/log  # 日志存储目录
    LOGFILE=$LOG_DIR/bak_log.log
    
    # 恢复端服务器信息
    TAR_INF_01=dmdba@192.168.100.11:/backup/data/dameng
    TAR_INF_02=dmdba@192.168.100.12:/backup/data/dameng
    
    # 检测备份目录是否存在
    
    if [ ! -d $LOG_DIR ] ; then
        mkdir -p $LOG_DIR
        echo -e "检测到日志目录$LOG_DIR 不存在,自行完成创建。"  >> $LOGFILE
    fi
    
    if [ ! -d $BACKUP_HOME ] ; then
        mkdir -p $BACKUP_HOME
        echo -e "检测到备份目录$BACKUP_HOME 不存在,自行完成创建。"  >> $LOGFILE
    fi
    
    # 开始备份
    
    ## 备份头部信息
    
    {
    echo -e "-------------------------------------------------------------------------------------------------------------"
    echo 
    echo -e "$0: DM8全库备份脚本"
    echo
    echo -e "\e[31m 开始于: $(date +%Y%m%d%H%M) \e[m"
    echo
    } >> $LOGFILE
    
    ## 执行备份
    $DISQLEX $DM_INF -e "backup database backupset '$BACKUP_DIR'"
    
    # 检查备份是否完成,若未完成请提示去数据库对应日志中查看具体信息,若完成则将备份文件传送到恢复端服务器
    
    if [ ! -d "$BACKUP_DIR" ] ; then
        echo -e "未检测到备份完成的目录,请查看$DM_LOG 以确认备份是否成功。" >> $LOGFILE
        echo
    else
        scp -r "$BACKUP_DIR" $TAR_INF_01
        scp -r "$BACKUP_DIR" $TAR_INF_02
        echo -e "备份已完成,已将备份文件传送至恢复端服务器对应存储位置,具体备份细节可查看$DM_LOG 。" >> $LOGFILE
        echo
    fi
    
  • 分别在P-B和S-B服务器上配置好实时主备所需的参数文件,可参考上述主备搭建中的配置,然后注册好dmserver服务和dmwatcher服务。即DmServiceDM和DmWatcherServiceDMSERVER。另脚本都是在dmdba用户下执行,所以还需要先配置好非root用户执行systemctl服务的权限,通过修改/etc/sudoers文件添加dmdba ALL=(ALL) NOPASSWD:ALL 进行配置。

    [NOTE]
    其中dmserver服务需要注册为以mount方式启动的服务,即 ./dm_service_installer.sh -t dmserver -dm_ini /data/DAMENG/dm.ini -p DM -m mount

  • 在P-B服务器上应用 dm_restore_for_P.sh 如下:

    #!/bin/bash
    # on DM V8
    # 接受备份端传送的备份文件,并以此为备份集进行数据库的恢复,恢复后以主库的模式重建主备
    #auth:cuckoo
    
    DMRMANEX=/home/dmdba/dmdbms/bin/dmrman  # 缺省配置下安装后dmrman命令绝对路径,可根据实际情况修改
    DISQLEX=/home/dmdba/dmdbms/bin/disql  # 缺省配置下安装后disql命令绝对路径,可根据实际情况修改
    
    # 被还原数据库信息
    DM_INF=SYSDBA/SYSDBA@127.0.0.1:5236
    DATA_HOME=/data/DAMENG
    DM_INI=$DATA_HOME/dm.ini
    
    
    # 备份存储信息
    BACKUP_HOME=/backup/data/dameng
    
    # 日志信息
    LOG_DIR=/backup/log  # 日志存储目录
    LOGFILE=$LOG_DIR/res_log.log
    
    # 检查日志目录是否存在
    
    if [ ! -d $LOG_DIR ] ; then
        mkdir -p $LOG_DIR
        echo -e "检测到日志目录$LOG_DIR 不存在,自行完成创建。"  >> $LOGFILE
    fi
    
    
    # 还原数据库
    
    ## 还原头部信息
    
    {
        echo -e "-------------------------------------------------------------------------------------------------------------"
        echo 
        echo -e "$0: DM8全库恢复脚本"
        echo
        echo -e "\e[31m 开始于: $(date +%Y%m%d%H%M) \e[m"
        echo
    
    ## 确认最新备份集
    
        echo -e "确认最新备份集:"
        NEW_BACKUP=$(ls -td $BACKUP_HOME/*/ |head -n 1)
        echo -e "最新备份集为$NEW_BACKUP ,后续恢复以此为基础。" 
        echo
    
    ## 检验待还原备份集的合法性
    
        echo -e "检查备份集合法性:" 
        $DMRMANEX ctlstmt="check backupset '$NEW_BACKUP'" 
        if [ $? -ne 0 ]; then
            echo -e "无效的结果集,请确认。"
            exit
        fi
        echo
    
    ## restore & recover & update db_magic
        echo -e "还原数据库:"
        $DMRMANEX ctlstmt="restore database '$DM_INI' from backupset '$NEW_BACKUP'"
        if [ $? -ne 0 ]; then
            echo -e "restore database failed, please check it."
            exit
        fi
        echo
        echo -e "恢复数据库一致性:"
        $DMRMANEX ctlstmt="recover database '$DM_INI' from backupset '$NEW_BACKUP'"
        if [ $? -ne 0 ]; then
            echo -e "restore database failed, please check it."
            exit
        fi
        echo
        echo -e "更新数据库DB_MAGIC:"
        $DMRMANEX ctlstmt="recover database '$DM_INI' update db_magic"
        if [ $? -ne 0 ]; then
            echo -e "update db_magic failed, please check it."
            exit
        fi
        echo
        echo -e "数据库恢复已完成。"
    } >> $LOGFILE
    
    # 配置主库模式
    ## 要求实时主备搭建中需要的dm.ini、dmarch.ini、dmmal.ini和dmatcher.ini参数文件已经创建并应用
    
    sudo systemctl start DmServiceDM  # 以mount方式启动数据库
    
    $DISQLEX $DM_INF -e "SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);"
    $DISQLEX $DM_INF -e "sp_set_oguid(453332);"
    $DISQLEX $DM_INF -e "alter database primary;"
    $DISQLEX $DM_INF -e "SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);"
    
    sudo systemctl start DmWatcherServiceDMSERVER  # 启动守护进程
    
  • 在S-B服务器上应用 dm_restore_for_S.sh 如下:

    #!/bin/bash
    # on DM V8
    # 接受备份端传送的备份文件,并以此为备份集进行数据库的恢复,恢复后以主库的模式重建主备
    #auth:cuckoo
    
    DMRMANEX=/home/dmdba/dmdbms/bin/dmrman  # 缺省配置下安装后dmrman命令绝对路径,可根据实际情况修改
    DISQLEX=/home/dmdba/dmdbms/bin/disql  # 缺省配置下安装后disql命令绝对路径,可根据实际情况修改
    
    # 被还原数据库信息
    DM_INF=SYSDBA/SYSDBA@127.0.0.1:5236
    DATA_HOME=/data/DAMENG
    DM_INI=$DATA_HOME/dm.ini
    
    
    # 备份存储信息
    BACKUP_HOME=/backup/data/dameng
    
    # 日志信息
    LOG_DIR=/backup/log  # 日志存储目录
    LOGFILE=$LOG_DIR/res_log.log
    
    # 检查日志目录是否存在
    
    if [ ! -d $LOG_DIR ] ; then
        mkdir -p $LOG_DIR
        echo -e "检测到日志目录$LOG_DIR 不存在,自行完成创建。"  >> $LOGFILE
    fi
    
    
    # 还原数据库
    
    ## 还原头部信息
    
    {
        echo -e "-------------------------------------------------------------------------------------------------------------"
        echo 
        echo -e "$0: DM8全库恢复脚本"
        echo
        echo -e "\e[31m 开始于: $(date +%Y%m%d%H%M) \e[m"
        echo
    
    ## 确认最新备份集
    
        echo -e "确认最新备份集:"
        NEW_BACKUP=$(ls -td $BACKUP_HOME/*/ |head -n 1)
        echo -e "最新备份集为$NEW_BACKUP ,后续恢复以此为基础。" 
        echo
    
    ## 检验待还原备份集的合法性
    
        echo -e "检查备份集合法性:" 
        $DMRMANEX ctlstmt="check backupset '$NEW_BACKUP'" 
        if [ $? -ne 0 ]; then
            echo -e "无效的结果集,请确认。"
            exit
        fi
        echo
    
    ## restore & recover & update db_magic
        echo -e "还原数据库:"
        $DMRMANEX ctlstmt="restore database '$DM_INI' from backupset '$NEW_BACKUP'"
        if [ $? -ne 0 ]; then
            echo -e "restore database failed, please check it."
            exit
        fi
        echo
        echo -e "恢复数据库一致性:"
        $DMRMANEX ctlstmt="recover database '$DM_INI' from backupset '$NEW_BACKUP'"
        if [ $? -ne 0 ]; then
            echo -e "restore database failed, please check it."
            exit
        fi
        echo
        echo -e "更新数据库DB_MAGIC:"
        $DMRMANEX ctlstmt="recover database '$DM_INI' update db_magic"
        if [ $? -ne 0 ]; then
            echo -e "update db_magic failed, please check it."
            exit
        fi
        echo
        echo -e "数据库恢复已完成。"
    } >> $LOGFILE
    
    # 配置备库模式
    ## 要求实时主备搭建中需要的dm.ini、dmarch.ini、dmmal.ini和dmatcher.ini参数文件已经创建并应用
    
    sudo systemctl start DmServiceDM  # 以mount方式启动数据库
    
    $DISQLEX $DM_INF -e "SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);"
    $DISQLEX $DM_INF -e "sp_set_oguid(453332);"
    $DISQLEX $DM_INF -e "alter database standby;"
    $DISQLEX $DM_INF -e "SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);"
    
    sudo systemctl start DmWatcherServiceDMSERVER  # 启动守护进程
    
  • 验证查看
    登录主备查看数据库状态和模式。

更多的内容可以登录达梦的社区进行查看:https://eco.dameng.com

posted @ 2024-01-15 15:24  灬夜露沁心灬  阅读(224)  评论(0编辑  收藏  举报