注册
DW主备集群搭建
专栏/技术分享/ 文章详情 /

DW主备集群搭建

夏雨雨雨雨雨 2026/09/18 245 0 0
摘要

DW主备集群搭建

一、主备集群架构

组件 角色与职责
主库(Primary) 对外提供完整的读写服务,是业务访问的主要节点;所有数据修改操作(INSERT/UPDATE/DELETE)都在主库执行,并实时生成Redo日志。
备库(Standby) 接收主库发送的Redo日志并进行重演(Redo Apply),保持与主库的数据同步;可配置为只读模式,承担部分查询业务,实现读写分离。
守护进程(dmwatcher) 部署在每个数据库节点上,监控本机数据库实例的运行状态和主备数据同步情况;负责向其他组件传递状态消息。
监视器(dmmonitor) 集中监控整个集群的状态;当主库故障时,由守护进程上报异常,监视器执行自动切换命令,将备库提升为新主库

注意事项

  1. 实时主备集群依靠MAL链路通信,各个组件之间端口必须互通,ping通IP不等于TCP端口可达。
  2. 确认监视器dmmonitor为自动故障切换必要组件,只启动守护进程无法实现自动切换。
  3. OGUID是集群全局唯一标识,整个主备集群所有节点必须使用同一个OGUID值,本文示例453331,禁止随意修改。

二、主备集群配置

主备集群IP配置一览表:

服务器 实例名 IP 端口号
主库 GRP1_RT_01 192.168.229.181 5236
备库 GRP1_RT_02 192.168.229.180 5236

注意事项

  1. 实例名INSTANCE_NAME主备必须不同,整个集群不能重复;实例名大小写敏感,所有配置文件引用实例名必须保持完全一致。
  2. MAL端口、DW端口规划:61141/61142(MAL_PORT)、52141/52142(MAL_DW_PORT)、33141/33142(MAL_INST_DW_PORT),端口不能被其他服务占用。
  3. 如果服务器多网卡,MAL_HOST务必填写集群内网通信网卡IP,禁止填写127.0.0.1公网IP。
  4. 克隆虚拟机方式部署备库,克隆完成务必修改备库主机IP、主机名,防止IP冲突。

三、主库配置

3.1 dm8数据库安装

dm8数据库软件安装步骤请参看CentOS7环境下达梦DM8数据库里先安装这篇文章

安装好主库后,可以直接克隆一个虚拟机,更改IP地址后,作为备库使用。

3.2 备份主库数据

[dmdba@localhost ~]$cd /home/dmdba/dm/dmdbms/bin [dmdba@localhost ~/dmdbms/bin]$./disql SYSDBA/Sysdba%_025 服务器[LOCALHOST:5236]:处于普通打开状态 登录使用时间 : 18.032(ms) 上次登录ip : ::1 上次登录时间 : 2026-09-07 10:12:23 登录失败次数 : 0 口令是否过期 : 未过期 disql V8 SQL> BACKUP DATABASE BACKUPSET '/dbbak/dmbak/BACKUP_FILE'; 操作已执行 已用时间: 00:00:05.705. 执行号:501. SQL> EXIT;

3.3 修改dmarch.ini

[dmdba@localhost ~/dmdbms/bin]$vi /dbdata/dmdata/DAMENG/dmarch.ini

修改为以下内容:

ARCH_WAIT_APPLY = 0 [ARCHIVE_LOCAL1] ARCH_TYPE = LOCAL ARCH_DEST = /dbarch/dmarch ARCH_FILE_SIZE = 2048 ARCH_SPACE_LIMIT = 40960 [ARCHIVE_REALTIME1] ARCH_TYPE = REALTIME #实时归档类型 ARCH_DEST = GRP1_RT_02 #实时归档目标实例名

注意事项
1、/dbarch/dmarch目录提前创建并授权,目录不存在数据库启动失败。
2、ARCH_DEST填写对端实例名,主库写备库实例名,备库写主库实例名,不是 IP,大小写严格匹配 dm.ini。
3、ARCH_WAIT_APPLY=0,代表异步实时归档;如果设置 1 为同步,业务性能会受备库重演速度影响。

3.4 修改dm.ini

[dmdba@localhost ~/dmdbms/bin]$vi dm.ini

查找并修改以下内容:

