注册
DM8主备切换测试
技术分享/ 文章详情 /

DM8主备切换测试

Kira 2026/07/31 231 0 0

1. 手动主备切换测试:Switchover

1.1 切换前写入一条测试数据

连接当前主库 5236

/opt/dmdbms/dmhome/bin/disql SYSDBA/<你的密码>@127.0.0.1:5236

使用表 T_DW_TEST ,直接插入:

INSERT INTO T_DW_TEST VALUES(10, 'BEFORE_SWITCH_01_PRIMARY');
COMMIT;
SELECT * FROM T_DW_TEST;
EXIT;

image.png

连接当前备库 5237 查询,确认同步正常:

/opt/dmdbms/dmhome/bin/disql SYSDBA/<你的密码>@127.0.0.1:5237
SELECT * FROM T_DW_TEST;
EXIT;

image.png

1.2 在监视器中执行手动切换

启动非确认监视器:

/opt/dmdbms/dmhome/bin/dmmonitor /opt/dmdbms/dmhome/bin/dmmonitor_manual.ini

在监视器中执行:

show global info
tip
login

image.png

登录后执行:

choose switchover GRP1

若返回 GRP1_RT_02 可切换,则执行:

switchover GRP1.GRP1_RT_02

image.png
image.png

如果只有一个守护组、一个备库,文档允许省略组名或库名;但这里建议显式写完整,避免误操作。 choose switchover 会选出允许切换为 PRIMARY 的备库列表,随后 switchover [group_name[.]] [db_name] 执行切换。

1.3 验证切换结果

继续在监视器中执行:

show global info
tip
show arch send info GRP1_RT_01

image.png
期望结果变成:

GRP1_RT_02  PRIMARY
GRP1_RT_01  STANDBY

这里 show arch send info GRP1_RT_01 是因为切换后 GRP1_RT_01 成了新备库,需要看新主库到它的归档同步状态。该命令用于显示源库到指定备库的日志发送信息,包含 MAL STATUSARCH STATUS 等字段。

1.4 在新主库写入,再到新备库查询

连接新主库 5237

/opt/dmdbms/dmhome/bin/disql SYSDBA/<你的密码>@127.0.0.1:5237
INSERT INTO T_DW_TEST VALUES(11, 'AFTER_SWITCH_02_PRIMARY');
COMMIT;
SELECT * FROM T_DW_TEST;
EXIT;

image.png
连接新备库 5236

/opt/dmdbms/dmhome/bin/disql SYSDBA/<你的密码>@127.0.0.1:5236
SELECT * FROM T_DW_TEST;
EXIT;

能查到 AFTER_SWITCH_02_PRIMARY,说明手动切换后,新主到新备同步正常。

image.png

1.5 手动切回原主库

监视器中执行:

show global info
tip
login
choose switchover GRP1
switchover GRP1.GRP1_RT_01
show global info
tip
show arch send info GRP1_RT_02

期望恢复为:

GRP1_RT_01  PRIMARY
GRP1_RT_02  STANDBY

image.png

2. 自动切换测试:Auto Takeover

这里测试的是主库故障后,备库自动接管为主库。注意这不是 switchover,而是故障场景下的自动 takeover。DM故障自动切换模式下,主库故障后,确认监视器会捕获故障信息,自动选择可接管备库并通知其接管,无需用户手动执行 takeover

2.1 新建确认监视器配置

另建一个确认监视器配置文件:

cd /opt/dmdbms/dmhome/bin

cp dmmonitor_manual.ini dmmonitor_confirm.ini

vi dmmonitor_confirm.ini

内容按照现有文件只改确认模式和日志目录:

MON_DW_CONFIRM             = 1
MON_LOG_PATH               = /opt/dmdbms/data/monitor_confirm_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.200.192:5436
MON_DW_IP                  = 192.168.200.192:5437

MON_DW_IP 的端口仍然用环境中的 MAL 守护进程端口:主库 5436、备库 5437MON_DW_CONFIRM=0 是普通监视器,MON_DW_CONFIRM=1 是确认监视器,并且故障自动切换模式下必须配置确认监视器。

创建日志目录:

mkdir -p /opt/dmdbms/data/monitor_confirm_log

2.2 启动确认监视器

/opt/dmdbms/dmhome/bin/dmmonitor /opt/dmdbms/dmhome/bin/dmmonitor_confirm.ini

image.png

进入后检查:

show global info
show
tip
show monitor GRP1.GRP1_RT_01
show monitor GRP1.GRP1_RT_02
show arch send info GRP1_RT_02

image.png

重点确认:

MON_CONFIRM  TRUE
MODE         AUTO
GRP1_RT_01   PRIMARY   Open/OK
GRP1_RT_02   STANDBY   Open/OK
ARCH STATUS  VALID

官方文档给出的 show global info 字段中,MON_CONFIRM 表示监视器是否确认模式,MODE 表示当前切换模式,IMODE 表示数据库模式,ISTATUS 表示数据库状态。

2.3 写入自动切换前测试数据

连接当前主库 5236

/opt/dmdbms/dmhome/bin/disql SYSDBA/<你的密码>@127.0.0.1:5236
INSERT INTO T_DW_TEST VALUES(20, 'BEFORE_AUTO_TAKEOVER_01_PRIMARY');
COMMIT;
SELECT * FROM T_DW_TEST;
EXIT;

