实验环境
本地的虚拟机环境,2个节点。
初始环境:节点1 是主库,节点2是备库。monitor在节点2上。
本实验中模拟了4个场景
场景一:monitor 和 备库服务器同时挂掉
场景二:monitor 存活,备库服务器挂掉
场景三:monitor 和 主库服务器挂掉
场景四:monitor存活,主库服务器挂掉
当前情况 节点1 主库 , 节点2 备库。 monitor 在节点2上。直接停掉备库服务器。模拟 monitor和备库同时挂掉。
这时,节点1 的主库 状态会变为 SUSPEND PRIMARY。主库可以查询,但是插入数据时会出现卡住。并且也查询不到插入的数据。
SQL> select status$ from v$instance;
Server[LOCALHOST:5236]:mode is primary, state is suspend
connected
LINEID STATUS$
---------- -------
1 SUSPEND
SQL> select * from test_table;
LINEID ID
---------- -----------
1 1
used time: 3.411(ms). Execute id is 13700.
SQL> insert into test_table values (5);
affect rows 1
used time: 3.404(ms). Execute id is 13701.
SQL> commit;
^[[3~^H^C
Server[LOCALHOST:5236]:mode is primary, state is suspend
connected
executed successfully
used time: 1.874(ms). Execute id is 13800.
SQL> SQL> SQL> SQL>
SQL>
SQL> select * from test_table
2 ;
LINEID ID
---------- -----------
1 1
在节点1 中 使用 disql 执行
SQL> sp_set_para_value(1,'ALTER_MODE_STATUS',1);
SQL> alter database open force;
但是 节点1 的主库状态没有变化,并不能强制打开主库。
解决方案:
需要启动一个非确认监视器,手动的将节点1 主库变为open状态
dmmonitor /dm8/dmdbms/bin/dmmonitor_manual.ini
login
open database grp1.grp1_rt_01
强制 节点1 的数据库。这时 节点1 的数据库状态变为 open。
并且 之前在 SUSPEND 状态中 提交的数据,可以再open状态下查询到。
然后 正常启动节点2 的 DmWatcherServiceWatcher 和 DmServiceGRP1_RT_02 。
通过monitor 可以看到
[monitor] 2026-08-04 01:24:05:627: Received message from(GRP1_RT_02)
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2026-08-04 01:24:05 OPEN OK GRP1_RT_02 OPEN STANDBY NULL 10 60373 60373
[monitor] 2026-08-04 01:24:05:628: Received message from(GRP1_RT_01)
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2026-08-04 01:24:05 OPEN OK GRP1_RT_01 OPEN PRIMARY VALID 10 60373 60373
2个节点的状态都是正常了,主备集群的同步也是正常的。之前主库 SUSPEND 这个状态下插入的数据。在备库都能看到
SQL> select * from test_table;
LINEID ID
---------- -----------
1 1
2 2
3 5
节点1 主库, 节点2备库,monitor在节点2上,
模拟故障情况,直接 杀掉 节点2 的 watch 和 dms 进程,观察现象。
[dmdba@dm8ha2 ~]$ ps -ef | grep dmw
dmdba 2099 1 0 01:21 pts/0 00:00:01 /dm8/dmdbms/bin/dmwatcher path=/dm8/dmdbms/data/DAMENG/dmwatcher.ini -noconsole
dmdba 2332 2005 0 01:41 pts/0 00:00:00 grep --color=auto dmw
[dmdba@dm8ha2 ~]$ ps -ef | grep dms
dmdba 2124 1 0 01:21 ? 00:00:05 /dm8/dmdbms/bin/dmserver /dm8/dmdbms/data/DAMENG/dm.ini mount
dmdba 2334 2005 0 01:41 pts/0 00:00:00 grep --color=auto dms
kill -9 2099 2124
通过monitor观察
show
2026-08-04 01:43:35
#================================================================================#
GROUP OGUID MON_CONFIRM MODE MPP_FLAG
GRP1 45331 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 DETACHED AUTO_MODE_CHANGE
192.168.88.101 5436 2026-08-04 01:43:34 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.182.101 5236 OK GRP1_RT_01 OPEN PRIMARY 0 0 REALTIME VALID 3503 60380 3503 60380 NONE
#================================================================================#
[monitor] 2026-08-04 01:44:01:615: Dmwatcher process GRP1_RT_01 status switching [OPEN-->STARTUP]
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2026-08-04 01:44:01 STARTUP OK GRP1_RT_01 SUSPEND PRIMARY VALID 10 60380 60382
[monitor] 2026-08-04 01:44:02:515: Dmwatcher process GRP1_RT_01 status switching [STARTUP-->MON CONFIRM]
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2026-08-04 01:44:02 MON CONFIRM OK GRP1_RT_01 SUSPEND PRIMARY VALID 10 60380 60384
[monitor] 2026-08-04 01:44:03:239: Dmwatcher process GRP1_RT_01 status switching [MON CONFIRM-->FAILOVER]
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2026-08-04 01:44:03 FAILOVER OK GRP1_RT_01 SUSPEND PRIMARY VALID 10 60380 60384
[monitor] 2026-08-04 01:44:05:519: Dmwatcher process GRP1_RT_01 status switching [FAILOVER-->OPEN]
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2026-08-04 01:44:05 OPEN OK GRP1_RT_01 OPEN PRIMARY VALID 10 60385 60385
show
2026-08-04 01:44:14
#================================================================================#
GROUP OGUID MON_CONFIRM MODE MPP_FLAG
GRP1 45331 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 DETACHED AUTO_MODE_CHANGE
192.168.88.101 5436 2026-08-04 01:44:14 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.182.101 5236 OK GRP1_RT_01 OPEN PRIMARY 0 0 REALTIME VALID 3506 60385 3506 60385 NONE
#================================================================================#
刚kill掉进程后
(2026-08-04 01:43:34)节点1 的主库是正常open状态
2026-08-04 01:44:01:615 节点1 [OPEN–>STARTUP] 启动到 SUSPEND 状态
2026-08-04 01:44:02:515 节点1[STARTUP–>MON CONFIRM] SUSPEND 状态
2026-08-04 01:44:03:239 节点1[MON CONFIRM–>FAILOVER] SUSPEND 状态
2026-08-04 01:44:05:519 节点1[FAILOVER–>OPEN] open 状态
说明在monitor存活的状态,可以自动的启动节点1 数据库从 suspend状态到open状态。
在节点1 上 执行 disql 也可以看到,插入数据时 会有短暂的卡顿,之后就正常commit;提交了。
然后在节点2 上 启动 DmWatcherServiceWatcher ,节点2 的备库 直接加入了 集群,主备正常了
#-----------------------------------------------------------------------------------------------#
[monitor] 2026-08-04 01:55:56:012: Received message from(GRP1_RT_02)
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2026-08-04 01:55:56 OPEN OK GRP1_RT_02 OPEN STANDBY NULL 10 60385 60385
[monitor] 2026-08-04 01:55:56:013: Received message from(GRP1_RT_01)
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2026-08-04 01:55:55 OPEN OK GRP1_RT_01 OPEN PRIMARY VALID 10 60385 60385
在备库上查看数据,故障期间插入的数据同步过来了。
SQL> select * from test_table;
LINEID ID
---------- -----------
1 1
2 2
3 5
4 7
先对 主备库做 switchover ,主库和 monitor 都在节点2上,备库在节点1 上。
做switchover时,连接主库的disql会话没有关闭。观察到。switchover后disql的会话没有报错和退出,如果再次执行命令,它是自动的重连了数据库,以standby身份登入了数据库做查询。
模拟故障 同时停掉 monitor 、watcher、dbserver进程
[dmdba@dm8ha2 ~]$ ps -ef | grep dms
dmdba 2404 1 0 01:55 ? 00:00:13 /dm8/dmdbms/bin/dmserver /dm8/dmdbms/data/DAMENG/dm.ini mount
dmdba 2626 2005 0 02:51 pts/0 00:00:00 grep --color=auto dms
[dmdba@dm8ha2 ~]$ ps -ef | grep dmw
dmdba 2379 1 0 01:55 pts/0 00:00:03 /dm8/dmdbms/bin/dmwatcher path=/dm8/dmdbms/data/DAMENG/dmwatcher.ini -noconsole
dmdba 2628 2005 0 02:51 pts/0 00:00:00 grep --color=auto dmw
[dmdba@dm8ha2 ~]$ ps -ef | grep dmm
dmdba 973 1 0 01:02 ? 00:00:06 /dm8/dmdbms/bin/dmmonitor path=/dm8/dmdbms/bin/dmmonitor.ini
dmdba 2630 2005 0 02:51 pts/0 00:00:00 grep --color=auto dmm
kill -9 973 2404 2379
观察备库和非确认monitor状态
备库会保持在 STANDBY 状态,非确认监控器可以看到 备库是正常的。
#-----------------------------------------------------------------------------------------------#
GET MONITOR CONNECT INFO FROM DMWATCHER(GRP1_RT_01), THE FIRST LINE IS SELF INFO.
DW_CONN_TIME MON_CONFIRM MID MON_IP MON_VERSION
2026-08-04 02:53:33 FALSE 1777843354 ::ffff:192.168.88.102 DMMONITOR[4.0] V8
#-----------------------------------------------------------------------------------------------#
[monitor] 2026-08-04 02:53:33:332: Received message from(GRP1_RT_01)
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2026-08-04 02:53:33 OPEN OK GRP1_RT_01 OPEN STANDBY NULL 11 60438 60438
但备库不会自动变为主库。
在非确认监视器上执行 takeover是不起作用的。需要使用 takeover force。
choose takeover
no database can do takeover!
takeover force
Be careful to do so, this operation may cause data split, continue to do TAKEOVER FORCE with GRP1.GRP1_RT_01 or not(YES/NO/Y/N)?
y
[monitor] 2026-08-04 03:05:10:163: Start to takeover use instance GRP1_RT_01
[monitor] 2026-08-04 03:05:10:164: Notify dmwatcher(GRP1_RT_01) switch to TAKEOVER status
[monitor] 2026-08-04 03:05:10:166: Dmwatcher process GRP1_RT_01 status switching [OPEN-->TAKEOVER]
[monitor] 2026-08-04 03:05:10:267: Switch dmwatcher GRP1_RT_01 to TAKEOVER status success
[monitor] 2026-08-04 03:05:10:270: Instance GRP1_RT_01 start to execute sql SP_SET_GLOBAL_DW_STATUS(0, 7)
[monitor] 2026-08-04 03:05:10:321: Instance GRP1_RT_01 execute sql SP_SET_GLOBAL_DW_STATUS(0, 7) success
[monitor] 2026-08-04 03:05:10:322: Instance GRP1_RT_01 start to execute sql SP_APPLY_KEEP_PKG()
[monitor] 2026-08-04 03:05:10:373: Instance GRP1_RT_01 execute sql SP_APPLY_KEEP_PKG() success
[monitor] 2026-08-04 03:05:10:374: Instance GRP1_RT_01 start to execute sql ALTER DATABASE MOUNT
[monitor] 2026-08-04 03:05:10:427: Instance GRP1_RT_01 execute sql ALTER DATABASE MOUNT success
[monitor] 2026-08-04 03:05:10:427: Instance GRP1_RT_01 start to execute sql ALTER DATABASE PRIMARY
[monitor] 2026-08-04 03:05:10:478: Instance GRP1_RT_01 execute sql ALTER DATABASE PRIMARY success
[monitor] 2026-08-04 03:05:10:478: Notify instance GRP1_RT_01 to change all arch status to be invalid
[monitor] 2026-08-04 03:05:10:530: Succeed to change all instances arch status to be invalid
[monitor] 2026-08-04 03:05:10:531: Instance GRP1_RT_01 start to execute sql ALTER DATABASE OPEN FORCE
[monitor] 2026-08-04 03:05:10:682: Instance GRP1_RT_01 execute sql ALTER DATABASE OPEN FORCE success
[monitor] 2026-08-04 03:05:10:683: Instance GRP1_RT_01 start to execute sql SP_SET_GLOBAL_DW_STATUS(7, 0)
[monitor] 2026-08-04 03:05:10:734: Instance GRP1_RT_01 execute sql SP_SET_GLOBAL_DW_STATUS(7, 0) success
[monitor] 2026-08-04 03:05:10:735: Notify dmwatcher(GRP1_RT_01) switch to OPEN status
[monitor] 2026-08-04 03:05:10:737: Dmwatcher process GRP1_RT_01 status switching [TAKEOVER-->OPEN]
[monitor] 2026-08-04 03:05:10:837: Switch dmwatcher GRP1_RT_01 to OPEN status success
[monitor] 2026-08-04 03:05:10:838: Notify group(GRP1)'s dmwatcher to do clear
[monitor] 2026-08-04 03:05:10:892: Clean request of dmwatcher processer GRP1_RT_01 success
[monitor] 2026-08-04 03:05:10:892: Success to takeover use instance GRP1_RT_01
2026-08-04 03:05:10
#================================================================================#
GROUP OGUID MON_CONFIRM MODE MPP_FLAG
GRP1 45331 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 DETACHED AUTO_MODE_CHANGE
192.168.88.101 5436 2026-08-04 03:05:10 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.182.101 5236 OK GRP1_RT_01 OPEN PRIMARY 0 0 REALTIME VALID 3513 60480 3513 60480 NONE
#===============================================================================#
这时 原来的备库 变为主库,插入了一条数据,看下 原主库恢复后能否同步数据。
原主库的 monitor 、watch、和数据库服务 启动后,原主库直接变为了备库。
#-----------------------------------------------------------------------------------------------#
[monitor] 2026-08-04 03:10:02:294: Received message from(GRP1_RT_02)
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2026-08-04 03:10:02 OPEN OK GRP1_RT_02 OPEN STANDBY NULL 12 60488 60488
[monitor] 2026-08-04 03:10:02:295: Received message from(GRP1_RT_01)
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2026-08-04 03:10:02 OPEN OK GRP1_RT_01 OPEN PRIMARY VALID 12 60488 60488
再查看测试表中的数据,可以看到 故障期间 在新的主库中插入的数据同步到了 新的备库。
SQL> select * from test_table;
LINEID ID
---------- -----------
1 1
2 2
3 5
4 7
5 9
主库在节点1 上, 备库和monitor在节点2上。
直接把节点1 服务器shutdown,通过monitor产看备库的状态。
#================================================================================#
[monitor] 2026-08-04 06:15:02:546: Dmwatcher process GRP1_RT_02 status switching [OPEN-->TAKEOVER]
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2026-08-04 06:15:02 TAKEOVER OK GRP1_RT_02 OPEN STANDBY VALID 12 60502 60502
[monitor] 2026-08-04 06:15:03:056: [!!! Instance GRP1_RT_01 dmwatcher's DW_MODE is configured as AUTO, but this dmmonitor is not in CONFIRM mode, cannot takeover instance GRP1_RT_01 automatically !!!]
[monitor] 2026-08-04 06:15:03:057: Received message timeout from(GRP1_RT_01)
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2026-08-04 06:14:41 ERROR OK GRP1_RT_01 OPEN PRIMARY VALID 12 60502 60502
[monitor] 2026-08-04 06:15:04:170: Dmwatcher process GRP1_RT_02 status switching [TAKEOVER-->OPEN]
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2026-08-04 06:15:04 OPEN OK GRP1_RT_02 OPEN PRIMARY VALID 13 60538 60557
可以看到 备库大概在 5秒之后 成功自动的变为了主库。
2026-08-04 06:15:02:546 备库 [OPEN–>TAKEOVER]
2026-08-04 06:15:04:170 备库 [TAKEOVER–>OPEN]
备库变为主库
https://eco.dameng.com
文章
阅读量
获赞
