达梦数据守护集群安装部署
借着公司核心系统和达梦数据库做适配POC的机会,把达梦数据守护集群了解了一下,下面是根据官方文档安装部署实操。把整个过程写成文档分享出来和小伙伴们一起学习一下。
一、安装前准备
1.1 硬件环境建议
数据守护集群安装部署前需要额外注意操作系统、CPU、网络环境和磁盘 IO 配置情况,其他环境配置项建议请参考安装前准备工作。
1.1.1 操作系统检查
为了确保集群的高效性,需要对各节点操作系统版本进行检查。不同操作系统版本存在性能差异,如果各节点服务器的操作系统版本不同,会严重影响集群的整体性能,尤其是故障切换后可能存在响应服务请求慢的情况。在正式生产环境中,建议安装统一版本的操作系统,确保系统各节点版本以及内核版本一致。
1.1.2 CPU 架构检查
国产化工作开展以来,国产化芯片种类很多,作为数据库集群来说,需要确保各节点服务器的 CPU 一致。不同芯片的性能不同,如果各节点服务器的 CPU 不一致,则会严重影响集群的整体性能,从而影响整体服务响应的效果。在正式生产环境中,建议使用统一配置的服务器。
1.1.3 网络环境
心跳网络对 mal 通讯系统的影响非常大,如果网络丢包或者延迟较大,则会严重影响 mal 系统的处理能力,从而导致整个集群出现响应服务请求慢的情况。为确保集群的稳定性,网络配置如下:
- 使用千兆或千兆以上网络;
- 集群间的心跳网络需同步数据,建议尽量使用两个交换机构建内网,以实现冗余和负载均衡;
- 建议服务器采用两个网卡绑定为一个逻辑网卡来使用(比如 bond 方式)。
1.1.4 磁盘 IO
磁盘 IO 的读写速率会极大影响系统性能和用户体验。因此在进行集群安装部署前,应测试 IO 性能能否满足系统功能和性能需求。
IO 性能指标与系统的并发数、热点数据等因素往往密切相关。在数据守护集群,尤其生产系统中,推荐使用高性能 SSD 磁盘,以获得更佳性能,保证集群数据的实时同步。
1.2 集群规划
| A 机器 dm1 | B 机器 dm2 | 监视器 dmm | |
|---|---|---|---|
| 业务 IP | 192.168.17.37 | 192.168.17.38 | 192.168.17.39 |
| 心跳 IP | 192.168.1.1 | 192.168.1.2 | 192.168.1.3 |
| 实例名 | DMSERVER01 | DMSERVER02 | |
| 实例端口 | 5236 | 5236 | |
| MAL 端口 | 5336 | 5336 | |
| MAL 守护进程端口 | 5436 | 5436 | |
| 守护进程端口 | 5536 | 5536 | |
| OGUID | 45331 | 45331 | |
| 守护组 | GRP1 | GRP1 | |
| 安装目录 | /home/dmdba/dmdbms | /home/dmdba/dmdbms | /home/dmdba/dmdbms |
| 实例目录 | /dmdata/data | /dmdata/data | |
| 归档上限 | 51200 | 51200 |
确认监视器 IP 为 192.168.17.39。
说明:具体规划及部署方式以现场环境为准。
特别说明一下主库和备库,还有监视器,三台主机都要提前安装达梦数据库软件。
1.3 集群架构
搭建的主备集群架构如下图:

