您的位置:首页 > 数据库 > MySQL

mysql主从切换

2017-09-12 11:38 344 查看
主库宕机解决方案假设发生了突发事件,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 主从 主从切换