模拟1主2从环境,主库宕机情况下的手动切换和修复
环境准备:
3台redhat6.3单颗CPU,2G内存操作系统
master:192.168.233.2
slave1:192.168.233.3
slave2:192.168.233.4
mysqlpercona-server5.7.19
同步方式为半同步(GTID)
模拟主库崩溃场景:
杀掉mysql进程
ps –ef|grep mysql
killall -9 mysqld mysqld_safe
查看从库复制状态:
Slave_IO_Running->Connecting
确认两节点状态都处于slave has read all relay log;wait for more updates
选择192.168.233.3为新的主库:
执行reset master;--作用是清空bin log日志,并创建一个新的binlog
执行reset slave --作用是清除slave_master_info和slave_relay_log_info信息,清空relay log。
创建新主库到旧主库的复制账号:
grant replication slave on *.* to repl@'192.168.233.2 ' identified by ‘123456’;
更改新主库的参数:(报找不到参数看最后)
set global rpl_semi_sync_master_enabled=1;
set global rpl_semi_sync_slave_enabled=0;
set global read_only=0;
在slave2上(192.168.233.4)执行切换主库操作:
stop slave;
change master to master_host='192.168.233.3',master_user='repl',master_password='123456',master_port=3306,master_auto_position=1;
start slave;
恢复旧主库,并使其成为新的备库:
/etc/init.d/mysqldstart启动mysqld服务
更改旧主库的参数为备库参数:
set global rpl_semi_sync_master_enabled=0;
set global rpl_semi_sync_slave_enabled=1;
set global read_only=1;
切换主库为192.168.233.3,开启复制
change master to master_host='192.168.233.3',master_user='repl',master_password='123456',master_port=3306,master_auto_position=1;
start slave;
--至此切换结束
执行过程中如果报找不到半同步相关参数的,按以下步骤安装插件:
在主库安装semisync_master插件:
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
mysql>set global rpl_semi_sync_master_enabled=1;
在备库安装semisync_slave插件
mysql>INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
mysql>set global rpl_semi_sync_slave_enabled=1;
在从库状态并不是slave has read all relay log;wait for more updates时关闭复制会导致
部分transaction未执行成功,数据不一致的导致start slave报错:
由报错可知,执行失败的GTID编号: fafb3b40-40cb-11e8-85d9-000c29057f3c:1。
解决方法:
1.跳过这条事务
(1)停止slave进程
mysql>STOP SLAVE;
(2)设置事务号,事务号从Retrieved_Gtid_Set获取
在session里设置gtid_next,即跳过这个GTID
mysql>SET @@SESSION.GTID_NEXT= '216d7609-3e41-11e8-9481-000c292618fc:1,fafb3b40-40cb-11e8-85d9-000c29057f3c:1'
(3)设置空事物
mysql>BEGIN; COMMIT;
(4)恢复事物号
mysql>SET SESSION GTID_NEXT = AUTOMATIC;
(5)启动slave进程
mysql>START SLAVE;
2.清除这条事务
(1)停止slave进程
stop slave;
(2)设置gtid_purged
set global gtid_purged='216d7609-3e41-11e8-9481-000c292618fc:1,fafb3b40-40cb-11e8-85d9-000c29057f3c:1';
(3)设置空事物
mysql>BEGIN; COMMIT;
(4)启动slave进程
start slave;