与Oracle DataGuard切换原理类似,主、从复制也分为计划性切换和故障切换两种方式。其中,计划性切换的关键步骤如下列所示,而故障切换则更为简单,只需要单独执行下列的步骤4)即可实现。
1.关闭前端业务
为了尽量规避切换失败的风险,用户必须合理管控切换流程。在切换之前建议先停止前端应用,待程序停止完毕,再检查MySQL数据库中是否仍有残留的外部会话连接。确认清楚后再参考以下命令清理相关线程。
强制断开与MySQL实例交互的所有连接线程,注意其中不包括当前线程:
shell> mysqladmin -uroot -p processlist|awk -F "|" '{print $2}'|sed '/^$/d'| \
sed '1d;$d'|tr "\n" ","|sed 's/[[:space:]]//g;s/,$/\n/'|xargs \
mysqladmin -uroot -p kill
如果出于某些原因不能杀掉全部连接,那么可以根据数据库用户或访问终端进行精确匹配,并将指定的线程断开:
shell> mysqladmin -uroot -p processlist|awk -F "|" '{if($3~/user1|user2/) print $2}'\
|tr "\n" ","|sed 's/[[:space:]]//g;s/,$/\n/'|xargs mysqladmin -uroot -p kill
或者
shell> mysqladmin -uroot -p processlist|awk -F "|" '{if($4~/host1|host2/) print $2}'\
|tr "\n" ","|sed 's/[[:space:]]//g;s/,$/\n/'|xargs mysqladmin -uroot -p kill
说明:进行精确匹配的数据库用户和访问终端可以是一个也可以是多个。
在某些极端情况下,主、从节点可能会因为I/O线程出现瓶颈而导致复制延时。在该场景下,暴力断开连接时需要保留主库上的Binlog Dump线程,可参考下列命令进行规避:
shell> mysqladmin -uroot -p processlist|awk -F "|" '{if($6!~/Binlog Dump/) \
print $2}'|sed '/^$/d'| sed '1d;$d'|tr "\n" ","|sed 's/[[:space:]]//g;\
s/,$/\n/'|xargs mysqladmin -uroot -p kill
2.主库执行FTWRL以禁止数据写入
在主节点执行全局读锁FTWRL,可以禁止任何数据写入。如果是在非GTID模式下,则需要记录当前二进制日志文件名和位置;如果是在GTID模式下,则需要记录当前已经执行过的GTID。若担心当前持锁线程异常退出,则建议将主库设置为只读模式,之后可选择释放FTW