达梦数据库主备集群手工搭建及主备切换演练
环境:DM8、Linux(CentOS 7 ),三台服务器。本文记录从零搭一套"一主一备一监视" 式的主备集群,纯手工操作,不依赖图形化工具。
环境:DM8、Linux(CentOS 7 ),三台服务器。
本文记录从零搭一套"一主一备一监视" 式的主备集群,纯手工操作,不依赖图形化工具。
一、环境规划
1.1 IP规划
| 角色 | 主机名 | 业务IP | 心跳IP | 实例名 |
|---|---|---|---|---|
| 主库(Primary) | dw01 | 192.168.6.100 | 192.168.100.100 | DMDB01 |
| 备库(Standby) | dw02 | 192.168.1.101 | 192.168.100.101 | DMDB02 |
| 监视器(monitor) | dwmon | 192.168.1.102 | 192.168.100.102 | / |
1.2 端口规划
| 实例名 | MAL_INST_PORT | MAL_INST_DW_PORT | MAL_HOST | MAL_PORT | MAL_DW_PORT |
|---|---|---|---|---|---|
| DMDB01(Primary) | 5236 | 5536 | 192.168.6.101 | 5336 | 5436 |
| DMDB02(Standby) | 5236 | 5536 | 192.168.6.102 | 5336 | 5436 |
约定:
- 安装目录:
/dm - 数据目录:
/dmata - 归档目录:
/dmarch
二、前置准备
2.1 关闭防火墙(两台机器都做)
# 关闭防火墙(生产环境改为放行 5236 端口)
systemctl stop firewalld
systemctl disable firewalld
2.3 创建 dmdba 用户和目录
groupadd dinstall
useradd -g dinstall -m -d /home/dmdba -s /bin/bash dmdba
echo 'dmdba:DM@123456' | chpasswd
2.4 主备库上安装dm8软件
./DMInstall.bin -i