INSTANCE_NAME= GRP1_RT_01 DW_INACTIVE_INTERVAL= 60 ALTER_MODE_STATUS= 0 ENABLE_OFFLINE_TS= 2 MAL_INI= 1 RLOG_SEND_APPLY_MON= 64 DW_ARCH_SPACE_CHECK= 1 DW_ARCH_HANG_CHECK= 1

3.5 创建dmmal.ini

[dmdba@localhost ~/dmdbms/bin]$vi /dbdata/dmdata/DAMENG/dmmal.ini

修改为以下内容:

MAL_CHECK_INTERVAL = 5 #MAL链路检测时间间隔 MAL_CONN_FAIL_INTERVAL = 5 #判定MAL链路断开的时间 [MAL_INST1] MAL_INST_NAME = GRP1_RT_01 #实例名,和dm.ini中的INSTANCE_NAME一致 MAL_HOST = 192.168.229.181 #根据实际IP地址配置 MAL_PORT = 61141 #MAL系统监听TCP连接的端口 MAL_INST_HOST = 192.168.229.181 MAL_INST_PORT = 5236 MAL_DW_PORT = 52141 MAL_INST_DW_PORT = 33141 [MAL_INST2] MAL_INST_NAME = GRP1_RT_02 MAL_HOST = 192.168.229.180 MAL_PORT = 61142 MAL_INST_HOST = 192.168.229.180 MAL_INST_PORT = 5236 MAL_DW_PORT = 52142 MAL_INST_DW_PORT = 33142

3.6 创建dmwatcher.ini

[dmdba@localhost ~/dmdbms/bin]$vi /dbdata/dmdata/DAMENG/dmwatcher.ini

修改为以下内容:

[GRP1] DW_TYPE = GLOBAL DW_MODE = AUTO DW_ERROR_TIME = 10 INST_RECOVER_TIME = 60 INST_ERROR_TIME = 10 INST_OGUID = 453331 INST_INI = /home/dmdba/dm/dmdbms/bin/dm.ini INST_AUTO_RESTART = 1 INST_STARTUP_CMD = /home/dmdba/dm/dmdbms/bin/dmserverd start RLOG_SEND_THRESHOLD = 0 RLOG_APPLY_THRESHOLD = 0 DW_RECONNECT = 2 DW_FAILOVER_FORCE = 1 INST_SERVICE_IP_CHECK = 1

3.7 mount方式启动数据库设置数据库模式

窗口1:

[dmdba@localhost ~/dmdbms/bin]$./dmserver dm.ini mount version info: security csek2_vm_t = 9672 nsql_vm_t = 336 prjt2_vm_t = 208 ltid_vm_t = 272 nins2_vm_t = 1160 nset2_vm_t = 272 ndlck_vm_t = 192 ndel2_vm_t = 736 slct2_vm_t = 352 nli2_vm_t = 200 aagr2_vm_t = 312 pscn_vm_t = 416 dist_vm_t = 1000 DM Database Server 64 V8 05134284552-20260414-322369-20221 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 2027-06-25 file lsn: 55765 ndct db load finished, code:100 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 nsvr_startup end. 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] uthr_pipe_create, create pipe[read:18, write:19] uthr_pipe_create, create pipe[read:20, write:21] uthr_pipe_create, create pipe[read:22, write:23] uthr_pipe_create, create pipe[read:24, write:25] uthr_pipe_create, create pipe[read:26, write:27] aud sys init success. aud rt sys init success. systables desc init success. ndct_db_load_info finished, code:100. SYSTEM IS READY.

窗口2:

[dmdba@localhost ~]$cd /home/dmdba/dm/dmdbms/bin [dmdba@localhost ~/dmdbms/bin]$./disql SYSDBA/Sysdba%_025 服务器[LOCALHOST:5236]:处于普通配置状态 登录使用时间 : 4.204(ms) 上次登录ip : ::1 上次登录时间 : 2026-09-07 10:12:23 登录失败次数 : 0 口令是否过期 : 未过期 disql V8 SQL> SP_SET_PARA_VALUE(1,'ALTER_MODE_STATUS',1); DMSQL 过程已成功完成 已用时间: 68.501(毫秒). 执行号:1. SQL> SP_SET_OGUID(453331); DMSQL 过程已成功完成 已用时间: 5.505(毫秒). 执行号:2. SQL> ALTER DATABASE PRIMARY; 操作已执行 已用时间: 20.202(毫秒). 执行号:0. SQL> SP_SET_PARA_VALUE(1,'ALTER_MODE_STATUS',0); DMSQL 过程已成功完成 已用时间: 23.939(毫秒). 执行号:3. SQL> EXIT;

