一、前言
DM数据守护(Data Watch)是一种集成化的高可用、高性能数据库解决方案,是数据库异地容灾的首选方案。DM数据守护提供多种解决方案,可用配置成实时主备、MPP主备以及读写分离集群。本文章主要讲解实时主备的搭建。实时主备是由一个主库以及一个或多个实时归档的备库组成,可以保障数据库可用性,挺高数据安全性。实时主备系统中,主库提供完整的数据库功能,备库提供只读服务。主库修改数据产生的Redo日志,通过实时归档机制,在写入联机Redo日志文件之前发送到备库,实时备库通过重演Redo日志与主库保持数据同步。当主库出现故障时,备库在将所有Redo日志重演结束之后,就可以切换为主库对外提供数据库服务。
二、环境说明
准备两台机器DM01、DM02用来部署主备库,其中DM01作为主库,DM02作为备库和监视器。配置监视器在主机、备机或者第三台机器上配置都行,最好在第三台机器上配置。本文章服务器的操作系统为Redhat6.9,你可以选择其它操作系统,如CentOS,UOS,银河麒麟……,每个操作系统上都配置了两块网卡,一块作为内部网络,一块作为外部网络。
DM01和DM02操作系统上均安装DM8数据库,安装路径为’/dm8’,数据存放路径为’/dm8/data’,各主备库的实例名建议采用“组名_守护环境_序号"的方式命名,方便按组区分不同实例,注意总长度不能超过16。本文章DM01和DM02的实例名分为TEST_DM_01、TEST_DM_02。
| 机器名 | 状态 | 操作系统 | 外部服务IP | 内部服务IP |
|---|---|---|---|---|
| DM01 | 主库:TEST_DM_01 | RedHat 6.9 | 192.168.83.101 | 10.10.10.11 |
| DM02 | 主库:TEST_DM_02 | RedHat 6.9 | 192.168.83.102 | 10.10.10.12 |
| 实例名 | PORT_NUM | MAL_PORT | MAL_DW_PORT | MAL_INST_PORT | MAL_INST_DW_PORT | MAL_HOST |
|---|---|---|---|---|---|---|
| TEST_DM_01 | 5236 | 5237 | 5238 | 5236 | 5239 | 10.10.10.11 |
| TEST_DM_02 | 5236 | 5237 | 5238 | 5236 | 5239 | 10.10.10.12 |
三、数据准备
DM8版本必须先通过备份还原方式同步各数据库的数据,确保各数据库的数据保持完全一致。主库可以是新初始化的数据库,也可以是正在生产、使用中的数据库。本文章是新初始化的数据库,对于新初始化的库,首先启动不允许使用MOUNT方式,必须先正常启动并正常退出,然后才允许MOUNT方式启动,并且准备数据时,也要先正常启动并正常退出,然后再使用备份还原方式准备备库数据。
1、对DM01、DM02数据库实例启停一遍
(1)启动数据库
DM01启动数据库
[dmdba@DM01 ~]$ service DmServiceTEST_DM_01 start
Starting DmServiceTEST_DM_01: [ OK ]
DM02启动数据库
[dmdba@DM02 ~]$ service DmServiceTEST_DM_02 start
Starting DmServiceTEST_DM_02: [ OK ]
(2)关闭数据库
DM01关闭数据库
[dmdba@DM01 ~]$ service DmServiceTEST_DM_01 stop
Stopping DmServiceTEST_DM_01: [ OK ]
DM02关闭数据库
[dmdba@DM02 ~]$ service DmServiceTEST_DM_02 stop
Stopping DmServiceTEST_DM_02: [ OK ]
2、配置本地归档
对于搭建实时主备,不管数据库是初始化状态,还是已经处于运行状态,都需要对服务器配置本地归档。配置本地归档有两种方式,一是用SQL语句来配置,二是通过编辑dmarch.ini和dm.ini文件。DM01和DM02都需要配置本地归档,下面介绍的是用SQL语句来配置:DEST表示归档文件存放路径、TYPE表示本地归档类型、FILE_SIZE表示本地单个归档文件最大值、SPACE_LIMIT表示归档大小限制。
SQL> alter database mount;
操作已执行
已用时间: 00:00:01.760. 执行号:0.
SQL> alter database add archivelog 'DEST=/dm8/data/arch,TYPE=local,FILE_SIZE=200,SPACE_LIMIT=2048';
操作已执行
已用时间: 2.275(毫秒). 执行号:0.
SQL> alter database archivelog;
操作已执行
已用时间: 21.143(毫秒). 执行号:0.
SQL> alter database open;
操作已执行
已用时间: 00:00:01.760. 执行号:0.
3、DM01脱机备份、DM02脱机还原
(1)关闭数据库
[dmdba@DM01 ~]$ service DmServiceTEST_DM_01 stop
Stopping DmServiceTEST_DM_01: [ OK ]
[dmdba@DM02 ~]$ service DmServiceTEST_DM_02 stop
Stopping DmServiceTEST_DM_02: [ OK ]
(2)DmAPService正常运行
[dmdba@DM01 ~]$ service DmAPService status
DmAPService (pid 2789) is running.
[dmdba@DM02 data]$ service DmAPService status
DmAPService (pid 2787) is running.
(3)备份
[dmdba@DM01 bin]$ ./dmrman CTLSTMT="BACKUP DATABASE '/dm8/data/TEST_DM_01/dm.ini' FULL TO BACKUP_FILE1 BACKUPSET '/dm8/data/BACKUP_FILE01'"
dmrman V8
BACKUP DATABASE '/dm8/data/TEST_DM_01/dm.ini' FULL TO BACKUP_FILE1 BACKUPSET '/dm8/data/BACKUP_FILE01'
Database mode = 0, oguid = 0
EP[0]'s cur_lsn[40072]
BACKUP DATABASE [TEST_DM_01],execute......
CMD CHECK LSN......
BACKUP DATABASE [TEST_DM_01],collect dbf......
CMD CHECK ......
DBF BACKUP SUBS......
total 1 packages processed...
total 2 packages processed...
total 3 packages processed...
DBF BACKUP MAIN......
BACKUPSET [/dm8/data/BACKUP_FILE01] END, CODE [0]......
META GENERATING......
total 4 packages processed...
total 4 packages processed...
total 4 packages processed!
CMD END.CODE:[0]
backup successfully!
time used: 00:00:01.108
(4)拷贝备份到DM02
[dmdba@DM01 data]$ scp -r BACKUP_FILE01 192.168.83.102:/dm8/data/
(5)DM02脱机还原
[dmdba@DM02 bin]$ ./dmrman CTLSTMT="RESTORE DATABASE '/dm8/data/TEST_DM_02/dm.ini' FROM BACKUPSET '/dm8/data/BACKUP_FILE01'"
dmrman V8
RESTORE DATABASE '/dm8/data/TEST_DM_02/dm.ini' FROM BACKUPSET '/dm8/data/BACKUP_FILE01'
RESTORE DATABASE CHECK......
RESTORE DATABASE,data collect......
RESTORE DATABASE,database refresh ......
RESTORE BACKUPSET [/dm8/data/BACKUP_FILE01] START......
total 3 packages processed...
total 4 packages processed...
RESTORE DATABASE,UPDATE ctl file......
RESTORE DATABASE,REBUILD key file......
RESTORE DATABASE,CHECK db info......
RESTORE DATABASE,UPDATE db info......
total 4 packages processed...
total 4 packages processed!
CMD END.CODE:[0]
restore successfully.
time used: 494.587(ms)
[dmdba@DM02 bin]$ ./dmrman CTLSTMT="RECOVER DATABASE '/dm8/data/TEST_DM_02/dm.ini' FROM BACKUPSET '/dm8/data/BACKUP_FILE01'"
dmrman V8
RECOVER DATABASE '/dm8/data/TEST_DM_02/dm.ini' FROM BACKUPSET '/dm8/data/BACKUP_FILE01'
Database mode = 0, oguid = 0
EP[0]'s cur_lsn[40072]
RESTORE RLOG CHECK......
CMD END.CODE:[603],DESC:[备份集[/dm8/data/BACKUP_FILE01]备份过程中未产生日志]
备份集[/dm8/data/BACKUP_FILE01]备份过程中未产生日志
recover successfully!
time used: 260.015(ms)
[dmdba@DM02 bin]$ ./dmrman CTLSTMT="RECOVER DATABASE '/dm8/data/TEST_DM_02/dm.ini' UPDATE DB_MAGIC"
dmrman V8
RECOVER DATABASE '/dm8/data/TEST_DM_02/dm.ini' UPDATE DB_MAGIC
Database mode = 0, oguid = 0
EP[0]'s cur_lsn[40072]
EP[0]'s apply_lsn[40072] >= end_lsn[40072]
recover successfully!
time used: 00:00:01.006
4、配置主库TEST_DM_01
(1)配置dm.ini
INSTANCE_NAME = TEST_DM_01
PORT_NUM = 5236 #数据库实例监听端口
DW_INACTIVE_INTERVAL = 60 #接收守护进程消息超时时间
ALTER_MODE_STATUS = 0 #不允许手工方式修改实例模式/状态
ENABLE_OFFLINE_TS = 2 #不允许备库OFFLINE表空间
MAL_INI = 1 #打开MAL系统
ARCH_INI = 1 #打开归档配置
RLOG_SEND_APPLY_MON = 64 #统计最近64次的日志发送信息
(2)配置dmmal.ini
配置MAL系统,各主备库的dmmal.ini配置必须完全一致。
MAL_CHECK_INTERVAL = 5 #MAL链路检测时间间隔
MAL_CONN_FAIL_INTERVAL = 5 #判定MAL链路断开的时间
[MAL_INST1]
MAL_INST_NAME = TEST_DM_01 #实例名,和dm.ini中的INSTANCE_NAME一致
MAL_HOST = 10.10.10.11 #MAL系统监听TCP连接的IP地址
MAL_PORT = 5237 #MAL系统监听TCP连接的端口
MAL_INST_HOST = 192.168.83.101 #实例的对外服务IP地址
MAL_INST_PORT = 5236 #实例的对外服务端口,和dm.ini中的PORT_NUM一致
MAL_DW_PORT = 5238 #实例本地的守护进程监听TCP连接的端口
MAL_INST_DW_PORT = 5239 #实例监听守护进程TCP连接的端口
[MAL_INST2]
MAL_INST_NAME = TEST_DM_02
MAL_HOST = 10.10.10.12
MAL_PORT = 5237
MAL_INST_HOST = 192.168.83.102
MAL_INST_PORT = 5236
MAL_DW_PORT = 5238
MAL_INST_DW_PORT = 5239
(3)配置dmmarch.ini
修改dmarch.ini,配置本地归档和实施归档。除了本地归档外,其他归档配置项中ARCH_DEST表示实例是Primary模式时,需要同步归档数据的目标实例名。
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /dm8/data/arch
ARCH_FILE_SIZE = 200
ARCH_SPACE_LIMIT = 2048
[ARCHIVE_PRALTIME]
ARCH_TYPE = REALTIME
ARCH_DEST = TEST_DM_02
(4)配置dmwatcher.ini
修改dmwatcher.ini配置守护进程,配置为全局守护类型,使用自动切换模式。
[TEST]
DW_TYPE = GLOBAL #全局守护类型
DW_MODE = AUTO #自动切换模式
DW_ERROR_TIME = 10 #远程守护进程故障认定时间
INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间
INST_ERROR_TIME = 10 #本地实例故障认定时间
INST_OGUID = 190810 #守护系统唯一OGUID值
INST_INI = /dm8/data/TEST_DM_01/dm.ini #dm.ini配置文件路径
INST_AUTO_RESTART = 1 #打开实例的自动启动功能
INST_STARTUP_CMD = /dm8/bin/dmserver #命令行方式启动
RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阀值,默认关闭
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阀值,默认关闭
5、配置备库TEST_DM_02
(1)配置dm.ini
INSTANCE_NAME = TEST_DM_02
PORT_NUM = 5236 #数据库实例监听端口
DW_INACTIVE_INTERVAL = 60 #接收守护进程消息超时时间
ALTER_MODE_STATUS = 0 #不允许手工方式修改实例模式/状态
ENABLE_OFFLINE_TS = 2 #不允许备库OFFLINE表空间
MAL_INI = 1 #打开MAL系统
ARCH_INI = 1 #打开归档配置
RLOG_SEND_APPLY_MON = 64 #统计最近64次的日志发送信息
(2)配置dmmal.ini
从TEST_DM_01上拷贝到TEST_DM_02
[dmdba@DM01 TEST_DM_01]$ scp dmmal.ini 192.168.83.102:/dm8/data/TEST_DM_02/
(3)配置dmmarch.ini
修改dmarch.ini,配置本地归档和实施归档。除了本地归档外,其他归档配置项中ARCH_DEST表示实例是Primary模式时,需要同步归档数据的目标实例名。
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /dm8/data/arch
ARCH_FILE_SIZE = 200
ARCH_SPACE_LIMIT = 2048
[ARCHIVE_PRALTIME]
ARCH_TYPE = REALTIME
ARCH_DEST = TEST_DM_01
(4)配置dmwatcher.ini
修改dmwatcher.ini配置守护进程,配置为全局守护类型,使用自动切换模式。
[TEST]
DW_TYPE = GLOBAL #全局守护类型
DW_MODE = AUTO #自动切换模式
DW_ERROR_TIME = 10 #远程守护进程故障认定时间
INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间
INST_ERROR_TIME = 10 #本地实例故障认定时间
INST_OGUID = 190810 #守护系统唯一OGUID值
INST_INI = /dm8/data/TEST_DM_02/dm.ini #dm.ini配置文件路径
INST_AUTO_RESTART = 1 #打开实例的自动启动功能
INST_STARTUP_CMD = /dm8/bin/dmserver #命令行方式启动
RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阀值,默认关闭
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阀值,默认关闭
6、启动主库、备库到mount
配置主备库后,一定要以Mount方式启动数据库实例,否则系统启动时会重构回滚表空间,生产Redo日志;并且,启动后应用可能连接到数据库实例进程操作,破环主备库的数据一致性。启动数据库到mount,可以直接通过dmserver启动,这里,为了方便服务在后台运行,先注册服务。
[root@DM01 root]# ./dm_service_installer.sh -t dmserver -dm_ini /dm8/data/TEST_DM_01/dm.ini -auto false -m mount -p DM01_Mount
移动服务脚本文件(/dm8/bin/DmServiceDM01_Mount 到 /etc/rc.d/init.d/DmServiceDM01_Mount)
创建服务(DmServiceDM01_Mount)完成
[root@DM01 root]# su - dmdba
[dmdba@DM01 ~]$ service DmServiceDM01_Mount start
Starting DmServiceDM01_Mount: [ OK ]
[root@DM02 root]# ./dm_service_installer.sh -t dmserver -dm_ini /dm8/data/TEST_DM_02/dm.ini -auto false -m mount -p DM02_Mount
移动服务脚本文件(/dm8/bin/DmServiceDM02_Mount 到 /etc/rc.d/init.d/DmServiceDM02_Mount)
创建服务(DmServiceDM02_Mount)完成
[root@DM02 root]# su - dmdba
[dmdba@DM02 ~]$ service DmServiceDM02_Mount start
Starting DmServiceDM01_Mount: [ OK ]
7、设置OGUID(主备库都设置)
启动命令工具DISQL
SQL> SP_SET_PARA_VALUE(1,'ALTER_MODE_STATUS',1);
DMSQL 过程已成功完成
已用时间: 22.344(毫秒). 执行号:1.
SQL> SP_SET_OGUID(190810);
DMSQL 过程已成功完成
已用时间: 10.900(毫秒). 执行号:2.
SQL> SP_SET_PARA_VALUE(1,'ALTER_MODE_STATUS',0);
DMSQL 过程已成功完成
已用时间: 4.465(毫秒). 执行号:3.
8、修改数据库模式
(1)修改TEST_DM_01为主库
SQL> alter database primary;
(2)修改TEST_DM_02为备库
SQL> SP_SET_PARA_VALUE(1,'ALTER_MODE_STATUS',1);
DMSQL 过程已成功完成
已用时间: 4.993(毫秒). 执行号:5.
SQL> ALTER DATABASE STANDBY;
操作已执行
已用时间: 9.767(毫秒). 执行号:0.
SQL> SP_SET_PARA_VALUE(1,'ALTER_MODE_STATUS',0);
DMSQL 过程已成功完成
已用时间: 5.904(毫秒). 执行号:6.
9、配置监视器
修改dmmonitor.ini,由于主库和实时备库的守护进程配置为自动切换模式,所有需要配置监视器,这里没有第三方服务器来作为监视器,所有选择DM02来配置监视器。
MON_DW_CONFIRM = 1 #确认监视器模式
MON_LOG_PATH = /dm8/data/log #监视器日志文件存放路径
MON_LOG_INTERVAL = 60 #每隔60s定时记录系统信息到日志文件
MON_LOG_FILE_SIZE = 32 #每个日志文件最大32M
MON_LOG_SPACE_LIMIT = 0 #不限定日志文件总占用空间
[TEST]
MON_INST_OGUID = 190810 #组GRP1的唯一OGUID值
#以下配置为监视器到组GRP1的守护进程的连接信息,以“IP:PORT”的形式配置
#IP对应dmmal.ini中的MAL_HOST,PORT对应dmmal.ini中的MAL_DW_PORT
MON_DW_IP = 10.10.10.11:5238
MON_DW_IP = 10.10.10.12:5238
10、启动守护进程
[root@DM01 root]# ./dm_service_installer.sh -t dmwatcher -watcher_ini /dm8/data/TEST_DM_01/dmwatcher.ini -p DM01
移动服务脚本文件(/dm8/bin/DmWatcherServiceDM01 到 /etc/rc.d/init.d/DmWatcherServiceDM01)
创建服务(DmWatcherServiceDM01)完成
[root@DM01 root]# service DmWatcherServiceDM01 start
Starting DmWatcherServiceDM01: [ OK ]
[root@DM02 root]# ./dm_service_installer.sh -t dmwatcher -watcher_ini /dm8/data/TEST_DM_02/dmwatcher.ini -p DM02
移动服务脚本文件(/dm8/bin/DmWatcherServiceDM02 到 /etc/rc.d/init.d/DmWatcherServiceDM02)
创建服务(DmWatcherServiceDM02)完成
[root@DM02 root]# service DmWatcherServiceDM02 start
Starting DmWatcherServiceDM02: [ OK ]
11、启动监视器
[root@DM02 root]# ./dm_service_installer.sh -t dmmonitor -monitor_ini /dm8/data/TEST_DM_02/dmmonitor.ini -p DM02
[root@DM02 root]# su - dmdba
[dmdba@DM02 TEST_DM_02]$ service DmMonitorServiceDM02 start
Starting DmMonitorServiceDM02: [ OK ]
查看监视器信息,能看出TEST_DM_01、TEST_DM02的实例都处于Open状态,即正常运行。

如果想了解更多达梦数据库的信息,推荐达梦官方的在线服务平台 https://eco.dameng.com/