三、初始化主备库
切换到 dmdba 用户:
su - dmdba
3.1 初始化实例
# 主库初始化
/dm/bin/dminit PATH=/dmdata PAGE_SIZE=32 EXTENT_SIZE=32 LOG_SIZE=1024 CASE_SENSITIVE=0 CHARSET=1 INSTANCE_NAME=dmdb01 PORT_NUM=5236 SYSDBA_PWD=Dameng123# SYSAUDITOR_PWD=Dameng123#
# 备库初始化
/dm/bin/dminit PATH=/dmdata PAGE_SIZE=32 EXTENT_SIZE=32 LOG_SIZE=1024 CASE_SENSITIVE=0 CHARSET=1 INSTANCE_NAME=dmdb02 PORT_NUM=5236 SYSDBA_PWD=Dameng123# SYSAUDITOR_PWD=Dameng123#
charset=1表示UTF-8 则填 。log_size单位 MB,生产环境的日志文件建议 2G 以上,主备环境尤其要大。
初始化成功后数据文件位于 /dmdata/DAMENG。
3.2 注册主库服务
# root 用户执行
/dm/script/root/dm_service_installer.sh -t dmserver -p dmdb01 -dm_ini /dmdata/DAMENG/dm.ini -m mount
四、配置主库归档和参数
主备同步依赖归档日志(Redo Log Archive),必须先开启。
4.1 修改 dm.ini
编辑 /dmdata/DAMENG/dm.ini,添加或修改以下参数:
## 归档相关
ARCH_INI = 1 # 启用归档配置文件
## 主备角色(主库填 1)
ALTER_MODE_STATUS = 0 # 允许切换模式
ENABLE_OFFLINE_TS = 2
## MAL 链路(主备通信总线)
MAL_INI = 1
4.2 配置归档文件 dmarch.ini
新建 /dmdata/DAMENG/dmarch.ini:
#DaMeng Database Archive Configuration file
#this is comments
ARCH_WAIT_APPLY = 0
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /dmarch
ARCH_FILE_SIZE = 1024
ARCH_SPACE_LIMIT = 51200
ARCH_FLUSH_BUF_SIZE = 2
ARCH_HANG_FLAG = 1
[ARCHIVE_REALTIME1]
ARCH_TYPE = REALTIME #实时归档类型
ARCH_DEST = dmdb01 #实时归档目标实例名
ARCH_DEST中的dmdb02是下面 dmmal.ini 里定义的备库 MAL 节点名。
4.3 配置 MAL(主备通信) dmmal.ini
新建 /dmdata/DAMENG/dmmal.ini:
MAL_CHECK_INTERVAL = 5 #MAL 链路检测时间间隔
MAL_CONN_FAIL_INTERVAL = 5 #判定 MAL 链路断开的时间
[MAL_INST1]
MAL_INST_NAME = dmdb01 #实例名,和 dm.ini 中的 INSTANCE_NAME 一致
MAL_HOST = 192.168.100.100 #MAL 系统监听 TCP 连接的 IP 地址
MAL_PORT = 5336 #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST = 192.168.6.100 #实例的对外服务 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 = dmdb02
MAL_HOST = 192.168.100.101
MAL_PORT = 5336
MAL_INST_HOST = 192.168.6.101
MAL_INST_PORT = 5236
MAL_DW_PORT = 5436
MAL_INST_DW_PORT = 5536
MAL_PORT是 MAL 通信端口(默认 61141),MAL_DW_PORT是守护进程端口(默认 52141)。
4.4 配置守护进程 dmwatcher.ini
新建 /dmdata/DAMENG/dmwatcher.ini:
[GRP1]
DW_TYPE = GLOBAL
DW_MODE = AUTO
DW_ERROR_TIME = 30
INST_ERROR_TIME = 20
INST_RECOVER_TIME = 60
INST_OGUID = 941027
INST_INI = /dmdata/DAMENG/dm.ini
INST_AUTO_RESTART = 1
INST_STARTUP_CMD = /dm/bin/DmServiceDAMENG start
RLOG_SEND_THRESHOLD = 0
RLOG_APPLY_THRESHOLD = 0
4.5 启动主库使配置生效
./dmserver /dmdata/DAMENG/dm.ini
登录确认归档已开启:
SELECT ARCH_STATUS FROM V$DATABASE;
SELECT * FROM V$ARCH_STATUS;
五、备份主库,准备备库数据
5.1 对主库做全量备份
关闭主库,进行脱机备份
./dmrman CTLSTMT="BACKUP DATABASE '/dmdata/DAMENG/dm.ini' BACKUPSET '/home/dmdba/full_bak'"
5.2 将备份传到备库
scp -r /home/dmdba/full_bak dmdba@192.168.6.101:/home/dmdba/
六、初始化备库
切换到 dm-standby 机器:
6.1 恢复数据到备库
su - dmdba
# 备库已初始化好一个空实例(参数和主库保持一致,尤其是 page_size、charset)
# 用主库备份恢复(覆盖空实例数据文件)
./dmrman CTLSTMT="restore database '/dmdata/DAMENG/dm.ini' from backupset '/home/dmdba/full_bak'"
./dmrman CTLSTMT="recover database '/dmdata/DAMENG/dm.ini' from backupset '/home/dmdba/full_bak'"
./dmrman CTLSTMT="recover database '/dmdata/DAMENG/dm.ini' update db_magic"
最后一步
UPDATE DB_MAGIC是将备库数据库标记为可接收主库日志的状态,不能省略。
6.2 将主库的配置文件复制到备库
scp dmdba@192.168.6.100:/dmdata/DAMENG/dmarch.ini /dmdata/DAMENG/
scp dmdba@192.168.6.100:/dmdata/DAMENG/dmmal.ini /dmdata/DAMENG/
6.3 修改备库的 dm.ini
编辑 /dm8/data/DMSERVER/dm.ini,和主库相同,添加:
ARCH_INI = 1
ALTER_MODE_STATUS = 0
MAL_INI = 1
6.4 修改备库的 dmarch.ini
备库的 dmarch.ini 与主库一致,仅需修改ARCH_DEST :
ARCH_WAIT_APPLY = 1
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /dmarch/DAMENG
ARCH_FILE_SIZE = 1024
ARCH_SPACE_LIMIT = 10244
[ARCHIVE_REALTIME1]
ARCH_TYPE = REALTIME
ARCH_DEST = GRP1_DW_01
6.5 配置备库的 dmwatcher.ini
新建 /dmdata/DAMENG/dmwatcher.ini:
[GRP1]
DW_TYPE = GLOBAL
DW_MODE = AUTO
DW_ERROR_TIME = 30
INST_ERROR_TIME = 20
INST_RECOVER_TIME = 60
INST_OGUID = 941027
INST_INI = /dmdata/DAMENG/dm.ini
INST_AUTO_RESTART = 1
INST_STARTUP_CMD = /dm/bin/DmServiceDAMENG start
RLOG_SEND_THRESHOLD = 0
RLOG_APPLY_THRESHOLD = 0
与主库的配置一致。
6.6 注册并以 Mount 模式启动备库
# root 执行
/dm/script/root/dm_service_installer.sh -t dmserver -p dmdb02 -dm_ini /dmdata/DAMENG/dm.ini -m mount
# 先以 Mount 模式启动(备库不能直接 Open)
systemctl start DmServiceDMSERVER
备库启动后处于 MOUNT 状态,不接受普通业务连接,只接收主库日志。
七、启动守护进程(dmwatcher)
守护进程负责主备心跳检测和自动切换,两台机器都要启动。
7.1 注册 dmwatcher 服务
# root 执行(主库机器)
/dm/script/root/dm_service_installer.sh -t dmwatcher -p Watcher -watcher_ini /dmdata/DAMENG/dmwatcher.ini
# root 执行(备库机器,同上命令)
/dm/script/root/dm_service_installer.sh -t dmwatcher -p Watcher -watcher_ini /dmdata/DAMENG/dmwatcher.ini
7.2 启动顺序
必须先启主库 watcher,再启备库 watcher,否则主备握手会失败。
# 主库机器
systemctl start DmWatcherServiceGRP1
# 备库机器
systemctl start DmWatcherServiceGRP1
查看日志确认握手成功:
tail -f dm_dmwatcher_GRP1_DW_01_202605.log
八、验证主备同步
8.1 在主库写入数据
-- 主库
CREATE TABLE TEST_SYNC (ID INT, NAME VARCHAR(100));
INSERT INTO TEST_SYNC VALUES (1, 'hello standby');
COMMIT;