回到窗口1,停掉前台数据库:

[dmdba@localhost ~/dmdbms/bin]$./dmserver dm.ini mount version info: security csek2_vm_t = 9672 nsql_vm_t = 336 prjt2_vm_t = 208 ltid_vm_t = 272 nins2_vm_t = 1160 nset2_vm_t = 272 ndlck_vm_t = 192 ndel2_vm_t = 736 slct2_vm_t = 352 nli2_vm_t = 200 aagr2_vm_t = 312 pscn_vm_t = 416 dist_vm_t = 1000 DM Database Server 64 V8 05134284552-20260414-322369-20221 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 2027-06-25 file lsn: 55765 ndct db load finished, code:100 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 nsvr_startup end. 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] uthr_pipe_create, create pipe[read:18, write:19] uthr_pipe_create, create pipe[read:20, write:21] uthr_pipe_create, create pipe[read:22, write:23] uthr_pipe_create, create pipe[read:24, write:25] uthr_pipe_create, create pipe[read:26, write:27] aud sys init success. aud rt sys init success. systables desc init success. ndct_db_load_info finished, code:100. SYSTEM IS READY. ^CServer is stopping... Sys status is mount, shutdown abort!

ctrl+c可以停掉前台启动的数据库。

3.8 传输备份数据到备库

[dmdba@localhost ~/dmdbms/bin]$cd /dbbak/dmbak/ [dmdba@localhost /dbbak/dmbak]$scp -rp BACKUP_FILE/ root@192.168.229.180:/dbbak/dmbak/ The authenticity of host '192.168.229.180 (192.168.229.180)' can't be established. ECDSA key fingerprint is SHA256:jBne3zjP/ZDT0npiV4wYFqEHI4j6FYI8wC40ElQIP7s. ECDSA key fingerprint is MD5:74:43:d9:02:5a:2a:b3:68:f0:c5:73:d8:7e:9a:0c:a4. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.229.180' (ECDSA) to the list of known hosts. root@192.168.229.180's password: BACKUP_FILE.bak 100% 35MB 104.4MB/s 00:00 BACKUP_FILE_1.bak 100% 21KB 3.5MB/s 00:00 BACKUP_FILE.meta 100% 121KB 45.8MB/s 00:00

3.9 制作数据库守护启动脚本

[dmdba@localhost ~/dmdbms/bin]$pwd /home/dmdba/dm/dmdbms/bin [dmdba@localhost ~/dmdbms/bin]$cp ./service_template/DmWatcherService ./dmwatcherd [dmdba@localhost ~/dmdbms/bin]$vi dmwatcherd #修改内容如下: #INI_PATH=/dbdata/dmdata/DAMENG/dmwatcher.ini #授予执行权限 [dmdba@localhost ~/dmdbms/bin]$chmod +x dmwatcherd

四、备库配置

4.1 dm8数据库安装

步骤同主库

4.2 还原主库备份数据

#还原前需要先停掉备库 [dmdba@localhost ~]$cd /home/dmdba/dm/dmdbms/bin [dmdba@localhost ~/dmdbms/bin]$./dmserverd stop Stopping dmserverd: [ OK [dmdba@localhost ~]$cd /home/dmdba/dm/dmdbms/bin [dmdba@localhost ~/dmdbms/bin]$./dmrman dmrman V8 RMAN> restore database '/home/dmdba/dm/dmdbms/bin/dm.ini' from backupset '/dbbak/dmbak/BACKUP_FILE'; restore database '/home/dmdba/dm/dmdbms/bin/dm.ini' from backupset '/dbbak/dmbak/BACKUP_FILE'; [Percent:100.00%][Speed:0.00M/s][Cost:00:00:02][Remaining:00:00:00] restore successfully. time used: 00:00:02.574 RMAN> recover database '/home/dmdba/dm/dmdbms/bin/dm.ini' from backupset '/dbbak/dmbak/BACKUP_FILE'; recover database '/home/dmdba/dm/dmdbms/bin/dm.ini' from backupset '/dbbak/dmbak/BACKUP_FILE'; [Percent:100.00%][Speed:0.00PKG/s][Cost:00:00:00][Remaining:00:00:00] recover successfully! time used: 00:00:03.266 RMAN> recover database '/home/dmdba/dm/dmdbms/bin/dm.ini' update db_magic; recover database '/home/dmdba/dm/dmdbms/bin/dm.ini' update db_magic; recover successfully! time used: 00:00:01.266 RMAN> exit; time used: 2.238(ms)

