数据守护集群(Data Watcher)部署方案**,适用于 两节点主备 + 独立确认监视器 架构。


🧾 一、环境说明

角色主机名业务 IP心跳 IP操作系统安装目录
主库(Primary)dmdb01192.168.10.181192.168.100.181Linux(如 CentOS 7/8)/opt/dmdbms
备库(Standby)dmdb02192.168.10.182192.168.100.182Linux(同上)/opt/dmdbms
监视器(Monitor)dmmon192.168.10.180——Linux(同上)/opt/dmdbms

✅ 所有机器已创建用户 dmdba,并完成达梦数据库软件安装(/opt/dmdbms


📌 二、关键参数约定

参数
实例名(主)GRP1_RT_01
实例名(备)GRP1_RT_02
守护组名GRP1
OGUID45331
数据库端口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.inidmwatcher.inidm.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_01DmWatcherWatcher


步骤 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

🔄 四、启动与验证

启动顺序

  1. A、B 机器:启动数据库服务(mount 模式)
    systemctl start DmServiceGRP1_RT_01   # A
    systemctl start DmServiceGRP1_RT_02   # B
    
  2. A、B 机器:启动守护进程
    systemctl start DmWatcherWatcher
    
  3. 监视器机器:启动监视器
    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

✅ 五、注意事项(来自官方文档)

  1. 心跳网络必须独立且高可靠,建议物理隔离或 VLAN 隔离;
  2. 主备 OGUID 必须一致,且在同一守护组内唯一;
  3. 自动切换必须使用确认监视器,且部署在第三台独立机器
  4. 所有配置文件中的 IP 必须严格区分业务网与心跳网
  5. 首次启动必须先启数据库(mount),再启守护进程