mysql主从切换
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql主从切换相关的知识,希望对你有一定的参考价值。
主库宕机解决方案
假设发生了突发事件,master宕机,现在的需求是要将192.168.1.102提升为主库,另外一个为从库
步骤:
1.确保所有的relay log全部更新完毕,在每个从库上执行stop slave io_thread; show processlist;直到看到Has read all relay log,则表示从库更新都执行完毕了
2.登陆所有从库,查看master.info文件,对比选择pos最大的作为新的主库,这里我们选择192.168.1.102为新的主库
3.登陆192.168.1.102,执行stop slave; 并进入数据库目录,删除master.info和relay-log.info文件(和reset slave all一样,以非从库模式启动);配置my.cnf文件,开启log-bin;如果有log-slaves-updates和read-only则要注释掉,执行reset master;创建用于同步的用户并授权slave(最好保持与之前主库的用户&密码一致)
5.登录另外一台从库,执行stop slave停止同步;连接到新的主库;start slave;;检查&测试slave是否同步更新
正常切换主从
1.检查slave同步状态
在开始切换之前先对主库进行锁表:
flush tables with read lock
(在执行完成后生产环境必须等待所有语句执行完成)
在flush tables with read lock成功获得锁之前,必须等待所有语句执行完成(包括SELECT)。所以如果有个慢查询在执行,或者一个打开的事务,或者其他进程拿着表锁,flush tables with read lock就会被阻塞,直到所有的锁被释放。请看下面的例子:
mysql> show processlist; +----+------+-----------+------+------------+------+-------------------+----------------------------------------------------------------------+ | Id | User | Host | db | Command | Time | State | Info | +----+------+-----------+------+------------+------+-------------------+----------------------------------------------------------------------+ | 4 | root | localhost | test | Query | 80 | Sending data | select count(*) from t t1 join t t2 join t t3 join t t4 where t1.b=0 | | 5 | root | localhost | test | Query | 62 | Flushing tables | flush tables with read lock | | 6 | root | localhost | test | Field List | 35 | Waiting for table | | | 7 | root | localhost | test | Query | 0 | NULL | show processlist | +----+------+-----------+------+------------+------+-------------------+----------------------------------------------------------------------+ 4 rows in set (0.00 sec)
等切换完成后可以释放锁
unlock tables
1)在master执行:show processlist;
显示Master has sent all binlog to slave; waiting for binlog to be updated
2)在slave执行:show processlist;
显示Slave has read all relay log; waiting for the slave I/O thread to update it
mysql> show slave status \G;
检查IO及SQL线程是否正常,如果为NO表明同步不一致,需要重新将slave同步保持主从数据一致。
正常切换主从/突发情况切换主从,主要步骤
3)停止slave io线程
在slave执行:
mysql> STOP SLAVE IO_THREAD
mysql> SHOW PROCESSLIST;
确保状态为:has read all relay log
stop slave io_thread执行,停止主从同步的io进程,不再从主库同步binlog日志文件;show processlist;确认所有的sql语句是否都执行完毕,确保同步的数据都更新到库。
以上都执行完成后可以把slave提升为master:
4)提升slave为master
Stop slave;
Reset master;
Reset slave all; 在5.6.3版本之后
Reset slave; 在5.6.3版本之前
备注:reset slave all 命令会删除从库的 replication 参数,之后 show slave status\G 的信息返回为空。(与删除服务器上master.info和relay-log.info文件一样,使下次重启库时以非从库启动)
查看slave是否只读模式:show variables like ‘read_only‘;
只读模式需要修改my.cnf文件,注释read-only=1并重启mysql服务。
或者不重启使用命令关闭只读,但下次重启后失效:set global read_only=off;
##在从库创建用户和授权
grant replication slave on *.* to ‘repl‘@‘‘192.168.0.104‘ identified by ‘xxxx‘
##授权的同步用户和密码保持与之前的一致
show master status;
##记录主库的binlog日志和pos位置,给其他从库建立主从使用。
5)将原来master变为slave
在新的slave上重置binlog:
Reset master;
change master to master_host=‘192.168.0.104‘, ##Master 服务器Ip
master_port=3306,
master_user=‘repl‘,
master_password=‘xxx‘,
master_log_file=‘master-bin.000001‘, ##Master服务器产生的日志
master_log_pos=000001; ##之前记录的主库pos位置
start slave; ##启动slave
show slave status\G; ##查看slave状态
异常切换(主机故障或者宕机)
1) 在salve执行:
stop slave;
reset master;
查看是否只读模式:show variables like ‘read_only‘;
只读模式需要修改my.cnf文件,注释read-only=1并重启mysql服务。
或者不重启使用命令关闭只读,但下次重启后失效:set global read_only=off;
查看show slave status \G;
查看show master status \G;
业务应用上修改为主库IP地址,测试应用连接是否正常。
##reset master直接去掉主从的配置,以单库模式运行。
以上是关于mysql主从切换的主要内容,如果未能解决你的问题,请参考以下文章