1.4 切换模式说明
| 故障切换方式 | dmarch | dmwatcher | dmmonitor | 监视器要求 |
|---|---|---|---|---|
| 故障手动切换 | ARCH_WAIT_APPLY=0 | DW_MODE=MANUAL | MON_DW_CON FIRM=0 | 1、配置手动切换:集群各节点的 bin 目录中,存放非确认监视器配置文件。 |
| 故障自动切换 | ARCH_WAIT_APPLY=0 | DW_MODE=AUTO | MON_DW_CON FIRM=1 | 1、配置手动切换:集群各节点的 bin 目录中,存放非确认监视器配置文件。 2、配置自动切换:在确认监视器上(非集群节点),存放确认监视器配置文件,并注册后台自启服务。 |
- ARCH_WAIT_APPLY 参数,设置为 0:高性能模式;设置为 1:事务一致模式。
- 故障手动切换情境下 ARCH_WAIT_APPLY 只能为 0。故障自动切换情境下 ARCH_WAIT_APPLY 可以为 0,也可以为 1。
- ARCH_WAIT_APPLY 参数设置的判断依据为业务是否要查询备机最新数据。如果需要,则配置为 1(较大性能衰减);如果不需要,则配置为 0。
二、集群搭建
2.1 配置 A 机器dm1
2.1.1 初始化实例并备份数据
- 初始化实例
[root@dm1 ~]# su - dmdba Last login: Thu Jul 24 13:23:20 CST 2025 on pts/0 [dmdba@dm1 ~]$ cd /home/dmdba/dmdbms/bin [dmdba@dm1 bin]$ ./dminit PATH=/dmdata/data DB_NAME=DAMENG INSTANCE_NAME=DMSERVER01 PAGE_SIZE=8 EXTENT_SIZE=16 LOG_SIZE=2048 SYSDBA_PWD=Sin0pharm SYSAUDITOR_PWD=Sin0pharm initdb V8 db version: 0x7000d file dm.key not found, use default license! License will expire on 2026-04-30 Normal of FAST Normal of DEFAULT Normal of RECYCLE Normal of KEEP Normal of ROLL log file path: /dmdata/data/DAMENG/DAMENG01.log log file path: /dmdata/data/DAMENG/DAMENG02.log write to dir [/dmdata/data/DAMENG]. create dm database success. 2025-07-24 13:29:55 [dmdba@dm1 bin]$
SYSDBA_PWD 和 SYSAUDITOR_PWD 为配置数据库 SYSDBA 用户和 SYSAUDITOR 用户的登录密码,需要用户自定义配置,且需保证一定的密码强度。
- 启动服务
[dmdba@dm1 ~]$ /home/dmdba/dmdbms/bin/dmserver /dmdata/data/DAMENG/dm.ini file dm.key not found, use default license! version info: develop csek2_vm_t = 1440 nsql_vm_t = 328 prjt2_vm_t = 176 ltid_vm_t = 216 nins2_vm_t = 1136 nset2_vm_t = 272 ndlck_vm_t = 192 ndel2_vm_t = 768 slct2_vm_t = 352 nli2_vm_t = 200 aagr2_vm_t = 304 pscn_vm_t = 376 dist_vm_t = 992 DM Database Server 64 V8 03134284368-20250430-272000-20149 startup... Normal of FAST Normal of DEFAULT Normal of RECYCLE Normal of KEEP Normal of ROLL Database mode = 0, oguid = 0 License will expire on 2026-04-30 file lsn: 0 ndct db load finished, code:100 ckpt2_exec_immediately begin. checkpoint begin, used_space[4096], free_space[4294955008]... checkpoint end, 2 pages flushed, used_space[8192], free_space[4294950912]. checkpoint begin, used_space[8192], free_space[4294950912]... checkpoint begin, used_space[0], free_space[4294959104]... ndct second level fill fast pool finished ndct third level fill fast pool finished ndct second level fill fast pool finished ndct third level fill fast pool finished ndct fill fast pool finished pseg_set_gtv_trxid_low next_trxid in mem:[2002] pseg_collect_mgr_items, total collect 0 active_trxs, 0 cmt_trxs, 0 pre_cmt_trxs, 0 to_release_trxs, 0 active_pages, 0 cmt_pages, 0 pre_cmt_pages, 0 to_release_pages, 0 mgr pages, 0 mgr recs! next_trxid in mem:[4004] next_trxid = 6006. pseg recv finished nsvr_startup end. uthr_pipe_create, create pipe[read:10, write:11] uthr_pipe_create, create pipe[read:12, write:13] uthr_pipe_create, create pipe[read:14, write:15] uthr_pipe_create, create pipe[read:16, write:17] aud sys init success. aud rt sys init success. trx: 6006 purged 1 pages trx: 6025 purged 1 pages trx: 6026 purged 1 pages trx: 6027 purged 1 pages trx: 6028 purged 1 pages trx: 6029 purged 1 pages trx: 6030 purged 1 pages trx: 6040 purged 1 pages trx: 6163 purged 1 pages trx: 6177 purged 1 pages trx: 6178 purged 1 pages trx: 6179 purged 1 pages trx: 6180 purged 1 pages trx: 6181 purged 1 pages trx: 6183 purged 1 pages trx: 6184 purged 1 pages trx: 6186 purged 1 pages trx: 6188 purged 1 pages trx: 6195 purged 1 pages trx: 6201 purged 1 pages trx: 6211 purged 1 pages trx: 6224 purged 1 pages trx: 6225 purged 1 pages trx: 6226 purged 1 pages trx: 6227 purged 1 pages trx: 6239 purged 1 pages trx: 6241 purged 1 pages trx: 6242 purged 1 pages trx: 6243 purged 1 pages trx: 6296 purged 1 pages trx: 6297 purged 1 pages trx: 6308 purged 1 pages trx: 6327 purged 1 pages trx: 6332 purged 1 pages trx: 6337 purged 1 pages trx: 6347 purged 1 pages trx: 6353 purged 1 pages trx: 6354 purged 1 pages trx: 6363 purged 1 pages trx: 6367 purged 33 pages trx: 6394 purged 1 pages trx: 6395 purged 1 pages trx: 6396 purged 1 pages trx: 6397 purged 1 pages trx: 6399 purged 1 pages trx: 6400 purged 1 pages trx: 6401 purged 1 pages trx: 6402 purged 1 pages trx: 6403 purged 1 pages trx: 6405 purged 1 pages trx: 6406 purged 1 pages trx: 6407 purged 1 pages trx: 6408 purged 1 pages trx: 6409 purged 1 pages trx: 6410 purged 1 pages trx: 6411 purged 1 pages trx: 6412 purged 1 pages trx: 6413 purged 1 pages trx: 6414 purged 1 pages trx: 6419 purged 1 pages trx: 6421 purged 1 pages trx: 6423 purged 1 pages trx: 6426 purged 1 pages trx: 6429 purged 1 pages trx: 6434 purged 1 pages trx: 6436 purged 1 pages trx: 6439 purged 1 pages trx: 6441 purged 1 pages trx: 6447 purged 1 pages trx: 6448 purged 1 pages trx: 6597 purged 1 pages trx: 6632 purged 51 pages trx: 6634 purged 1 pages trx: 6642 purged 1 pages trx: 6647 purged 1 pages trx: 6651 purged 1 pages trx: 6676 purged 1 pages trx: 6680 purged 1 pages trx: 6682 purged 1 pages trx: 6684 purged 1 pages trx: 6686 purged 1 pages trx: 6688 purged 1 pages trx: 6690 purged 1 pages trx: 6692 purged 1 pages trx: 6694 purged 1 pages trx: 6696 purged 1 pages trx: 6698 purged 1 pages trx: 6700 purged 1 pages trx: 6702 purged 1 pages trx: 6704 purged 1 pages trx: 6706 purged 1 pages trx: 6708 purged 1 pages trx: 6710 purged 1 pages trx: 6712 purged 1 pages trx: 6714 purged 1 pages trx: 6716 purged 1 pages trx: 6718 purged 1 pages trx: 6720 purged 1 pages trx: 6722 purged 1 pages trx: 6724 purged 1 pages trx: 6726 purged 1 pages trx: 6728 purged 1 pages trx: 6730 purged 1 pages trx: 6732 purged 1 pages trx: 6734 purged 1 pages trx: 6736 purged 1 pages trx: 6738 purged 1 pages trx: 6740 purged 1 pages trx: 6742 purged 1 pages trx: 6744 purged 1 pages trx: 6746 purged 1 pages trx: 6748 purged 1 pages trx: 6750 purged 1 pages trx: 6754 purged 8 pages trx: 6756 purged 1 pages trx: 6765 purged 1 pages trx: 6767 purged 1 pages systables desc init success. ndct_db_load_info finished, code:100. nsvr_process_before_open begin. nsvr_process_before_open success. SYSTEM IS READY.
- 开启归档
[dmdba@dm1 ~]$ /home/dmdba/dmdbms/bin/disql SYSDBA
密码:
服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 4.500(ms)
disql V8
SQL> ALTER DATABASE MOUNT;
操作已执行
已用时间: 0.639(毫秒). 执行号:0.
SQL> ALTER DATABASE ARCHIVELOG;
操作已执行
已用时间: 27.955(毫秒). 执行号:0.
SQL> ALTER DATABASE ADD ARCHIVELOG 'DEST=/dmdata/arch, TYPE=LOCAL, FILE_SIZE=2048, SPACE_LIMIT=51200';
操作已执行
已用时间: 2.606(毫秒). 执行号:0.
SQL> ALTER DATABASE OPEN;
操作已执行
已用时间: 22.793(毫秒). 执行号:0.
SQL>
- 备份数据
SQL> BACKUP DATABASE BACKUPSET '/dmdata/dmbak/BACKUP_FILE';
操作已执行
已用时间: 00:00:07.707. 执行号:601.
SQL>
- 修改 dm.ini
SQL> SP_SET_PARA_VALUE (2,'PORT_NUM',5236); DMSQL 过程已成功完成 已用时间: 6.093(毫秒). 执行号:602. SQL> SP_SET_PARA_VALUE (2,'DW_INACTIVE_INTERVAL',60); DMSQL 过程已成功完成 已用时间: 6.074(毫秒). 执行号:603. SQL> SP_SET_PARA_VALUE (2,'ALTER_MODE_STATUS',0); DMSQL 过程已成功完成 已用时间: 6.187(毫秒). 执行号:604. SQL> SP_SET_PARA_VALUE (2,'ENABLE_OFFLINE_TS',2); DMSQL 过程已成功完成 已用时间: 6.463(毫秒). 执行号:605. SQL> SP_SET_PARA_VALUE (2,'MAL_INI',1); DMSQL 过程已成功完成 已用时间: 6.206(毫秒). 执行号:606. SQL> SP_SET_PARA_VALUE (2,'RLOG_SEND_APPLY_MON',64); DMSQL 过程已成功完成 已用时间: 6.816(毫秒). 执行号:607. SQL>
- 关闭前台实例服务
2.1.2 修改 dmarch.ini
[dmdba@dm1 ~]$ cat /dmdata/data/DAMENG/dmarch.ini
#DaMeng Database Archive Configuration file
#this is comments
ARCH_WAIT_APPLY = 0 #0:高性能 1:事务一致
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /dmdata/arch #本地归档存放路径
ARCH_FILE_SIZE = 2048 #单个归档大小,单位 MB
ARCH_SPACE_LIMIT = 51200 #归档上限,单位 MB
ARCH_FLUSH_BUF_SIZE = 2
ARCH_HANG_FLAG = 1
[ARCHIVE_REALTIME1]
ARCH_TYPE = REALTIME #实时归档类型
ARCH_DEST = DMSERVER02 #实时归档目标实例名
[dmdba@dm1 ~]$
2.1.3 创建 dmmal.ini
[dmdba@dm1 ~]$ vi /dmdata/data/DAMENG/dmmal.ini MAL_CHECK_INTERVAL = 10 #MAL 链路检测时间间隔 MAL_CONN_FAIL_INTERVAL = 10 #判定 MAL 链路断开的时间 MAL_TEMP_PATH = /dmdata/data/malpath/ #临时文件目录 MAL_BUF_SIZE = 512 #单个 MAL 缓存大小,单位 MB MAL_SYS_BUF_SIZE = 2048 #MAL 总大小限制,单位 MB MAL_COMPRESS_LEVEL = 0 #MAL 消息压缩等级,0 表示不压缩 [MAL_INST1] MAL_INST_NAME = DMSERVER01 #实例名,和 dm.ini 的 INSTANCE_NAME 一致 MAL_HOST = 192.168.1.1 #MAL 系统监听 TCP 连接的 IP 地址 MAL_PORT = 5336 #MAL 系统监听 TCP 连接的端口 MAL_INST_HOST = 192.168.17.37 #实例的对外服务 IP 地址 MAL_INST_PORT = 5236 #实例对外服务端口,和 dm.ini 的 PORT_NUM 一致 MAL_DW_PORT = 5436 #实例对应的守护进程监听 TCP 连接的端口 MAL_INST_DW_PORT = 5536 #实例监听守护进程 TCP 连接的端口 [MAL_INST2] MAL_INST_NAME = DMSERVER02 MAL_HOST = 192.168.1.2 MAL_PORT = 5336 MAL_INST_HOST = 192.168.17.38 MAL_INST_PORT = 5236 MAL_DW_PORT = 5436 MAL_INST_DW_PORT = 5536 [dmdba@dm1 ~]$ mkdir /dmdata/data/malpath/ [dmdba@dm1 ~]$
2.1.4 创建 dmwatcher.ini
[dmdba@dm1 ~]$ vi /dmdata/data/DAMENG/dmwatcher.ini [GRP1] DW_TYPE = GLOBAL #全局守护类型 DW_MODE = AUTO #MANUAL:故障手切 AUTO:故障自切 DW_ERROR_TIME = 20 #远程守护进程故障认定时间 INST_ERROR_TIME = 20 #本地实例故障认定时间 INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间 INST_OGUID = 45331 #守护系统唯一 OGUID 值 INST_INI = /dmdata/data/DAMENG/dm.ini #dm.ini 文件路径 INST_AUTO_RESTART = 1 #打开实例的自动启动功能 INST_STARTUP_CMD = /home/dmdba/dmdbms/bin/dmserver #命令行方式启动 RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阈值,默认关闭 RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阈值,默认关闭 [dmdba@dm1 ~]$
2.1.5 拷贝备份文件
##拷贝备份文件到 B 机器
[dmdba@dm1 ~]$ scp -r /dmdata/dmbak/BACKUP_FILE dmdba@192.168.1.2:/dmdata/dmbak
The authenticity of host '192.168.1.2 (192.168.1.2)' can't be established.
ECDSA key fingerprint is SHA256:vO4eWsWx7MIPczIy0bXQq23PcfgYd45a5kBiBC9ImmE.
ECDSA key fingerprint is MD5:bc:be:33:bc:9b:fd:6b:ae:90:c8:39:09:18:fa:d4:c3.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.1.2' (ECDSA) to the list of known hosts.
dmdba@192.168.1.2's password:
BACKUP_FILE.bak 100% 12MB 96.5MB/s 00:00
BACKUP_FILE.meta 100% 106KB 22.4MB/s 00:00
[dmdba@dm1 ~]$
2.1.6 注册服务
[root@dm1 ~]# /home/dmdba/dmdbms/script/root/dm_service_installer.sh -t dmserver -p DMSERVER01 -dm_ini /dmdata/data/DAMENG/dm.ini -m mount Created symlink from /etc/systemd/system/multi-user.target.wants/DmServiceDMSERVER01.service to /usr/lib/systemd/system/DmServiceDMSERVER01.service. 创建服务(DmServiceDMSERVER01)完成 [root@dm1 ~]# /home/dmdba/dmdbms/script/root/dm_service_installer.sh -t dmwatcher -p Watcher -watcher_ini /dmdata/data/DAMENG/dmwatcher.ini Created symlink from /etc/systemd/system/multi-user.target.wants/DmWatcherServiceWatcher.service to /usr/lib/systemd/system/DmWatcherServiceWatcher.service. 创建服务(DmWatcherServiceWatcher)完成 [root@dm1 ~]#
若要删除自启,可利用如下方式:
/home/dmdba/dmdbms/script/root/dm_service_uninstaller.sh -n DmServiceDMSERVER01 /home/dmdba/dmdbms/script/root/dm_service_uninstaller.sh -n DmWatcherServiceWatcher
2.2 配置 B 机器 dm2
2.2.1 初始化实例
[dmdba@dm2 ~]$ cd /home/dmdba/dmdbms/bin [dmdba@dm2 bin]$ ./dminit PATH=/dmdata/data DB_NAME=DAMENG INSTANCE_NAME=DMSERVER02 PAGE_SIZE=8 EXTENT_SIZE=16 LOG_SIZE=2048 SYSDBA_PWD=Sin0pharm SYSAUDITOR_PWD=Sin0pharm initdb V8 db version: 0x7000d file dm.key not found, use default license! License will expire on 2026-04-30 Normal of FAST Normal of DEFAULT Normal of RECYCLE Normal of KEEP Normal of ROLL log file path: /dmdata/data/DAMENG/DAMENG01.log log file path: /dmdata/data/DAMENG/DAMENG02.log write to dir [/dmdata/data/DAMENG]. create dm database success. 2025-07-24 14:34:35 [dmdba@dm2 bin]$
SYSDBA_PWD 和 SYSAUDITOR_PWD 为配置数据库 SYSDBA 用户和 SYSAUDITOR 用户的登录密码,需要用户自定义配置,且需保证一定的密码强度。
2.2.2 恢复数据
[dmdba@dm2 ~]$ ls -lh /dmdata/dmbak/BACKUP_FILE/ total 13M -rw-r--r-- 1 dmdba dinstall 12M Jul 24 14:17 BACKUP_FILE.bak -rw-r--r-- 1 dmdba dinstall 106K Jul 24 14:17 BACKUP_FILE.meta [dmdba@dm2 ~]$ [dmdba@dm2 ~]$ /home/dmdba/dmdbms/bin/dmrman CTLSTMT="RESTORE DATABASE '/dmdata/data/DAMENG/dm.ini' FROM BACKUPSET '/dmdata/dmbak/BACKUP_FILE'" dmrman V8 RESTORE DATABASE '/dmdata/data/DAMENG/dm.ini' FROM BACKUPSET '/dmdata/dmbak/BACKUP_FILE' file dm.key not found, use default license! [Percent:100.00%][Speed:0.00M/s][Cost:00:00:02][Remaining:00:00:00] restore successfully. time used: 00:00:02.480 [dmdba@dm2 ~]$ /home/dmdba/dmdbms/bin/dmrman CTLSTMT="RECOVER DATABASE '/dmdata/data/DAMENG/dm.ini' FROM BACKUPSET '/dmdata/dmbak/BACKUP_FILE'" dmrman V8 RECOVER DATABASE '/dmdata/data/DAMENG/dm.ini' FROM BACKUPSET '/dmdata/dmbak/BACKUP_FILE' file dm.key not found, use default license! ==============================Error Stack============================== DM[603]:备份集[/dmdata/dmbak/BACKUP_FILE]备份过程中未产生日志 ======================================================================= recover successfully! time used: 00:00:01.242 [dmdba@dm2 ~]$ /home/dmdba/dmdbms/bin/dmrman CTLSTMT="RECOVER DATABASE '/dmdata/data/DAMENG/dm.ini' UPDATE DB_MAGIC" dmrman V8 RECOVER DATABASE '/dmdata/data/DAMENG/dm.ini' UPDATE DB_MAGIC file dm.key not found, use default license! recover successfully! time used: 00:00:01.244 [dmdba@dm2 ~]$
2.2.3 替换 dmarch.ini
[dmdba@dm2 ~]$ vi /dmdata/data/DAMENG/dmarch.ini ARCH_WAIT_APPLY = 0 #0:高性能 1:事务一致 [ARCHIVE_LOCAL] ARCH_TYPE = LOCAL #本地归档类型 ARCH_DEST = /dmdata/arch #本地归档存放路径 ARCH_FILE_SIZE = 2048 #单个归档大小,单位 MB ARCH_SPACE_LIMIT = 51200 #归档上限,单位 MB ARCH_FLUSH_BUF_SIZE = 2 ARCH_HANG_FLAG = 1 [ARCHIVE_REALTIME1] ARCH_TYPE = REALTIME #实时归档类型 ARCH_DEST = DMSERVER01 #实时归档目标实例名 [dmdba@dm2 ~]$
2.2.4 配置 dm.ini、dmmal.ini 和 dmwatcher.ini
配置 dm.ini
在 B 机器上配置备库的实例名为 DMSERVER02,dm.ini 参数修改如下:
[dmdba@dm2 ~]$ vi /dmdata/data/DAMENG/dm.ini INSTANCE_NAME = DMSERVER02 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 和 dmwatcher.ini
B 机器里 dmmal.ini、dmwatcher.ini 与 A 机器 DMSERVER01 的 dmmal.ini、dmwatcher.ini 相同,参照 A 机器 dmmal.ini、dmwatcher.ini 文件进行配置。
[dmdba@dm2 ~]$ vi /dmdata/data/DAMENG/dmmal.ini MAL_CHECK_INTERVAL = 10 #MAL 链路检测时间间隔 MAL_CONN_FAIL_INTERVAL = 10 #判定 MAL 链路断开的时间 MAL_TEMP_PATH = /dmdata/data/malpath/ #临时文件目录 MAL_BUF_SIZE = 512 #单个 MAL 缓存大小,单位 MB MAL_SYS_BUF_SIZE = 2048 #MAL 总大小限制,单位 MB MAL_COMPRESS_LEVEL = 0 #MAL 消息压缩等级,0 表示不压缩 [MAL_INST1] MAL_INST_NAME = DMSERVER01 #实例名,和 dm.ini 的 INSTANCE_NAME 一致 MAL_HOST = 192.168.1.1 #MAL 系统监听 TCP 连接的 IP 地址 MAL_PORT = 5336 #MAL 系统监听 TCP 连接的端口 MAL_INST_HOST = 192.168.17.37 #实例的对外服务 IP 地址 MAL_INST_PORT = 5236 #实例对外服务端口,和 dm.ini 的 PORT_NUM 一致 MAL_DW_PORT = 5436 #实例对应的守护进程监听 TCP 连接的端口 MAL_INST_DW_PORT = 5536 #实例监听守护进程 TCP 连接的端口 [MAL_INST2] MAL_INST_NAME = DMSERVER02 MAL_HOST = 192.168.1.2 MAL_PORT = 5336 MAL_INST_HOST = 192.168.17.38 MAL_INST_PORT = 5236 MAL_DW_PORT = 5436 MAL_INST_DW_PORT = 5536 [dmdba@dm2 ~]$ mkdir /dmdata/data/malpath/ [dmdba@dm2 ~]$ [dmdba@dm2 ~]$ vi /dmdata/data/DAMENG/dmwatcher.ini [GRP1] DW_TYPE = GLOBAL #全局守护类型 DW_MODE = AUTO #MANUAL:故障手切 AUTO:故障自切 DW_ERROR_TIME = 20 #远程守护进程故障认定时间 INST_ERROR_TIME = 20 #本地实例故障认定时间 INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间 INST_OGUID = 45331 #守护系统唯一 OGUID 值 INST_INI = /dmdata/data/DAMENG/dm.ini #dm.ini 文件路径 INST_AUTO_RESTART = 1 #打开实例的自动启动功能 INST_STARTUP_CMD = /home/dmdba/dmdbms/bin/dmserver #命令行方式启动 RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阈值,默认关闭 RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阈值,默认关闭 [dmdba@dm2 ~]$
2.2.5 注册服务
[root@dm2 ~]# /home/dmdba/dmdbms/script/root/dm_service_installer.sh -t dmserver -p DMSERVER02 -dm_ini /dmdata/data/DAMENG/dm.ini -m mount Created symlink from /etc/systemd/system/multi-user.target.wants/DmServiceDMSERVER02.service to /usr/lib/systemd/system/DmServiceDMSERVER02.service. 创建服务(DmServiceDMSERVER02)完成 [root@dm2 ~]# /home/dmdba/dmdbms/script/root/dm_service_installer.sh -t dmwatcher -p Watcher -watcher_ini /dmdata/data/DAMENG/dmwatcher.ini Created symlink from /etc/systemd/system/multi-user.target.wants/DmWatcherServiceWatcher.service to /usr/lib/systemd/system/DmWatcherServiceWatcher.service. 创建服务(DmWatcherServiceWatcher)完成 [root@dm2 ~]#
若要删除自启,可利用如下方式:
/home/dmdba/dmdbms/script/root/dm_service_uninstaller.sh -n DmServiceDMSERVER02 /home/dmdba/dmdbms/script/root/dm_service_uninstaller.sh -n DmWatcherServiceWatcher
2.3 配置确认监视器
在第三台机器 192.168.17.39 上配置确认监视器,存放确认监视器配置文件,并注册后台自启服务。
2.3.1 创建 dmmonitor.ini
[dmdba@dmm ~]$ vi /home/dmdba/dmdbms/bin/dmmonitor.ini MON_DW_CONFIRM = 1 #0:非确认(故障手切) 1:确认(故障自切) MON_LOG_PATH = ../log #监视器日志文件存放路径 MON_LOG_INTERVAL = 60 #每隔 60s 定时记录系统信息到日志文件 MON_LOG_FILE_SIZE = 2048 #单个日志大小,单位 MB MON_LOG_SPACE_LIMIT = 2048 #日志上限,单位 MB [GRP1] MON_INST_OGUID = 45331 #组 GRP1 的唯一 OGUID 值 MON_DW_IP = 192.168.1.1:5436 #IP 对应 MAL_HOST,PORT 对应 MAL_DW_PORT MON_DW_IP = 192.168.1.2:5436 [dmdba@dmm ~]$
配置非确认监视器:集群各节点的 bin 目录中,存放非确认监视器配置文件。
在配置监视器时,一般配置好确认监视器后,建议再配置一个非确认监视器的配置文件,在主备发生切换时,可以通过前台的方式启动非确认监视器进行手动切换。非确认监视器是通过将监视器配置文件中 MON_DW_CONFIRM 参数值修改为 0 来实现,示例如下:
[dmdba@dmm ~]$ vi /home/dmdba/dmdbms/bin/dmmonitor_manual.ini MON_DW_CONFIRM = 0 #0:非确认(故障手切) 1:确认(故障自切) MON_LOG_PATH = ../log #监视器日志文件存放路径 MON_LOG_INTERVAL = 60 #每隔 60s 定时记录系统信息到日志文件 MON_LOG_FILE_SIZE = 2048 #单个日志大小,单位 MB MON_LOG_SPACE_LIMIT = 2048 #日志上限,单位 MB [GRP1] MON_INST_OGUID = 45331 #组 GRP1 的唯一 OGUID 值 MON_DW_IP = 192.168.1.1:5436 #IP 对应 MAL_HOST,PORT 对应 MAL_DW_PORT MON_DW_IP = 192.168.1.2:5436 [dmdba@dmm ~]$
2.3.2 注册服务
[root@dmm ~]# /home/dmdba/dmdbms/script/root/dm_service_installer.sh -t dmmonitor -p Monitor -monitor_ini /home/dmdba/dmdbms/bin/dmmonitor.ini Created symlink from /etc/systemd/system/multi-user.target.wants/DmMonitorServiceMonitor.service to /usr/lib/systemd/system/DmMonitorServiceMonitor.service. 创建服务(DmMonitorServiceMonitor)完成 [root@dmm ~]#
非确认监视器无需注册服务。
若要删除自启服务,可利用如下方式:
/home/dmdba/dmdbms/script/root/dm_service_uninstaller.sh -n DmMonitorServiceMonitor
2.3.3 监视器使用
注意本小节监视器使用可以在2.4 小节操作后再执行。
| 命令 | 含义 |
|---|---|
| list | 查看守护进程的配置信息 |
| show global info | 查看所有实例组的信息 |
| tip | 查看系统当前运行状态 |
| login | 登录监视器 |
| logout | 退出登录 |
| choose switchover GRP1 | 主机正常:查看可切换为主机的实例列表 |
| switchover GRP1.实例名 | 主机正常:使用指定组的指定实例,切换为主机 |
| choose takeover GRP1 | 主机故障:查看可切换为主机的实例列表 |
| takeover GRP1.实例名 | 主机故障:使用指定组的指定实例,切换为主机 |
| choose takeover force GRP1 | 强制切换:查看可切换为主机的实例列表 |
| takeover force GRP1.实例名 | 强制切换:使用指定组的指定实例,切换为主机 |
对于在生产环境中配置有确认监视器时,主备只是发生了切换的情况下,再想将主备切换回去时,只需要启动非确认监视器执行切换命令即可。
例如,有主库 DMSERVER01 与备库 DMSERVER02 发生切换,恢复方法如下:
- 通过前台方式启动非确认监视器。
cd /home/dmdba/dmdbms/bin ./dmmonitor dmmonitor_manual.ini