4.3 修改dmarch.ini

[dmdba@localhost ~/dmdbms/bin]$vi /dbdata/dmdata/DAMENG/dmarch.ini

修改为以下内容:

ARCH_WAIT_APPLY = 0 [ARCHIVE_LOCAL1] ARCH_TYPE = LOCAL ARCH_DEST = /dbarch/dmarch ARCH_FILE_SIZE = 2048 ARCH_SPACE_LIMIT = 40960 [ARCHIVE_REALTIME1] ARCH_TYPE = REALTIME ARCH_DEST = GRP1_RT_01

4.4 修改dm.ini

[dmdba@localhost ~/dmdbms/bin]$vi /home/dmdba/dm/dmdbms/bin/dm.ini

修改以下内容:

INSTANCE_NAME= GRP1_RT_02 DW_INACTIVE_INTERVAL= 60 ALTER_MODE_STATUS= 0 ENABLE_OFFLINE_TS= 2 MAL_INI= 1 RLOG_SEND_APPLY_MON= 64 DW_ARCH_SPACE_CHECK= 1 DW_ARCH_HANG_CHECK= 1

4.5 创建dmmal.ini

[dmdba@localhost ~/dmdbms/bin]$vi /dbdata/dmdata/DAMENG/dmmal.ini

修改为以下内容:

MAL_CHECK_INTERVAL = 5 #MAL链路检测时间间隔 MAL_CONN_FAIL_INTERVAL = 5 #判定 MAL 链路断开的时间 [MAL_INST1] MAL_INST_NAME = GRP1_RT_01 #实例名,和 dm.ini 中的 INSTANCE_NAME 一致 MAL_HOST = 192.168.229.181 #根据实际IP 地址配置 MAL_PORT = 61141 #MAL 系统监听 TCP 连接的端口 MAL_INST_HOST = 192.168.229.181 #根据实际IP 地址配置 MAL_INST_PORT = 5236 #实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致 MAL_DW_PORT = 52141 #实例本地的守护进程监听 TCP 连接的端口 MAL_INST_DW_PORT = 33141 #实例监听守护进程 TCP 连接的端口 [MAL_INST2] MAL_INST_NAME = GRP1_RT_02 MAL_HOST = 192.168.229.180 #根据实际IP 地址配置 MAL_PORT = 61142 MAL_INST_HOST = 192.168.229.180 #根据实际IP 地址配置 MAL_INST_PORT = 5236 MAL_DW_PORT = 52142 MAL_INST_DW_PORT = 33142

4.6 创建dmwatcher.ini

[dmdba@localhost ~/dmdbms/bin]$vi /dbdata/dmdata/DAMENG/dmwatcher.ini

修改为以下内容:

[GRP1] DW_TYPE = GLOBAL #全局守护类型 DW_MODE = AUTO #MANUAL:故障手切 AUTO:故障自切 DW_ERROR_TIME = 10 #远程守护进程故障认定时间 INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间 INST_ERROR_TIME = 10 #本地实例故障认定时间 INST_OGUID = 453331 #守护系统唯一 OGUID 值 INST_INI = /home/dmdba/dm/dmdbms/bin/dm.ini #dm.ini 配置文件路径 INST_AUTO_RESTART = 1 #打开实例的自动启动功能 INST_STARTUP_CMD =/home/dmdba/dm/dmdbms/bin/dmserverd start #命令行方式启动 RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阈值,默认关闭 RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阈值,默认关闭 DW_RECONNECT = 2 DW_FAILOVER_FORCE = 1 INST_SERVICE_IP_CHECK = 1

4.7 mount方式启动数据库设置数据库模式

窗口1:

[dmdba@localhost ~/dmdbms/bin]$./dmserver dm.ini mount version info: security csek2_vm_t = 9672 nsql_vm_t = 336 prjt2_vm_t = 208 ltid_vm_t = 272 nins2_vm_t = 1160 nset2_vm_t = 272 ndlck_vm_t = 192 ndel2_vm_t = 736 slct2_vm_t = 352 nli2_vm_t = 200 aagr2_vm_t = 312 pscn_vm_t = 416 dist_vm_t = 1000 DM Database Server 64 V8 05134284552-20260414-322369-20221 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 2027-06-25 file lsn: 55725 ndct db load finished, code:100 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 nsvr_startup end. 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] uthr_pipe_create, create pipe[read:18, write:19] uthr_pipe_create, create pipe[read:20, write:21] uthr_pipe_create, create pipe[read:22, write:23] uthr_pipe_create, create pipe[read:24, write:25] uthr_pipe_create, create pipe[read:26, write:27] aud sys init success. aud rt sys init success. systables desc init success. ndct_db_load_info finished, code:100. SYSTEM IS READY.

窗口2:

[dmdba@localhost ~/dmdbms/bin]$pwd /home/dmdba/dm/dmdbms/bin [dmdba@localhost ~/dmdbms/bin]$./disql SYSDBA/SYSDBA%_025 [-2501]:用户名或密码错误. DISQL-10030: 连接恢复失败 DISQL-10030: 连接恢复失败 DISQL-10030: 连接恢复失败 disql V8 用户名:SYSDBA 密码: 服务器[LOCALHOST:5236]:处于普通配置状态 登录使用时间 : 6.560(ms) 上次登录ip : ::1 上次登录时间 : 2026-09-07 10:12:23 登录失败次数 : 0 口令是否过期 : 未过期 SQL> SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1); DMSQL 过程已成功完成 已用时间: 35.708(毫秒). 执行号:1. SQL> sp_set_oguid(453331); DMSQL 过程已成功完成 已用时间: 6.640(毫秒). 执行号:2. SQL> alter database standby; 操作已执行 已用时间: 50.798(毫秒). 执行号:0. SQL> SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0); DMSQL 过程已成功完成 已用时间: 26.215(毫秒). 执行号:3. SQL> exit

回到窗口1,停掉前台数据库:

[dmdba@localhost ~/dmdbms/bin]$./dmserver dm.ini mount version info: security csek2_vm_t = 9672 nsql_vm_t = 336 prjt2_vm_t = 208 ltid_vm_t = 272 nins2_vm_t = 1160 nset2_vm_t = 272 ndlck_vm_t = 192 ndel2_vm_t = 736 slct2_vm_t = 352 nli2_vm_t = 200 aagr2_vm_t = 312 pscn_vm_t = 416 dist_vm_t = 1000 DM Database Server 64 V8 05134284552-20260414-322369-20221 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 2027-06-25 file lsn: 55725 ndct db load finished, code:100 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 nsvr_startup end. 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] uthr_pipe_create, create pipe[read:18, write:19] uthr_pipe_create, create pipe[read:20, write:21] uthr_pipe_create, create pipe[read:22, write:23] uthr_pipe_create, create pipe[read:24, write:25] uthr_pipe_create, create pipe[read:26, write:27] aud sys init success. aud rt sys init success. systables desc init success. ndct_db_load_info finished, code:100. SYSTEM IS READY. ^CServer is stopping... Sys status is mount, shutdown abort!

4.8 制作数据守护启动脚本

[dmdba@localhost ~/dmdbms/bin]$pwd /home/dmdba/dm/dmdbms/bin [dmdba@localhost ~/dmdbms/bin]$cp ./service_template/DmWatcherService ./dmwatcherd [dmdba@localhost ~/dmdbms/bin]$vi dmwatcherd #修改内容如下: #INI_PATH=/dbdata/dmdata/DAMENG/dmwatcher.ini #授予执行权限 [dmdba@localhost ~/dmdbms/bin]$chmod +x dmwatcherd

五、仲裁机配置

这台主备的仲裁机我放在主库上,IP为192.168.229.181。

5.1 创建dmmonitor.ini

[dmdba@localhost ~]$cd /home/dmdba/dm/dmdbms/bin [dmdba@localhost ~/dmdbms/bin]$vi dmmonitor.ini

修改为以下内容:

MON_DW_CONFIRM = 1 #确认监视器模式 MON_LOG_PATH = /home/dmdba/dm/dmdbms/log #监视器日志文件存放路径 MON_LOG_INTERVAL = 60 #每隔 60s 定时记录系统信息到日志文件 MON_LOG_FILE_SIZE = 32 #每个日志文件最大 32M MON_LOG_SPACE_LIMIT = 0 #不限定日志文件总占用空间 [GRP1] MON_INST_OGUID = 453331 #组 GRP1 的唯一 OGUID 值 #以下配置为监视器到组 GRP1 的守护进程的连接信息,以“IP:PORT”的形式配置 #IP 对应 dmmal.ini 中的 MAL_HOST,PORT 对应 dmmal.ini 中的 MAL_DW_PORT MON_DW_IP = 192.168.229.181:52141 MON_DW_IP = 192.168.229.180:52142

