Mysql 如何进行主从库切换(计划内)
![4061f13d30eb797e7b39fe95109b814c.png](https://i-blog.csdnimg.cn/blog_migrate/a7b6bea7cb7ac9e8c40b3bfd8c94950e.jpeg)
计划内的主从库进行切换比较简单,步骤如下
1. 停止向老主库写入
2. 让备库追赶上主库的数据(可选的,会简化下面的步骤)
3. 将一台从库提升为主库
4. 将备库和写操作指向新的主库,然后开启主从写入
但这其中还隐藏着许多细节,一些场景可能依赖于复制的拓扑结构,例如 主-主结构和主-备结构的配置有所不同
我们更深入一点,下面是大多数需要的步骤
我们的环境 是简单的主从结构,主库 端口为3306 从库端口为3307 , 用于演示的测试环境在一台机器上搭建(生产上 主从必须要两个服务器)
1. 停止当前主库所有的写入操作,如果可以最好将客户端程序关闭(除了复制连接)
2. 通过flush tables with read lock 在主库上停止所有活跃的写入,这一步是可选的,也可以在主库上设置 read_only 选项(如果从库之前是设置的 read,那么这里可以将主库直接设置为read_only),从这一时刻开始,将禁止向被替换的主库做任何写入操作,因为它一旦不是主库,则写入即意味着数据丢失,为了更好的保证这一点,可以kill 所有打开的事务,这将会真正结束所有的写入操作。
flush tables with read lock;
set global read_only=1;
show variables like '%read_only%'
![d032b308e1d6977c2b275e83e04973d6.png](https://i-blog.csdnimg.cn/blog_migrate/12f99d63bc916d4fa8caafd75124630a.jpeg)
修改配置文件中 read_only
![14d24c97addfc04607b06caa8def1f79.png](https://i-blog.csdnimg.cn/blog_migrate/0a124726185432e7e37bec105c3e6155.jpeg)
3. 选择一个备库作为新的主库,并确保它已经完全跟上主库(例如 让它执行完所有从主库获取的中继日志)
在从库3307上查询slave 状态
show slave status;
![77aa8176a06ace1e83d76ea674ef28ed.png](https://i-blog.csdnimg.cn/blog_migrate/5f4dfe224662ff1bee9b11c22c41e30c.jpeg)
在主库3306上看自己master状态
show master status;
![6413b9be9b5fbd1222aa249adc50be4f.png](https://i-blog.csdnimg.cn/blog_migrate/697c31065e905a5288a2da782fb565a0.jpeg)
4. 确保主库和从库数据一致的(可选)
我们可以找几个表进行测试,或者使用 pt-table-checksum 进行测试,这里是可选的,一般不会出现问题
5. 在新主库(3307)上执行stop slave
stop slave;
show slave status;
![500352a47be032bd7405deb37fd1929e.png](https://i-blog.csdnimg.cn/blog_migrate/6c32bcf5b7ca9a13a22207313efc416b.jpeg)
6. 在新主库上(3307)执行 rest slave all,使其断开于老主库的连接,并丢弃master.info里面的记录信息(如果连接信息记录在my.cnf里,会无法正确工作),这里我们不建议将该信息放到my.cnf中去
reset slave all;
show slave status;
![b440ba2a0d8a24587ecbbd913c2480f2.png](https://i-blog.csdnimg.cn/blog_migrate/b56b384f5634e0d1617b972a487fa122.jpeg)
7. 在新主库上 show master status 记录新主库的二进制日志信息
show master status;
![16089c1f51c5aa6975b41880c6cc8af9.png](https://i-blog.csdnimg.cn/blog_migrate/f0c12f4a7964a9f2db2c5cd317690a84.jpeg)
8. 老主库(3306)上创建 复制 并指向新主库3307,并解锁第二步中的 lock,如果老主库不用了,则忽略这步,将其他从库的主库指向新主库
change master to master_host='10.106.216.182',
master_user='repl',
master_port=3307,
master_password='123456',
master_log_file='mysql3307-bin.000001',
master_log_pos=399110;
start slave;
unlock tables;(一定记得要解锁,要不后续同步数据 过不来)
show slave status;
![1c9d95b5278af79c16cfae07992b0402.png](https://i-blog.csdnimg.cn/blog_migrate/0d9ef53a3fa6e35f7a944afa5949c80c.jpeg)
9. 将新主库(3307) 的read_only 去掉(可选,如果之前有设置read_only的话)
set global read_only=0;
show variables like '%read_only%'
![1e1edfdcd63f9e5738fa1ea22adff0be.png](https://i-blog.csdnimg.cn/blog_migrate/8488e49eced64433066011c5ccbae810.jpeg)
配置文件中 read_only 也要删除掉
![c4a81df6ca5445c5c588c773f390bbcd.png](https://i-blog.csdnimg.cn/blog_migrate/a9dc9e807ac7f010bb79255221cb68ed.jpeg)
10. 在新主库上 创建一个表 并插入数据,进行测试
create table test.mytest(id int );
insert into test.mytest(id) values(1)
从库上查询
select * from test.mytest;
![3bb3b2428d47089b1bdd01ca1c7b6daf.png](https://i-blog.csdnimg.cn/blog_migrate/b6d98c10973dc0178747904e2f8412cf.jpeg)
11. 重启各个数据库,查看是否正常启动 并在主库删除该表,从库跟着也删除则整个流程完成
drop table test.mytest;