- 检查集群状态。
可通过监视器命令"tip"或"show"来检查集群状态是否正常。


通过 “tip” 命令可以看到集群状态正常。
- 登录非确认监视器。
在非确认监视器中输入"login"再输入用户名和密码登录监视器。

- 查看满足切换条件的实例。
输入命令"choose switchover 组名"查看可切换为主机的实例列表。
choose switchover GRP1

可以看到 DMSERVER02可以进行切换。
- 主备切换。
执行命令"switchover GRP1.实例名"进行切换。
switchover GRP1.DMSERVER02

切换成功,DMSERVER02 恢复到主库对外提供服务。
- 退出非确认监视器。
先通过监视器命令"tip"和"show"检查当前集群状态。

集群状态正常,执行“exit”命令退出监视器。

建议
生产环境中建议应用使用服务名的方式进行连接,在配置文件 dm_svc.conf 中配置只连主库,这样连接的好处在于当主备发生切换后应用会自动连接到当前的主库,不会影响应用的正常使用。dm_svc.conf 详细介绍参考第三章节 dm_svc.conf 配置。
2.4 启动服务及查看信息
2.4.1 启动数据库并修改参数
#A 机器 dm1
[dmdba@dm1 ~]$ /home/dmdba/dmdbms/bin/DmServiceDMSERVER01 start
Starting DmServiceDMSERVER01: [ OK ]
[dmdba@dm1 ~]$ /home/dmdba/dmdbms/bin/disql SYSDBA/Sin0pharm@192.168.17.37:5236
服务器[192.168.17.37:5236]:处于普通配置状态
登录使用时间 : 16.958(ms)
disql V8
SQL> SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
DMSQL 过程已成功完成
已用时间: 14.787(毫秒). 执行号:1.
SQL> SP_SET_OGUID(45331);
DMSQL 过程已成功完成
已用时间: 5.114(毫秒). 执行号:2.
SQL> ALTER DATABASE PRIMARY;
操作已执行
已用时间: 17.608(毫秒). 执行号:0.
SQL> SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
DMSQL 过程已成功完成
已用时间: 21.001(毫秒). 执行号:3.
SQL>
#B 机器 dm2
[dmdba@dm2 ~]$ /home/dmdba/dmdbms/bin/DmServiceDMSERVER02 start
Starting DmServiceDMSERVER02: [ OK ]
[dmdba@dm2 ~]$ /home/dmdba/dmdbms/bin/disql SYSDBA/Sin0pharm@192.168.17.38:5236
服务器[192.168.17.38:5236]:处于普通配置状态
登录使用时间 : 13.905(ms)
disql V8
SQL> SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
DMSQL 过程已成功完成
已用时间: 21.294(毫秒). 执行号:1.
SQL> SP_SET_OGUID(45331);
DMSQL 过程已成功完成
已用时间: 5.341(毫秒). 执行号:2.
SQL> ALTER DATABASE STANDBY;
操作已执行
已用时间: 12.983(毫秒). 执行号:0.
SQL> SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
DMSQL 过程已成功完成
已用时间: 10.001(毫秒). 执行号:3.
SQL>
2.4.2 启动守护进程
#A/B机器
[dmdba@dm1 ~]$ /home/dmdba/dmdbms/bin/DmWatcherServiceWatcher start
Starting DmWatcherServiceWatcher: [ OK ]
[dmdba@dm1 ~]$
[dmdba@dm2 ~]$ /home/dmdba/dmdbms/bin/DmWatcherServiceWatcher start
Starting DmWatcherServiceWatcher: [ OK ]
[dmdba@dm2 ~]$
2.4.3 启动监视器
##后台启动
[dmdba@dmm bin]$ /home/dmdba/dmdbms/bin/DmMonitorServiceMonitor start
Starting DmMonitorServiceMonitor: [ OK ]
[dmdba@dmm bin]$
##前台启动,非确认方式
/home/dmdba/dmdbms/bin/dmmonitor /home/dmdba/dmdbms/bin/dmmonitor_manual.ini
2.5 启停集群
##启动
##A/B 机器
[dmdba@dm1 ~]$ /home/dmdba/dmdbms/bin/DmWatcherServiceWatcher start
Starting DmWatcherServiceWatcher: [ OK ]
[dmdba@dm1 ~]$
[dmdba@dm2 ~]$ /home/dmdba/dmdbms/bin/DmWatcherServiceWatcher start
Starting DmWatcherServiceWatcher: [ OK ]
[dmdba@dm2 ~]$
##停止
##A/B机器
[dmdba@dm1 ~]$ /home/dmdba/dmdbms/bin/DmWatcherServiceWatcher stop
Starting DmWatcherServiceWatcher: [ OK ]
[dmdba@dm1 ~]$
[dmdba@dm2 ~]$ /home/dmdba/dmdbms/bin/DmWatcherServiceWatcher stop
Starting DmWatcherServiceWatcher: [ OK ]
[dmdba@dm2 ~]$
##A 机器
[dmdba@~]$ /home/dmdba/dmdbms/bin/DmServiceDMSERVER01 stop
##B机器
[dmdba@dm2 ~]$ /home/dmdba/dmdbms/bin/DmServiceDMSERVER02 stop
Starting DmServiceDMSERVER02: [ OK ]
[dmdba@dm2 ~]$
2.6 测试同步
在A 机器dm1 上创建表t并插入数据,然后切换到B 机器dm2 查询表t检查记录是否同步
[dmdba@dm1 ~]$ /home/dmdba/dmdbms/bin/disql SYSDBA/Sin0pharm@192.168.17.37:5236
服务器[192.168.17.37:5236]:处于主库打开状态
登录使用时间 : 16.145(ms)
disql V8
SQL> create table t (id int,name varchar2(200));
操作已执行
已用时间: 8.671(毫秒). 执行号:801.
SQL> insert into t values(1,'sy test');
影响行数 1
已用时间: 13.662(毫秒). 执行号:802.
SQL> commit;
操作已执行
已用时间: 2.169(毫秒). 执行号:803.
SQL> select * from t;
行号 ID NAME
---------- ----------- -------
1 1 sy test
已用时间: 16.029(毫秒). 执行号:804.
SQL>
[dmdba@dm2 ~]$ /home/dmdba/dmdbms/bin/disql SYSDBA/Sin0pharm@192.168.17.38:5236
服务器[192.168.17.38:5236]:处于备库打开状态
登录使用时间 : 16.050(ms)
disql V8
SQL> select * from t;
行号 ID NAME
---------- ----------- -------
1 1 sy test
已用时间: 14.389(毫秒). 执行号:101.
SQL>
三、dm_svc.conf 配置
3.1 简介
dm_svc.conf 是使用达梦数据库时非常重要的配置文件,它包含了达梦各接口和客户端工具所需要配置的一些参数。通过它可以实现达梦各种集群的读写分离和均衡负载,且必须和接口/客户端工具位于同一台机器上才能生效。
初始 dm_svc.conf 文件由达梦安装时自动生成。不同的平台生成目录有所不同,注意相应访问用户需要对该文件有读取权限。
- 32 位的 DM 安装在 Win32 操作平台下,此文件位于 %SystemRoot%\system32 目录;
- 64 位的 DM 安装在 Win64 操作平台下,此文件位于 %SystemRoot%\system32 目录;
- 32 位的 DM 安装在 Win64 操作平台下,此文件位于 %SystemRoot%\SysWOW64 目录;
- 在 Linux 平台下,此文件位于 /etc 目录。
但在某些情况下,所使用的用户没有读取和修改 /etc 目录下文件的权限,这时就需要将 dm_svc.conf 文件放到有权限的目录下,并修改 url 连接串的内容。以 Linux 平台,文件放在 /home/dmdba 目录下为例:
-
在 /home/dmdba 目录下,编辑 dm_svc.conf 文件。
TIME_ZONE=(480) LANGUAGE=(cn) dm=(ip:端口) [dm] KEYWORDS=(需要排除的关键字) -
修改连接串。
jdbc:dm://dm?dmsvcconf=/home/dmdba/dm_svc.conf
dm_svc.conf 配置文件的内容分为全局配置区和服务配置区。全局配置区在前,可配置所有的配置项,服务配置区在后,以“[服务名]”开头,可配置除了服务名外的所有配置项。服务配置区中的配置优先级高于全局配置区(服务配置区的相同配置项会覆盖全局配置区对应的配置项)。
3.2 常用配置项介绍
- 服务名
用于连接数据库的服务名,参数值格式为:
服务名=(IP[:PORT],IP[:PORT],…)。
- TIME_ZONE
指明客户端的默认时区设置范围为:-779~840M,如 60 对应 +1:00 时区,+480 对于东八区,如果不做配置默认是操作系统的时区。
- KEYWORDS
该参数可以用于屏蔽数据库关键字,如果数据库关键字在 SQL 语句中以单词的形式存在,无法识别需要加上双引号或者可以通过该参数来屏蔽关键字,建议大小写都写入参数中。
例如:KEYWORDS=(versions,VERSIONS,type,TYPE)。
- LOGIN_MODE
指定优先登录的服务器模式。0:优先连接 PRIMARY 模式的库,NORMAL 模式次之,最后选择 STANTBY 模式;1:只连接主库;2:只连接备库;3:优先连接 STANDBY 模式的库,PRIMARY 模式次之,最后选择 NORMAL 模式;4:优先连接 NORMAL 模式的库,PRIMARY 模式次之,最后选择 STANDBY 模式。
注意
在 2021 年版本之后,此参数的默认值由 0 变更为 4。该参数详细介绍及使用办法请参考《DM 数据守护与读写分离集群》-5.8 章节。手册位于数据库安装路径 /dmdbms/doc 文件夹。
- SWITCH_TIMES
表示以服务名连接数据库时,若未找到符合条件的库成功建立连接,将尝试遍历服务名中库列表的次数。有效值范围 1~9223372036854775807,默认值为 1,可以设置至少 3 次用来避免由于网卡的波动,造成数据库连接测频繁切换。
- SWITCH_INTERVAL
表示在服务器之间切换的时间间隔,单位为毫秒,有效值范围 1~9223372036854775807。与参数 SWITCH_TIMES、EP_SELECTOR 配合使用,EP_SELECTOR 设置为 0,等待 SWITCH_INTERVAL 后会切换尝试连接下一个服务器,EP_SELECTOR 设置为 1,等待 SWITCH_INTERVAL 后会继续尝试连接该服务器,直到 SWITCH_TIMES 次再切换下一个服务器。
- EP_SELECTOR
表示连接数据库时采用何种模型建立连接。0:依次选取列表中的不同节点建立连接,使得所有连接均匀地分布在各个节点上;1:选择列表中最前面的节点建立连接,只有当前节点无法建立连接时才会选择下一个节点进行连接。
- AUTO_RECONNECT
表示连接发生异常或一些特殊场景下连接处理策略。0:关闭连接,1:当连接发生异常时自动切换到其他库,无论切换成功还是失败都会抛一个 SQLEXCEPTION,用于通知上层应用进行事务执行失败时的相关处理;2 配合 EP_SELECTOR=1 使用,如果服务名列表前面的节点恢复了,将当前连接切换到前面的节点上,可以根据应用的实际要求设定。
3.3 常用配置
3.3.1 单机配置
配置示例:
[dmdba@dm2 ~]$ vi /etc/dm_svc.conf
[dmdba@dm2 ~]$ cat /etc/dm_svc.conf
##以#开头的行表示是注释
###全局配置区
TIME_ZONE=(480)
LANGUAGE=(cn)
DM=(192.168.17.37:5236)
连接示例:
- Disql 连接:
[dmdba@dm2 ~]$ /home/dmdba/dmdbms/bin/disql SYSDBA/Sin0pharm@DM
服务器[192.168.17.37:5236]:处于备库打开状态
登录使用时间 : 16.761(ms)
disql V8
SQL>
- 通过管理工具连接:

3.3.2 主备集群配置
-
配置示例:
[dmdba@dm2 ~]$ vi /etc/dm_svc.conf [dmdba@dm2 ~]$ cat /etc/dm_svc.conf ##以#开头的行表示是注释 ##全局配置区 TIME_ZONE=(480) LANGUAGE=(cn) DMHA=(192.168.17.37:5236,192.168.17.38:5236) [DMHA] SWITCH_TIMES=(3) SWITCH_INTERVAL=(100) LOGIN_MODE=(1) [dmdba@dm2 ~]$ /home/dmdba/dmdbms/bin/disql SYSDBA/Sin0pharm@DMHA 服务器[192.168.17.38:5236]:处于主库打开状态 登录使用时间 : 22.032(ms) disql V8 SQL> -
jdbc 连接串:
jdbc:dm://DMHA