image.png

连接备库 5237

/opt/dmdbms/dmhome/bin/disql SYSDBA/<你的密码>@127.0.0.1:5237
SELECT * FROM T_DW_TEST;
EXIT;

image.png

2.4 模拟主库故障

现在的环境是单机双实例,所以不能通过“整机宕机”验证真正的物理主机高可用;一旦这台机器宕机,主库、备库和监视器都会一起不可用。

在实验环境中,可以模拟 GRP1_RT_01 这一侧不可用。另开一个 shell,先找主库 watcher 和主库 dmserver 进程:

ps -ef | grep -E "dmwatcher.*/opt/dmdbms/data/DAMENG/dmwatcher.ini|dmserver.*/opt/dmdbms/data/DAMENG/dm.ini" | grep -v grep

确认是 GRP1_RT_01 对应的 /opt/dmdbms/data/DAMENG 路径后,执行:

kill -9 <GRP1_RT_01_watcher_pid> <GRP1_RT_01_dmserver_pid>

image.png

2.5 观察自动接管

回到确认监视器窗口,观察输出,或反复执行:

show global info
tip
show arch send info GRP1_RT_01

image.png

我的DW_ERROR_TIMEINST_ERROR_TIME 都配置为 20,所以故障判定不会是瞬时的。

自动接管成功后,预期状态应变为:

GRP1_RT_02  PRIMARY
GRP1_RT_01  Error / Shutdown / Startup

image.png

也就是说,5237 成为新主库。主库故障、备库接管流程会通知备库 Mount、切换为 PRIMARY、将新主库 Open,并将守护进程切换回 Open 状态。

2.6 在新主库验证写入

连接 5237

/opt/dmdbms/dmhome/bin/disql SYSDBA/<你的密码>@127.0.0.1:5237
INSERT INTO T_DW_TEST VALUES(21, 'AFTER_AUTO_TAKEOVER_02_PRIMARY');
COMMIT;
SELECT * FROM T_DW_TEST;
EXIT;

image.png
此时 5236 被模拟故障杀掉,先不要强行打开它。

2.7 恢复原主库并让它作为备库加入

重新启动原主库 watcher:

/opt/dmdbms/dmhome/bin/DmWatcherServiceGRP1_RT_01 start

image.png

因为配置了 INST_AUTO_RESTART=1,实例应由 watcher 自动拉起;守护进程监控实例,超过 INST_ERROR_TIME 未收到实例消息会认定实例故障,若配置自动重启则会拉起实例。

在确认监视器中检查:

show global info
show
tip
check recover GRP1_RT_01
show arch send info GRP1_RT_01

期望最终状态:

GRP1_RT_02  PRIMARY
GRP1_RT_01  STANDBY
ARCH STATUS VALID

image.png

主库故障重启后,守护进程会根据 Open 记录、LSN、模式和状态判断恢复策略,可能将原主库改为 STANDBY 后重新加入;如果备库未自动恢复,可以用 check recover 查看不满足恢复条件的原因。

2.8 自动切换后回切到原主库

GRP1_RT_01 已经稳定为 STANDBY,且 ARCH STATUS=VALID 后,再做计划内回切:

/opt/dmdbms/dmhome/bin/dmmonitor /opt/dmdbms/dmhome/bin/dmmonitor_manual.ini

监视器中执行:

show global info
tip
login
choose switchover GRP1
switchover GRP1.GRP1_RT_01
show global info
tip
show arch send info GRP1_RT_02

回切成功后:

GRP1_RT_01  PRIMARY
GRP1_RT_02  STANDBY

image.png

3. 总结与注意事项

本次测试分别验证了达梦数据守护环境中的手动主备切换(Switchover)主库故障后的自动接管(Auto Takeover)。手动切换适用于系统维护、演练和计划内回切,执行前应确保主库、备库均处于正常 Open/OK 状态,并通过 choose switchover 确认目标备库具备切换条件。自动接管用于主库异常场景,需要启用确认监视器,并确保守护进程、实例自动重启、故障判定时间及归档同步等配置正确。

测试过程中,应重点关注以下事项:

  1. 切换前必须确认数据同步正常。
    应通过测试表写入、备库查询以及 show arch send info 等命令,确认归档状态为 VALID,避免在数据未同步完成时执行切换。
  2. 计划内切换优先使用 switchover
    不应将受控维护场景与故障接管混淆。switchover 适用于主备均正常的情况,自动 takeover 适用于主库故障场景。
  3. 谨慎使用强制接管。
    takeover force 可能绕过部分一致性检查,存在数据丢失、双主或脑裂风险,除非已确认原主库不可恢复且具备完整处置方案,否则不建议使用。
  4. 确认监视器应独立、持续运行。
    自动故障切换依赖确认监视器完成故障确认和接管决策。生产环境中,确认监视器不应与主、备数据库部署在同一台物理主机上,否则主机故障时可能同时失效。
  5. 故障恢复后不要立即回切。
    原主库重新启动后,应先确认其已作为 STANDBY 稳定加入守护组,检查日志追平、归档状态和数据一致性,待状态完全正常后再执行计划内回切。

最终验收标准应包括:主备角色符合预期、数据库实例均处于正常状态、归档同步有效、切换前后测试数据完整、应用连接能够恢复,以及原主库能够重新作为备库加入并完成计划内回切。

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服