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主从切换的主要内容,如果未能解决你的问题,请参考以下文章

mysql主从切换步骤

mysql主从切换维护时的几点注意

mysql主从同步宕机切换问题

MySQL之主从切换

MySQL主从切换

MYSQL 主从切换