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