5.2 制作监视器启动脚本

[dmdba@localhost ~/dmdbms/bin]$cd /home/dmdba/dm/dmdbms/bin [dmdba@localhost ~/dmdbms/bin]$cp ./service_template/DmWatcherService ./dmmonitord [dmdba@localhost ~/dmdbms/bin]$vi dmmonitord # 修改内容如下: # INI_PATH=/home/dmdba/dm/dmdbms/bin/dmmonitor.ini #授予执行权限 [dmdba@localhost ~/dmdbms/bin]$chmod +x dmmonitord

六、启动主备集群

6.1 启动主库守护进程

[dmdba@localhost ~/dmdbms/bin]$pwd /home/dmdba/dm/dmdbms/bin [dmdba@localhost ~/dmdbms/bin]$./dmwatcherd start Starting dmwatcherd: [ OK ]

6.2 启动备库守护进程

[dmdba@localhost ~/dmdbms/bin]$pwd /home/dmdba/dm/dmdbms/bin [dmdba@localhost ~/dmdbms/bin]$./dmwatcherd start Starting dmwatcherd: [ OK ]

6.3 启动监视器

[dmdba@localhost ~/dmdbms/bin]$./dmmonitord start Starting dmmonitord: [ OK ]

6.4 监视器控制台查看集群状态

[dmdba@localhost ~/dmdbms/bin]$./dmmonitor dmmonitor.ini [monitor] 2026-09-07 13:05:21:046: DMMONITOR[4.0] V8 [monitor] 2026-09-07 13:05:21:062: DMMONITOR[4.0] IS READY. [monitor] 2026-09-07 13:05:21:066: #-----------------------------------------------------------------------------------------------# GET MONITOR CONNECT INFO FROM DMWATCHER(GRP1_RT_02), THE FIRST LINE IS SELF INFO. DW_CONN_TIME MON_CONFIRM MID MON_IP MON_VERSION 2026-09-07 13:05:21 TRUE 1883169916 ::ffff:192.168.229.181 DMMONITOR[4.0] V8 #-----------------------------------------------------------------------------------------------# [monitor] 2026-09-07 13:05:21:068: 收到守护进程(GRP1_RT_02)消息 WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN 2026-09-07 13:05:21 OPEN OK GRP1_RT_02 OPEN STANDBY NULL 5 55810 55810 [monitor] 2026-09-07 13:05:21:072: 收到守护进程(GRP1_RT_01)消息 WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN 2026-09-07 13:05:21 OPEN OK GRP1_RT_01 OPEN PRIMARY VALID 5 55810 55810 show 2026-09-07 13:05:26 #================================================================================# GROUP OGUID MON_CONFIRM MODE MPP_FLAG GRP1 453331 TRUE 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 DETACHED AUTO_MODE_CHANGE 192.168.229.181 52141 2026-09-07 13:05:26 GLOBAL VALID OPEN GRP1_RT_01 OK 1 1 OPEN PRIMARY DSC_OPEN REALTIME VALID FALSE OFF 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.229.181 5236 OK GRP1_RT_01 OPEN PRIMARY 0 0 REALTIME VALID 3237 55810 3237 55810 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 DETACHED AUTO_MODE_CHANGE 192.168.229.180 52142 2026-09-07 13:05:26 GLOBAL VALID OPEN GRP1_RT_02 OK 1 1 OPEN STANDBY DSC_OPEN REALTIME VALID FALSE OFF 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.229.180 5236 OK GRP1_RT_02 OPEN STANDBY 0 0 REALTIME VALID 3236 55810 3236 55810 NONE DATABASE(GRP1_RT_02) APPLY INFO FROM (GRP1_RT_01), REDOS_PARALLEL_NUM (11), WAIT_APPLY[FALSE]: DSC_SEQNO[0], (RSEQ, SSEQ, KSEQ)[3236, 3236, 3237], (RLSN, SLSN, KLSN)[55810, 55810, 55810], N_TSK[0], TSK_MEM_USE[4096] #================================================================================#

