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_State
为 Slave has read all relay log; waiting for more updates
,表示更新都执行完毕。
- 正常情况下,此时在每个从库上面查看slave状态(
show slave status\G
), 每个从库读取的主库的Master_Log_File
和Read_Master_Log_Pos
都应该是一样的,意味着所有的从库都已经更新到了主库宕机时的状态。此种情况下,可随便选择从库作为新的主库。- 如果,从库上面查看slave状态,各个从库读取的主库的
Master_Log_File
和Read_Master_Log_Pos
不一致,说明主库宕机之前各个从库和主库的主从延迟情况可能不一,导致各个从库的状态不一致,此种情况下,从数据完整性的角度考虑,应该选择position最大的一个从库,作为新选定的主库。对其他从库,应该通过从binlog中读取缺失的数据,补足数据。或者直接通过备份恢复的方式,和新选定的主库,重新建立主从连接。
更新新的主库的配置
在新选定的主库上,配置文件(默认/etc/my.cnf
)中开启binlog,如已配置,跳过
log-bin=mysql-bin |
新选定的主库上,如果配置了readonly,在配置文件(默认/etc/my.cnf
)中取消readonly配置
read_only=0 |
更改mysql配置文件后,重启mysql生效
在新选定的主库上,执行以下命令,重置从库配置
stop slave; |
在新选定的主库上,执行以下命令,创建具有同步权限的账号,如果已存在,跳过
grant replication slave on *.* to 'repl'@'%' identified by '123456'; |
在新选定的主库上,执行以下命令,查看当前主库的master位置信息
show master status\G |
在主从重新建立之前,不应该有新的数据写入数据库,在此前提之下,多次查看master status,显示的
File
和Position
应该是确定不变的值,后续可根据此值,让其他从库和新选定的主库建立主从连接。
建立新的主从
在其他从库上,执行以下命令,和新选定的主库,建立主从连接,其中需要的master_log_file
和master_log_pos
从上一步中获得。
stop slave; |