Mysql 从库提升为主库,原来的其他从库成为新的主库的从库

环境信息

  • Mysql 5.7

场景说明

Mysql 一主多从的情况下,主库宕机(或其他无法使用的情况),将其中一台从库提升为主库,同时将原来其他的从库配置为新的主库的从库。

主从恢复正常之前,数据库不应该有新的数据写入

操作步骤

确保所有从库已经执行了relay log中的全部更新

登录mysql从库,在每个从库上,执行stop slave io_thread,停止IO线程, 通过以下2个命令之一检查从库relay log的执行情况

show processlist;

show slave status\G

当输出中Slave_SQL_Running_StateSlave has read all relay log; waiting for more updates,表示更新都执行完毕。

  • 正常情况下,此时在每个从库上面查看slave状态(show slave status\G), 每个从库读取的主库的Master_Log_FileRead_Master_Log_Pos都应该是一样的,意味着所有的从库都已经更新到了主库宕机时的状态。此种情况下,可随便选择从库作为新的主库。
  • 如果,从库上面查看slave状态,各个从库读取的主库的Master_Log_FileRead_Master_Log_Pos不一致,说明主库宕机之前各个从库和主库的主从延迟情况可能不一,导致各个从库的状态不一致,此种情况下,从数据完整性的角度考虑,应该选择position最大的一个从库,作为新选定的主库。对其他从库,应该通过从binlog中读取缺失的数据,补足数据。或者直接通过备份恢复的方式,和新选定的主库,重新建立主从连接。

更新新的主库的配置

在新选定的主库上,配置文件(默认/etc/my.cnf)中开启binlog,如已配置,跳过

/etc/my.cnf
log-bin=mysql-bin

新选定的主库上,如果配置了readonly,在配置文件(默认/etc/my.cnf)中取消readonly配置

/etc/my.cnf
read_only=0

更改mysql配置文件后,重启mysql生效

在新选定的主库上,执行以下命令,重置从库配置

stop slave;  
reset master;
reset slave all;

在新选定的主库上,执行以下命令,创建具有同步权限的账号,如果已存在,跳过

grant replication slave on *.* to 'repl'@'%' identified by '123456';
flush privileges;

在新选定的主库上,执行以下命令,查看当前主库的master位置信息

show master status\G

在主从重新建立之前,不应该有新的数据写入数据库,在此前提之下,多次查看master status,显示的FilePosition 应该是确定不变的值,后续可根据此值,让其他从库和新选定的主库建立主从连接。

建立新的主从

在其他从库上,执行以下命令,和新选定的主库,建立主从连接,其中需要的master_log_filemaster_log_pos上一步中获得。

stop slave;
change master to master_host='1.1.1.1',master_user='repl',master_password='123456',master_port=3306,master_log_file='mysql-bin.000982',master_log_pos=638932979;
start slave

常见问题