注意事项
1、执行show查看集群状态,关键校验:
主库IMODE=PRIMARY,备库IMODE=STANDBY
RSTAT 状态为VALID代表实时归档链路正常;INVALID 代表同步异常
MON_CONFIRM=TRUE确认监视器正常生效
FLSN 与 CLSN 主备数值相等,代表日志完全同步
2、如果 RSTAT 为 INVALID,立刻排查网络端口、dmarch.ini 实例名、dmmal.ini 配置。
3、集群关闭顺序:先关闭监视器 dmmonitord,再分别关闭两台 dmwatcherd 守护进程。

成功搭建主备集群!

七、集群搭建常见问题与排查

本套主备集群大量依赖 MAL 链路、数据守护网络、归档网络,网络 IP 通信问题是搭建失败最高发的一类问题。MAL、dmwatcher、dmmonitor 之间全部依靠 TCP 网络通信,任意端口、防火墙、IP 配置错误,都会导致集群状态异常:备库同步失效、监视器看不到节点、守护进程反复重启、无法自动切换、RSTAT 为 INVALID 等现象。

7.1 IP 与网络通信类问题(重点)

集群涉及全部端口清单:

用途 端口
数据库业务端口 5236
MAL 通信端口 MAL_PORT:61141、61142
守护进程对外通信端口 MAL_DW_PORT:52141、52142
实例和守护进程内部通信 MAL_INST_DW_PORT:33141、33142

ping 通 IP 不能代表集群可用,MAL、守护进程使用 TCP 端口;防火墙放行 ICMP (ping) 但是拦截业务 TCP 端口时,ping 依旧可以通,但集群通信直接失败。

现象 1:监视器 dmmonitor 启动后只能看到其中一个节点,另外一个节点缺失

现象表现

  1. dmmonitor 控制台 show 只显示主库,看不到备库,或者只看到备库看不到主库;
  2. dmwatcherd 进程状态显示 OK,监视器日志报连接守护进程超时;
  3. RSTAT 状态为INVALID,实时归档状态无效,主备之间无法同步 Redo 日志。

根因

  1. 防火墙 firewalld/iptables 未开放上面列表端口;SELinux 开启未做策略放行,跨主机 TCP 数据包被丢弃。
  2. dmmal.ini配置 IP 错误:克隆虚拟机后备库 dmmal.ini 未修改,仍然保留主库 IP;MAL_HOST 填写 127.0.0.1 或者其他不可达网卡 IP;主备两台机器 dmmal.ini 内容必须完全一致。
  3. dmmonitor.ini中MON_DW_IP填写错误:格式为IP:MAL_DW_PORT;IP 取自 dmmal.ini 的 MAL_HOST,端口必须是 MAL_DW_PORT (52141/52142),禁止写 5236 或者 61141。
#错误示例
MON_DW_IP = 192.168.229.181:5236
#正确示例
MON_DW_IP = 192.168.229.181:52141
MON_DW_IP = 192.168.229.180:52142
  1. 主机名解析异常,/etc/hosts没有配置,DNS 解析失败。
  2. 网络单向通:A 节点可以访问 B,B 节点无法回访问 A。

排查命令

#1.基础IP连通 ping 192.168.229.181 ping 192.168.229.180 #2.TCP端口连通测试,无telnet用nc nc -zv 192.168.229.181 61141 nc -zv 192.168.229.181 52141 nc -zv 192.168.229.180 61142 nc -zv 192.168.229.180 52142 #3.临时关闭防火墙、selinux做验证(生产不要直接关闭,添加放行规则) systemctl stop firewalld setenforce 0

排查步骤:核对两边 dmmal.ini 全部 IP 端口;核对 dmmonitor.ini MON_DW_IP;检查 /etc/hosts;测试全部 TCP 端口连通性。

现象 2:守护进程 dmwatcherd 启动成功,日志报mal connect failed MAL 链路连接失败

日志路径:/home/dmdba/dm/dmdbms/log/dmwatcher.log

  1. 检查端口是否被其他进程占用
netstat -tulnp | grep 6114
  1. 检查dm.ini的INSTANCE_NAME与 dmmal.ini 中MAL_INST_NAME严格一致,大小写敏感。

现象 3:监视器 show 命令 RSTAT=INVALID 实时归档无效

  1. MAL 链路网络端口不通,参考上面网络排查;
  2. dmarch.ini中ARCH_DEST实例名写错;

