主备dmserver关闭顺序不正确,主库提示“sys halt 0 段错误”
读写分离集群主备dmserver关闭顺序不正确,主库提示“sys halt 0 段错误”
现状描述
根据官方手册《DM8数据守护与读写分离集群V4.0》搭建dm8读写分离集群,搭建完成后关闭主备守护进程,再关闭备库的dmserver,最后在关闭主库前台命令启动的dmserver实例时,在关闭后提示"sys halt 0 段错误"。
主库显示信息如下:
[email protected]:/data/dmdbms/bin$ ./dmserver /home/dmdba/dmdbms/data/DAMENG/dm.ini mount
file dm.key not found, use default license!
version info: develop
Use normal os_malloc instead of HugeTLB
Use normal os_malloc instead of HugeTLB
DM Database Server x64 V8 1-1-87-20.06.01-122565-ENT startup...
Database mode = 0, oguid = 0
License will expire on 2021-06-01
file lsn: 35549
ndct db load finished
ndct fill fast pool finished
nsvr_startup end.
aud sys init success.
aud rt sys init success.
systables desc init success.
ndct_db_load_info success.
SYSTEM IS READY.
total 1 trx rollbacked, rollback percent: -1%
total 2 trx rollbacked, rollback percent: -1%
total 3 trx rollbacked, rollback percent: -1%
total 4 trx rollbacked, rollback percent: -1%
iid page's trxid[4008]
NEXT TRX ID = 4009
pseg_collect_items, collect 0 active_trxs, 0 cmt_trxs, 0 pre_cmt_trxs, 0 active_pages, 0 cmt_pages, 0 pre_cmt_pages
pseg_process_collect_items end, 0 active trx, 0 active pages, 0 committed trx, 0 committed pages
total 0 active crash trx, pseg_crash_trx_rollback sys_only(0) begin ...
pseg_crash_trx_rollback end
purg2_crash_cmt_trx end, total 0 page purged
set EP[0]'s pseg state to inactive
pseg recv finished
nsvr_process_before_open begin.
nsvr_process_before_open success.
total 0 active crash trx, pseg_crash_trx_rollback sys_only(0) begin ...
pseg_crash_trx_rollback end
exit <---------------------这里执行exit退出
Server is stopping...
listener closed and all sessions disconnected
purge undo records in usegs...OK
full check point starting...
generate force checkpoint, rlog free space[536764928], used space[97792]
sys halt 0 <-------------
段错误 <-------------
[email protected]:/data/dmdbms/bin$
原因
经验证,是由于读写分离集群主备库dmserver实例关闭顺序不对导致。
目前未发现由于此种情况出现的 "段错误 " 导致数据库故障或者无法启动的情况。
解决
如果使用手动方式关闭数据守护系统,请严格按照以下顺序执行:
1. 如果启动了确认监视器,先关闭确认监视器(防止自动接管)
2. 关闭备库守护进程(防止重启实例)
3. 关闭主库守护进程(防止重启实例)
4. Shutdown 主库
5. Shutdown 备库
参考《DM8数据守护与读写分离集群V4.0》6.4节中的说明。
总结
关闭守护系统时,必须按照一定的顺序来关闭守护进程和数据库实例。特别是自动切换模式,如果退出守护进程或主备库的顺序不正确,可能会引起主备切换,甚至造成守护进程组分裂。
通过监视器执行 Stop Group 命令关闭数据守护系统,是最简单、安全的方式。命令执行成功后,数据库实例正常关闭。但守护进程并没有真正退出,而是将状态切换为Shutdown 状态。
Stop Group 命令内部流程如下:
1. 通知守护进程切换为 Shutdown 状态
2. 通知主库退出
3. 通知其他备库退出
如果是只关闭主库, 并且不想引发备库自动接管, 有以下两种方法:
方法一:
1.通过 Detach database 命令将所有备库分离
2.通过 Stop database 命令退出主库
方法二: 严格按照以下顺序执行:
1. 通过 Stop dmwatcher 命令关闭所有守护进程监控
2. 手动正常退出主库
如果是只关闭备库, 并且不想引发主库发送日志失败进入 Suspend 状态, 请严格按照以下顺序执行:
1. 通过 Detach database 命令将备库分离出数据守护系统
2. 正常退出备库(手动退出或者通过 Stop database 命令退出)
如果使用手动方式关闭数据守护系统,请严格按照以下顺序执行:
1. 如果启动了确认监视器,先关闭确认监视器(防止自动接管)
2. 关闭备库守护进程(防止重启实例)
3. 关闭主库守护进程(防止重启实例)
4. Shutdown 主库
5. Shutdown 备库
注意:
关闭整个数据守护系统时, 先关闭主库再关闭备库,顺序一定不能错。对于本地守护类型的库,在关闭数据守护系统时,不受此顺序限制。因为主库 Shutdown 过程中,需要 Purge 所有已提交事务,会修改数据,并产生 Redo 日志。如果先 Shutdown 备库,会导致主库发送归档日志失败,并且由于主库已经处于 Shutdown 状态,会导致主库异常关闭。