8.2 在备库查询(只读)
-- 备库(以只读方式连接)
SELECT * FROM TEST_SYNC;
-- 能查到说明同步正常

8.3 查看主备状态
-- 配置一个普通监视器
MON_DW_CONFIRM = 0 #普通监视器
MON_LOG_PATH = /dm/log
MON_LOG_INTERVAL = 60
MON_LOG_FILE_SIZE = 32
MON_LOG_SPACE_LIMIT = 2048
[GRP1]
MON_INST_OGUID = 941027
MON_DW_IP = 192.168.100.100:5436
MON_DW_IP = 192.168.100.101:5436

九、测试主备切换
注 测试主备切换前先了解一下达梦datawatch集群的启停顺序
关闭顺序
停监视器 → 停备库守护 → 停主库守护 → 停主库实例 → 停备库实例
启动顺序
启守护:先备后主 → 启数据库:先备后主 → 最后启监视器
9.1 手动切换主备库
查看dwmon服务器上的确认监视器是否正常运行
ps -ef|grep dmm

查看dw01服务器上的数据库服务和守护进程
ps -ef|grep dms
ps -ef|grep dmw

查看dw02服务器上的数据库服务和守护进程
ps -ef|grep dms
ps -ef|grep dmw

登录普通监视器
dw02从备机切换为主机
9.2 将主库的内网网卡down掉

备库dw01自动takeover,升为主节点
旧的主库dw02状态变为suspend
恢复dw02的网络后,会自动拉起dw02,切换为备机加入集群
9.2 模拟主库断电
虚拟机→ 电源 → 关机
monitor检测到主节点异常开始切换
原来的备节点提升为主节点
注原主库恢复后不能直接重新加入,需要:
- 用新主库的当前备份恢复数据(重走一遍第六节)
- 修改角色为
STANDBY - 启动后守护进程自动同步
十、配置文件速查汇总
| 文件 | 位置 | 作用 |
|---|---|---|
| dm.ini | /dmdata/DAMENG/ | 实例核心参数 |
| dmarch.ini | /dmdata/DAMENG/ | 归档策略配置 |
| dmmal.ini | /dmdata/DAMENG/ | 主备 MAL 通信配置 |
| dmwatcher.ini | /dmdata/DAMENG/ | 守护进程配置 |
小结
整个搭建流程核心就四步:
- 初始化主库 → 开归档 → 配 MAL 和 watcher
- 备份主库 → 传到备库 → 恢复(带 UPDATE DB_MAGIC)
- 备库配置 → 复制 MAL 文件 → 改角色为 STANDBY → Mount 启动
- 两端启动 dmwatcher → 等待握手成功 → 验证同步
达梦的主备机制和 Oracle Data Guard 思路基本一致,熟悉 DG 的同学上手很快。日常运维重点是监控 V$RAPPLY_STAT 里的日志延迟,以及定期测试 failover 演练。
达梦社区地址:https://eco.dameng.com
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)