主库 ARCH_DEST=GRP1_RT_02;备库 ARCH_DEST=GRP1_RT_01;实例名大小写要和 dm.ini INSTANCE_NAME 完全匹配。

7.2 备份还原相关问题

现象 1:rman 还原之后忘记执行 recover database update db_magic;

现象:备库启动无法加入集群,数据库 open 报错,守护进程反复拉起、重启数据库实例。

重点:备库 restore 还原备份集后,必须执行 update db_magic,否则 db_magic 和主库一致,无法建立实时归档。

现象 2:scp 传输备份集后 rman 读取备份集报权限拒绝

使用 root 账号 scp 传输备份文件,备份集文件属主为 root,dmdba 无读取权限。 备库执行授权:

chown -R dmdba:dmdba /dbbak/dmbak/

7.3 配置文件路径类坑(高频)

  1. dmwatcherd 脚本内INI_PATH路径错误,指向不存在的 dmwatcher.ini 脚本配置:INI_PATH=/dbdata/dmdata/DAMENG/dmwatcher.ini; 即使 dmwatcherd 进程启动成功,如果 ini 路径写错,守护进程不会加载集群配置,集群完全不生效,查看 dmwatcher.log 确认实际读取 ini 路径。
  2. dmwatcher.ini参数INST_INI路径错误,必须填写 dm.ini 完整绝对路径
INST_INI = /home/dmdba/dm/dmdbms/bin/dm.ini
  1. mount 模式修改主备模式忘记操作ALTER_MODE_STATUS mount 状态修改 primary/standby 前,执行SP_SET_PARA_VALUE(1,'ALTER_MODE_STATUS',1);,修改完成执行SP_SET_PARA_VALUE(1,'ALTER_MODE_STATUS',0);;忘记关闭会导致数据库 open 阶段报错。

7.4 目录缺失问题

主备两台服务器均需要提前创建归档目录并授权,否则数据库启动失败

mkdir -p /dbarch/dmarch chown -R dmdba:dmdba /dbarch

7.5 确认监视器模式问题 MON_DW_CONFIRM=1

dmmonitor.ini配置MON_DW_CONFIRM =1代表确认监视器模式。

关键点:DW_MODE=AUTO 自动切换模式下,必须启动确认监视器,集群才会执行故障自动切换。只启动 dmwatcherd,不启动 dmmonitord,即使主库宕机,备库也不会自动升主。

现象:模拟主库宕机,集群不自动切换。 排查:确认 dmmonitord 已正常启动;控制台 show 输出MON_CONFIRM=TRUE。

7.6 模拟故障测试注意事项

  1. 测试自动故障切换,需要杀掉dmserver 数据库实例,不能只杀掉 dmwatcherd;守护进程检测 dmserver 实例故障后上报监视器执行切换。
  2. 故障切换完成,旧主库重新启动,会自动变为备库;如果旧主库 dmarch.ini、dmmal.ini 被改动,会导致无法重新加入集群。

7.7 集群日志查看(排错通用)

优先查看下面日志定位问题

  1. 数据库实例日志:/home/dmdba/dm/dmdbms/log/dm_*.log
  2. 守护进程日志:/home/dmdba/dm/dmdbms/log/dmwatcher.log
  3. 监视器日志:/home/dmdba/dm/dmdbms/log/dmmonitor.log
#实时跟踪守护进程日志 tail -f /home/dmdba/dm/dmdbms/log/dmwatcher.log

7.8 故障现象速查表

现象 优先排查点
监视器看不到部分节点 防火墙端口放行;MON_DW_IP 端口是否 MAL_DW_PORT;核对 dmmal.ini IP
RSTAT=INVALID 实时归档无效 MAL 链路 TCP 端口;dmarch.ini ARCH_DEST 实例名;INSTANCE_NAME
守护进程启动,集群完全不生效 dmwatcherd 脚本 INI_PATH;dmwatcher.ini 中 INST_INI 路径
备库无法 open,守护反复重启 还原是否执行 update db_magic;归档目录是否存在;文件目录权限
主库宕机不自动切换 确认监视器 dmmonitor 是否启动;MON_DW_CONFIRM=1;DW_MODE=AUTO
mount 状态 disql 登录报错 mount 状态优先本地登录;核对 ALTER_MODE_STATUS 修改流程
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服