**背景:**测试达梦主备集群的构建,先在docker容器中构建达梦主备集群。为生产环境做准备。
信息:
主机Adocker启动命令:
sudo docker run -d --name DM01 --restart=always --privileged=true --network host -v /data/DM8_data_dm01/data:/opt/dmdbms/data -v /data/DM8_data_dm01/log:/opt/dmdbms/log -e LD_LIBRARY_PATH=/opt/dmdbms/bin -e PAGE_SIZE=16 -e EXTENT_SIZE=32 -e LOG_SIZE=1024 -e UNICODE_FLAG=1 -e CASE_SENSITIVE=1 -e LENGTH_IN_CHAR=1 -e BLANK_PAD_MODE=1 -e SYSDBA_PWD=SYSDBA001 -e BUFFER=1000 if010/dameng:latest /opt/dmdbms/bin/dmserver /opt/dmdbms/data/DAMENG/dm.ini
主机B启动命令:
sudo docker run -d --name DM02 --restart=always --privileged=true --network host -v /data/DM8_data_dm02/data:/opt/dmdbms/data -v /data/DM8_data_dm02/log:/opt/dmdbms/log -e LD_LIBRARY_PATH=/opt/dmdbms/bin -e PAGE_SIZE=16 -e EXTENT_SIZE=32 -e LOG_SIZE=1024 -e UNICODE_FLAG=1 -e CASE_SENSITIVE=1 -e LENGTH_IN_CHAR=1 -e BLANK_PAD_MODE=1 -e SYSDBA_PWD=SYSDBA001 -e BUFFER=1000 if010/dameng:latest /opt/dmdbms/bin/dmserver /opt/dmdbms/data/DAMENG/dm.ini
主服务器A的配置文件内容:
【dm.ini】
cat /opt/dmdbms/data/DAMENG/dm.ini | egrep "IN.*NAME|ALTER_MODE_STATUS|MAL_INI|ARCH_INI"
INSTANCE_NAME = DM01 #Instance name
ALTER_MODE_STATUS = 1 #Whether to permit database user to alter database mode and status by SQLs, 1: yes, 0: no
MAL_INI = 1 #dmmal.ini
ARCH_INI = 1 #dmarch.ini
【dmmal.ini】
cat opt/dmdbms/data/DAMENG/dmmal.ini
[MAL_INST1]
MAL_INST_NAME = DM01
MAL_HOST = 192.168.0.43
MAL_PORT = 5336
MAL_INST_HOST = 192.168.0.43
MAL_INST_PORT = 5236
MAL_DW_PORT = 5436
MAL_INST_DW_PORT = 5437
[MAL_INST2]
MAL_INST_NAME = DM02
MAL_HOST = 192.168.0.17
MAL_PORT = 5336
MAL_INST_HOST = 192.168.0.17
MAL_INST_PORT = 5236
MAL_DW_PORT = 5436
MAL_INST_DW_PORT = 5437
【dmarch.ini】
cat opt/dmdbms/data/DAMENG/dmarch.ini
[ARCHIVE_TIMELY1]
ARCH_TYPE = REALTIME
ARCH_DEST = DM02
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /opt/dmdbms/data/DAMENG/arch
ARCH_FILE_SIZE = 256
ARCH_SPACE_LIMIT = 10240
【dmarch.ini】
cat opt/dmdbms/data/DAMENG/dmwatcher.ini
[GRP1]
DW_TYPE = GLOBAL
DW_MODE = AUTO
DW_ERROR_TIME = 20
INST_RECOVER_TIME = 60
INST_ERROR_TIME = 20
INST_OGUID = 20200101
INST_INI = /opt/dmdbms/data/DAMENG/dm.ini
INST_AUTO_RESTART = 1
INST_STARTUP_CMD = /opt/dmdbms/bin/dmserver /opt/dmdbms/data/DAMENG/dm.ini -noconsole
RLOG_SEND_THRESHOLD = 0
RLOG_APPLY_THRESHOLD = 0
主机B的配置文件信息:
cat /opt/dmdbms/data/DAMENG/dm.ini | egrep "IN.*NAME|ALTER_MODE_STATUS|MAL_INI|ARCH_INI"
INSTANCE_NAME = DM02 #Instance name
ALTER_MODE_STATUS = 1 #Whether to permit database user to alter database mode and status by SQLs, 1: yes, 0: no
MAL_INI = 1 #dmmal.ini
ARCH_INI = 1 #dmarch.ini
dmmal.ini内容与主服务器A相同。
dmarch.ini
cat opt/dmdbms/data/DAMENG/dmarch.ini
[ARCHIVE_TIMELY1]
ARCH_TYPE = REALTIME
ARCH_DEST = DM01
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /opt/dmdbms/data/DAMENG/arch
ARCH_FILE_SIZE = 256
ARCH_SPACE_LIMIT = 10240
dmwatcher.ini
cat opt/dmdbms/data/DAMENG/dmwatcher.ini
[GRP1]
DW_TYPE = GLOBAL
DW_MODE = AUTO
DW_ERROR_TIME = 20
INST_RECOVER_TIME = 60
INST_ERROR_TIME = 20
INST_OGUID = 20200101
INST_INI = /opt/dmdbms/data/DAMENG/dm.ini
INST_AUTO_RESTART = 1
INST_STARTUP_CMD = /opt/dmdbms/bin/dmserver /opt/dmdbms/data/DAMENG/dm.ini -noconsole
RLOG_SEND_THRESHOLD = 0
RLOG_APPLY_THRESHOLD = 0
OGUID,在主机A,B的数据库中均设置好。
主备服务器,守护进程都启动后:
/opt/dmdbms/bin/dmwatcher /opt/dmdbms/data/DAMENG/dmwatcher.ini
主服务器log:
tail /opt/dmdbms/log/dm_dmwatcher_DM01_202607.log
tail /opt/dmdbms/log/dm_dmwatcher_DM01_202607.log
2026-07-10 14:43:52.597 [INFO] dmwatcher P0000001054 T0000000000000001062 Send tcp msg to local ep DM01, hpc_seqno:0, code:0
2026-07-10 14:43:52.597 [INFO] dmwatcher P0000001054 T0000000000000001062 Set GRP1 dmwatcher sub state to WAIT_CLEAR
2026-07-10 14:43:52.597 [INFO] dmwatcher P0000001054 T0000000000000001062 dw2_group_get_curr_ep_retcode, ep(DM01) cmd_ret:cmd=217, dseq=1783581020, code=100
2026-07-10 14:43:52.598 [INFO] dmwatcher P0000001054 T0000000000000001062 dw2_group_get_curr_ep_retcode, ep(DM01) cmd_ret:cmd=217, dseq=1783581020, code=0
2026-07-10 14:43:52.598 [INFO] dmwatcher P0000001054 T0000000000000001062 dw2_clear_ep_cmd_info_low, clear ep(DM01) cmd info, and reset curr_ep to NULL.
2026-07-10 14:43:52.598 [INFO] dmwatcher P0000001054 T0000000000000001062 notify ep(DM01) set dw_stat to NONE success!
2026-07-10 14:43:52.598 [INFO] dmwatcher P0000001054 T0000000000000001062 dw2_clear_ep_cmd_info_low, clear ep(DM01) cmd info.
2026-07-10 14:43:52.598 [INFO] dmwatcher P0000001054 T0000000000000001062 Clear all ep g_dw_status finished, Recovery finished!
2026-07-10 14:43:52.598 [INFO] dmwatcher P0000001054 T0000000000000001062 switch sub_state to sub_stat_start!
2026-07-10 14:43:52.598 [INFO] dmwatcher P0000001054 T0000000000000001062 Set GRP1 dmwatcher process to OPEN(SUB:STARTUP) status
备服务器log:
tail /opt/dmdbms/log/dm_dmwatcher_DM02_202607.log
...(略)
2026-07-10 14:37:10.687 [INFO] dmwatcher P0000000119 T0000000000000000127 Local apply info, p_db_magic:1620860324, n_apply_ep:1, pkg_seq_arr:[4874, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], apply_lsn_arr:[40085, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]!
2026-07-10 14:37:10.687 [INFO] dmwatcher P0000000119 T0000000000000000127 Remote apply info in ctl, ctl_guid:DM01_5, p_db_magic:1620860324, n_apply_ep:1, pkg_seq_arr:[4874, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], apply_lsn_arr:[40085, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]!
2026-07-10 14:37:10.687 [INFO] dmwatcher P0000000119 T0000000000000000127 Local(DM02) ohis is included in remote(DM01) ohis, and apply info matched, l_m_s_i(6), return act(ACT_KEEP)!
监视器状态:
/opt/dmdbms/bin/dmmonitor /opt/dmdbms/data/DAMENG/dmmonitor.ini
[monitor] 2026-07-10 14:38:13: DMMONITOR[4.0] V8
[monitor] 2026-07-10 14:38:14: DMMONITOR[4.0] IS READY.
[monitor] 2026-07-10 14:38:14:
#--------------------------------------------------------------------------------#
GET MONITOR CONNECT INFO FROM DMWATCHER(DM01), THE FIRST LINE IS SELF INFO.
DW_CONN_TIME MON_CONFIRM MID MON_IP MON_VERSION
2026-07-10 14:38:14 FALSE 384826786 ::ffff:192.168.0.43 DMMONITOR[4.0] V8
#--------------------------------------------------------------------------------#
[monitor] 2026-07-10 14:38:14: Received message from(DM01)
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2026-07-10 14:38:14 OPEN OK DM01 OPEN PRIMARY VALID 5 40484 40484
[monitor] 2026-07-10 14:38:14: Received message from(DM02)
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2026-07-10 14:39:12 OPEN OK DM02 OPEN STANDBY INVALID 4 40085 40085
show
2026-07-10 14:38:18
#================================================================================#
GROUP OGUID MON_CONFIRM MODE MPP_FLAG
GRP1 20200101 FALSE AUTO FALSE
<<DATABASE GLOBAL INFO:>>
DW_IP MAL_DW_PORT WTIME WTYPE WCTLSTAT WSTATUS INAME INST_OK N_EP N_OK ISTATUS IMODE DSC_STATUS RTYPE RSTAT
192.168.0.43 5436 2026-07-10 14:38:17 GLOBAL VALID OPEN DM01 OK 1 1 OPEN PRIMARY DSC_OPEN REALTIME VALID
EP INFO:
INST_IP INST_PORT INST_OK INAME ISTATUS IMODE DSC_SEQNO DSC_CTL_NODE RTYPE RSTAT FSEQ FLSN CSEQ CLSN DW_STAT_FLAG
192.168.0.43 5236 OK DM01 OPEN PRIMARY 0 0 REALTIME VALID 4956 40484 4956 40484 NONE
<<DATABASE GLOBAL INFO:>>
DW_IP MAL_DW_PORT WTIME WTYPE WCTLSTAT WSTATUS INAME INST_OK N_EP N_OK ISTATUS IMODE DSC_STATUS RTYPE RSTAT
192.168.0.17 5436 2026-07-10 14:39:15 GLOBAL VALID OPEN DM02 OK 1 1 OPEN STANDBY DSC_OPEN REALTIME INVALID
EP INFO:
INST_IP INST_PORT INST_OK INAME ISTATUS IMODE DSC_SEQNO DSC_CTL_NODE RTYPE RSTAT FSEQ FLSN CSEQ CLSN DW_STAT_FLAG
192.168.0.17 5236 OK DM02 OPEN STANDBY 0 0 REALTIME INVALID 4874 40085 4874 40085 NONE
DATABASE(DM02) APPLY INFO FROM (DM01), REDOS_PARALLEL_NUM (1), WAIT_APPLY[FALSE]:
DSC_SEQNO[0], (RSEQ, SSEQ, KSEQ)[4874, 4874, 4874], (RLSN, SLSN, KLSN)[40085, 40085, 40085], N_TSK[0], TSK_MEM_USE[0]
REDO_LSN_ARR: (40085)
主服务器添加内容,未同步到备服务器,为啥?

生产就不要用docker了,你这个集群没看到搭建过程啊,后面的监视器看起来备库归档是无效的,你在监视器执行命令看一下:check recover GRP1.DM02