达梦主备数据守护集群
数据守护集群(Data Watcher)部署方案**,适用于 两节点主备 + 独立确认监视器 架构。
🧾 一、环境说明
| 角色 | 主机名 | 业务 IP | 心跳 IP | 操作系统 | 安装目录 |
|---|---|---|---|---|---|
| 主库(Primary) | dmdb01 | 192.168.10.181 | 192.168.100.181 | Linux(如 CentOS 7/8) | /opt/dmdbms |
| 备库(Standby) | dmdb02 | 192.168.10.182 | 192.168.100.182 | Linux(同上) | /opt/dmdbms |
| 监视器(Monitor) | dmmon | 192.168.10.180 | —— | Linux(同上) | /opt/dmdbms |
✅ 所有机器已创建用户
dmdba,并完成达梦数据库软件安装(/opt/dmdbms)
📌 二、关键参数约定
| 参数 | 值 |
|---|---|
| 实例名(主) | GRP1_RT_01 |
| 实例名(备) | GRP1_RT_02 |
| 守护组名 | GRP1 |
| OGUID | 45331 |
| 数据库端口 | 5236 |
| MAL 端口 | 5336 |
| 守护进程监听端口(MAL_DW_PORT) | 5436 |
| 实例监听守护端口(MAL_INST_DW_PORT) | 5536 |
| 归档上限 | 51200 MB |
| 切换模式 | 自动切换(DW_MODE = AUTO) |
| 监视器类型 | 确认监视器(MON_DW_CONFIRM = 1) |
🔧 三、部署步骤(按顺序执行)
步骤 1:在 A 机器(192.168.10.181)初始化主库
su - dmdba
cd /opt/dmdbms/bin
./dminit \
PATH=/opt/dmdbms/data/ \
INSTANCE_NAME=GRP1_RT_01 \
PAGE_SIZE=32 \
EXTENT_SIZE=32 \
LOG_SIZE=2048 \
SYSDBA_PWD=Dameng123 \
SYSAUDITOR_PWD=Dameng123
步骤 2:启动主库并配置归档
# 启动数据库(前台)
./dmserver /opt/dmdbms/data/DAMENG/dm.ini
另开终端,进入 disql:
disql SYSDBA/Dameng123
SQL> ALTER DATABASE MOUNT;
SQL> ALTER DATABASE ARCHIVELOG;
SQL> ALTER DATABASE ADD ARCHIVELOG 'DEST=/opt/dmdbms/data/DAMENG/arch, TYPE=LOCAL, FILE_SIZE=1024, SPACE_LIMIT=51200';
SQL> ALTER DATABASE OPEN;
SQL> EXIT;
步骤 3:备份主库
-- 在 disql 中执行
BACKUP DATABASE BACKUPSET '/opt/dmdbms/data/DAMENG/bak/BACKUP_FILE';
步骤 4:配置主库参数文件(A 机器)
(1) 修改 dm.ini
-- 在 disql 中执行
SP_SET_PARA_VALUE(2, 'PORT_NUM', 5236);
SP_SET_PARA_VALUE(2, 'DW_INACTIVE_INTERVAL', 60);
SP_SET_PARA_VALUE(2, 'ALTER_MODE_STATUS', 0);
SP_SET_PARA_VALUE(2, 'ENABLE_OFFLINE_TS', 2);
SP_SET_PARA_VALUE(2, 'MAL_INI', 1);
SP_SET_PARA_VALUE(2, 'RLOG_SEND_APPLY_MON', 64);
(2) 创建 dmarch.ini
# /opt/dmdbms/data/DAMENG/dmarch.ini
ARCH_WAIT_APPLY = 0
[ARCHIVE_LOCAL]
ARCH_TYPE = LOCAL
ARCH_DEST = /opt/dmdbms/data/DAMENG/arch/
ARCH_FILE_SIZE = 1024
ARCH_SPACE_LIMIT = 51200
[ARCHIVE_REALTIME1]
ARCH_TYPE = REALTIME
ARCH_DEST = GRP1_RT_02
(3) 创建 dmmal.ini
# /opt/dmdbms/data/DAMENG/dmmal.ini
MAL_CHECK_INTERVAL = 10
MAL_CONN_FAIL_INTERVAL = 10
MAL_TEMP_PATH = /opt/dmdbms/data/malpath/
MAL_BUF_SIZE = 512
MAL_SYS_BUF_SIZE = 2048
MAL_COMPRESS_LEVEL = 0
[MAL_INST1]
MAL_INST_NAME = GRP1_RT_01
MAL_HOST = 192.168.100.181
MAL_PORT = 5336
MAL_INST_HOST = 192.168.10.181
MAL_INST_PORT = 5236
MAL_DW_PORT = 5436
MAL_INST_DW_PORT = 5536
[MAL_INST2]
MAL_INST_NAME = GRP1_RT_02
MAL_HOST = 192.168.100.182
MAL_PORT = 5336
MAL_INST_HOST = 192.168.10.182
MAL_INST_PORT = 5236
MAL_DW_PORT = 5436
MAL_INST_DW_PORT = 5536
(4) 创建 dmwatcher.ini
# /opt/dmdbms/data/DAMENG/dmwatcher.ini
[GRP1]
DW_TYPE = GLOBAL
DW_MODE = AUTO
DW_ERROR_TIME = 20
INST_ERROR_TIME = 20
INST_RECOVER_TIME = 60
INST_OGUID = 45331
INST_INI = /opt/dmdbms/data/DAMENG/dm.ini
INST_AUTO_RESTART = 1
INST_STARTUP_CMD = /opt/dmdbms/bin/dmserver
RLOG_SEND_THRESHOLD = 0
RLOG_APPLY_THRESHOLD = 0
步骤 5:将备份拷贝到 B 机器(192.168.10.182)
scp -r /opt/dmdbms/data/DAMENG/bak/BACKUP_FILE dmdba@192.168.10.182:/opt/dmdbms/data/DAMENG/bak/
步骤 6:在 B 机器恢复备库
su - dmdba
cd /opt/dmdbms/bin
# 初始化空实例(仅结构)
./dminit \
PATH=/opt/dmdbms/data/ \
INSTANCE_NAME=GRP1_RT_02 \
PAGE_SIZE=32 \
EXTENT_SIZE=32 \
LOG_SIZE=2048 \
SYSDBA_PWD=Dameng123 \
SYSAUDITOR_PWD=Dameng123
# 恢复数据
./dmrman CTLSTMT="RESTORE DATABASE '/opt/dmdbms/data/DAMENG/dm.ini' FROM BACKUPSET '/opt/dmdbms/data/DAMENG/bak/BACKUP_FILE'"
./dmrman CTLSTMT="RECOVER DATABASE '/opt/dmdbms/data/DAMENG/dm.ini' FROM BACKUPSET '/opt/dmdbms/data/DAMENG/bak/BACKUP_FILE'"
./dmrman CTLSTMT="RECOVER DATABASE '/opt/dmdbms/data/DAMENG/dm.ini' UPDATE DB_MAGIC"
步骤 7:配置备库参数文件(B 机器)
⚠️ 除
dmarch.ini中的ARCH_DEST外,其余文件与 A 机器完全一致
dmarch.ini(B 机器)
ARCH_WAIT_APPLY = 0
[ARCHIVE_LOCAL]
ARCH_TYPE = LOCAL
ARCH_DEST = /opt/dmdbms/data/DAMENG/arch/
ARCH_FILE_SIZE = 1024
ARCH_SPACE_LIMIT = 51200
[ARCHIVE_REALTIME1]
ARCH_TYPE = REALTIME
ARCH_DEST = GRP1_RT_01 # ← 指向主库实例名
✅
dmmal.ini、dmwatcher.ini、dm.ini(通过 SP_SET_PARA_VALUE 设置)内容与 A 机器相同。
步骤 8:设置主备角色
A 机器(主库):
disql SYSDBA/Dameng123
SQL> SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
SQL> SP_SET_OGUID(45331);
SQL> ALTER DATABASE PRIMARY;
SQL> SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
SQL> EXIT;
B 机器(备库):
disql SYSDBA/Dameng123
SQL> SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
SQL> SP_SET_OGUID(45331);
SQL> ALTER DATABASE STANDBY;
SQL> SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
SQL> EXIT;
步骤 9:注册系统服务(A 和 B 机器)
# 注册数据库服务(mount 模式)
/opt/dmdbms/script/root/dm_service_installer.sh -t dmserver -p GRP1_RT_01 -dm_ini /opt/dmdbms/data/DAMENG/dm.ini -m mount
/opt/dmdbms/script/root/dm_service_installer.sh -t dmserver -p GRP1_RT_02 -dm_ini /opt/dmdbms/data/DAMENG/dm.ini -m mount
# 注册守护进程
/opt/dmdbms/script/root/dm_service_installer.sh -t dmwatcher -p Watcher -watcher_ini /opt/dmdbms/data/DAMENG/dmwatcher.ini
💡 若为 systemd 系统,服务名为
DmServiceGRP1_RT_01、DmWatcherWatcher
步骤 10:部署确认监视器(在 192.168.10.180)
创建 dmmonitor.ini
# /opt/dmdbms/bin/dmmonitor.ini
MON_DW_CONFIRM = 1
MON_LOG_PATH = ../log
MON_LOG_INTERVAL = 60
MON_LOG_FILE_SIZE = 512
MON_LOG_SPACE_LIMIT = 2048
[GRP1]
MON_INST_OGUID = 45331
MON_DW_IP = 192.168.100.181:5436
MON_DW_IP = 192.168.100.182:5436
注册为系统服务
/opt/dmdbms/script/root/dm_service_installer.sh -t dmmonitor -p Monitor -monitor_ini /opt/dmdbms/bin/dmmonitor.ini
✅ 服务名为
DmMonitorMonitor
步骤 11:配置应用连接(所有应用服务器)
创建 /etc/dm_svc.conf:
TIME_ZONE=(480)
LANGUAGE=(cn)
DMHA=(192.168.10.181:5236,192.168.10.182:5236)
[DMHA]
LOGIN_MODE=(1)
SWITCH_TIMES=(3)
SWITCH_INTERVAL=(100)
EP_SELECTOR=(0)
应用连接方式:
- Disql:
disql SYSDBA/Dameng123@DMHA - JDBC:
jdbc:dm://DMHA
🔄 四、启动与验证
启动顺序
- A、B 机器:启动数据库服务(mount 模式)
systemctl start DmServiceGRP1_RT_01 # A systemctl start DmServiceGRP1_RT_02 # B - A、B 机器:启动守护进程
systemctl start DmWatcherWatcher - 监视器机器:启动监视器
systemctl start DmMonitorMonitor
验证状态
在监视器机器执行:
/opt/dmdbms/bin/dmmonitor /opt/dmdbms/bin/dmmonitor.ini
输入:
tip
预期输出:
[monitor] 2026-01-12 12:02:13: 收到守护进程(GRP1_RT_01)消息
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2026-01-12 12:02:13 OPEN OK GRP1_RT_01 OPEN PRIMARY VALID 8 47859 47859
[monitor] 2026-01-12 12:02:13: 收到守护进程(GRP1_RT_02)消息
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2026-01-12 12:02:13 OPEN OK GRP1_RT_02 OPEN STANDBY VALID 8 47859 47859
tip
[monitor] 2026-01-12 12:02:17: 实例GRP1_RT_01[PRIMARY, OPEN, ISTAT_SAME:TRUE]不可加入其他实例,守护进程状态:OPEN,Open记录状态:VALID
[monitor] 2026-01-12 12:02:17: 实例GRP1_RT_01[PRIMARY, OPEN, ISTAT_SAME:TRUE]当前没有命令正在执行
[monitor] 2026-01-12 12:02:17: 实例GRP1_RT_01[PRIMARY, OPEN, ISTAT_SAME:TRUE]运行正常, 守护进程是OPEN状态,守护类型是GLOBAL
[monitor] 2026-01-12 12:02:17: 实例GRP1_RT_02[STANDBY, OPEN, ISTAT_SAME:TRUE]可加入实例GRP1_RT_01[PRIMARY, OPEN, ISTAT_SAME:TRUE]
[monitor] 2026-01-12 12:02:17: 实例GRP1_RT_02[STANDBY, OPEN, ISTAT_SAME:TRUE]当前没有命令正在执行
[monitor] 2026-01-12 12:02:17: 实例GRP1_RT_02[STANDBY, OPEN, ISTAT_SAME:TRUE]运行正常, 守护进程是OPEN状态,守护类型是GLOBAL
[monitor] 2026-01-12 12:02:17: 组(GRP1)当前活动实例运行正常
[monitor] 2026-01-12 12:02:17: 所有组中的活动实例运行正常!
通过前台方式启动非确认监视器。
./dmmonitor dmmonitor_manual.ini
可通过监视器命令"tip"或"show"来检查集群状态是否正常。
在非确认监视器中输入"login"再输入用户名和密码登录监视器。
输入命令"choose switchover 组名"查看可切换为主机的实例列表。
Copychoose switchover GRP1
主备切换。
执行命令"switchover GRP1.实例名"进行切换。
switchover GRP1.GRP1_RT_01
如果一个为mount , 则尝试启动
open database GRP1_RT_01
✅ 五、注意事项(来自官方文档)
- 心跳网络必须独立且高可靠,建议物理隔离或 VLAN 隔离;
- 主备 OGUID 必须一致,且在同一守护组内唯一;
- 自动切换必须使用确认监视器,且部署在第三台独立机器;
- 所有配置文件中的 IP 必须严格区分业务网与心跳网;
- 首次启动必须先启数据库(mount),再启守护进程。
- 感谢你赐予我前进的力量
赞赏者名单
因为你们的支持让我意识到写文章的价值🙏
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 龙羽

