问题现象
用户在执行“gs_om -t switch -h hostname -I instname”命令的时候,在命令执行结束之前,使用“Ctrl+C”中断了主备切换过程,中断后再次对同组内的DN执行主备切换的时候,无法切换成功。执行结果及报错如下:
gs_om -t switch -h plat1 -I DB1_2
Switching instances.
[GAUSS-53007] : Failed to switch cluster. Error:
Set output to terminal.
time="2019-05-31T15:28:36+08:00" level=error msg="The group group_1 is doing switchover"
time="2019-05-31T15:28:36+08:00" level=fatal msg="switchover datanode primary to DB(DB1_2) failed"
使用“Ctrl+C”中断switch过程后,执行同组内的主备切换会报错,需要进行故障处理,但切换其它组的主备,可正常执行切换命令。
原因分析
在执行“gs_om -t switch -h hostname -I instname”命令的过程中,gs_om脚本会调用CM的主备切换命令,在切换过程中CM会给正在执行切换的DN所在组加锁。“Ctrl+C”会中断gs_om调用CM的过程,但此时CM已经成功下发切换命令,并且为指定切换DN所在的组加了锁,因此,再次执行同组内的DN主备切换时,会报错为该组DN正在执行切换。
处理步骤
- 以omm用户身份登录GaussDB 100任意服务器。
- 查询锁,获得被锁的组名。
etcdctl --cert="$ETCD_CERT_CLIENT_FILE" --key="$ETCD_KEY_CLIENT_FILE" --cacert="$ETCD_CA_CLIENT_FILE" --endpoints="$ETCD_ADDRESS" get /clusters/cmd_cm/arbitrate_db --prefix
/clusters/cmd_cm/arbitrate_db/group_1
group_1
- 释放锁。
etcdctl --cert="$ETCD_CERT_CLIENT_FILE" --key="$ETCD_KEY_CLIENT_FILE" --cacert="$ETCD_CA_CLIENT_FILE" --endpoints="$ETCD_ADDRESS" del /clusters/cmd_cm/arbitrate_db/group_1
1
- 再次执行主备切换。
gs_om -t switch -h plat1 -I DB1_1
Switching instances.
Successfully switched cluster.