MySQL主从切换的超详细步骤


Posted in MySQL onJune 28, 2022

版本:

MySQL-5.7.32+GTID

前言:

本文讲述MySQL主从切换流程,切换步骤主要针对主备正常切换以及主库宕机备库切换两个场景,掌握正确的切换流程,可以有效避免切换过程中可能出现的数据不一致问题以及提高整体切换的时间

主从环境:

MySQL主从切换的超详细步骤

场景一:主备正常切换,此场景主要是针对在主备同步复制正常的情况下进行的主备切换,例如:灾备演练,计划性的主备切换。

切换步骤:

 1 切断应用对主库的流量

 2 主库备库设置只读

set global read_only=ON;
set global super_read_only=ON;

3 查看备库复制进程状态

show slave status\G

MySQL主从切换的超详细步骤

确认Slave_IO_Running,Slave_SQL_Running状态为YES,Seconds_Behind_Master为0

4 比对主备两边的GTID是否一致

获取主备两边的executed_gtid集合,进行比对

select @@global.gtid_executed;

MySQL主从切换的超详细步骤

MySQL主从切换的超详细步骤

通过GTID_SUBSET函数进行比对

SELECT GTID_SUBSET(master_gtid_executed, slave_gtid_executed);

若在master_gtid_executed中的GTID,也存在slave_gtid_executed中,则返回true(1),否则返回false(0)

MySQL主从切换的超详细步骤

 返回一,代表主库GTID已经在从库完成执行过,两边是一致的

5 从库停掉复制进程并清空主从信息

stop slave;
reset slave all;

MySQL主从切换的超详细步骤

6 从库关闭只读开启读写,转为新主库

set global read_only=off;
set global super_read_only=off;

MySQL主从切换的超详细步骤

7 主库设置执行新主库的复制链路,转为新备库,完成主从切换

CHANGE MASTER TO MASTER_HOST='192.168.1.111',MASTER_USER='xxx',MASTER_PORT=3306,MASTER_PASSWORD='xxx',master_auto_position=1 ;
start slave;
show slave status\G

MySQL主从切换的超详细步骤

8 应用流量切向新主库

场景二:主库宕机备库切换为主库,这种情况主要是在异步模式或者非强一致半同步下,主库的异常宕机,可能存在数据没有完全同步到从库的情况,需要去核验追加数据。

1 对于主库宕机,数据库损坏没法正常启动时,如果binlog可以获取,则可以对binlog进行离线分析,获取差异的数据

获取备库那边已经执行过的gtid set

select @@global.gtid_executed

MySQL主从切换的超详细步骤

如果已经写入数据的新主库,不能直接读取binlog进行恢复,因为可能会出现数据不一致,主键冲突等问题,可以从binlog里面排除从库已经执行过的gtid并离线解析成sql语句,交给应用去分析是否补入数据

mysqlbinlog -vv --base64-output=decode-rows --exclude-gtids='1b80feab-4aa6-11ec-9a60-000c29a6e7be:1-10,
2b3039c9-57fa-11eb-b504-000c29ed797a:1-8256287,
3a59d149-d4b8-11eb-8cf6-000c29a6e7b4:1-10,
a0a3d4b2-fff8-11eb-a420-000c29a6e7be:1-10011' /opt/mysql/log/nlog.000150 > /tmp/binlog_150_gtid.sql;

MySQL主从切换的超详细步骤

如果从库应用还未写入,未产生新数据,则可以从binlog里面排除从库已经执行过的gtid直接导入追加数据

mysqlbinlog --exclude-gtids='1b80feab-4aa6-11ec-9a60-000c29a6e7be:1-10,
2b3039c9-57fa-11eb-b504-000c29ed797a:1-8256287,
3a59d149-d4b8-11eb-8cf6-000c29a6e7b4:1-10,
a0a3d4b2-fff8-11eb-a420-000c29a6e7be:1-10011'  /opt/mysql/log/nlog.000150 | mysql -uroot -p -S /opt/mysql/3306/data/mysql.sock -P3306

2 对于主库宕机,但旧主库可以重新启动拉起,则在启动后,如果新主库应用还未写入新数据,可以将新主库change master复制继续指向旧主库,读取未应用的日志恢复;

已经写入数据的新主库,不能直接读取binlog进行恢复,因为可能会出现数据不一致,主键冲突等问题,而是应该将数据解析成sql语句,让应用去分析是否补入数据。

用my2sql在线解析binlog日志获取sql语句,需要获取开始的日志号以及读取位点,读取位点可以根据--exclude-gtids排除gtid后解析binlog的开始位置读取

MySQL主从切换的超详细步骤

my2sql -user xxxx -password xxxx  -work-type 2sql -start-file /opt/mysql/log/nlog.000150 -start-pos=7940194 --add-extraInfo -output-dir /tmp/my2sql_recover

目录下会生产forward+日志号的文本,里面存放解析出来的sql

MySQL主从切换的超详细步骤

MySQL主从切换的超详细步骤

总结

到此这篇关于MySQL主从切换的文章就介绍到这了,更多相关MySQL主从切换内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
MySQL索引篇之千万级数据实战测试
Apr 05 MySQL
MySQL 视图(View)原理解析
May 19 MySQL
浅谈MySQL函数
Oct 05 MySQL
MySQL数据库必备之条件查询语句
Oct 15 MySQL
mysql中varchar类型的日期进行比较、排序等操作的实现
Nov 17 MySQL
mysql5.7的安装及Navicate长久免费使用的实现过程
Nov 17 MySQL
全面盘点MySQL中的那些重要日志文件
Nov 27 MySQL
mysql聚集索引、辅助索引、覆盖索引、联合索引的使用
Feb 12 MySQL
MySQL表锁、行锁、排它锁及共享锁的使用详解
Apr 02 MySQL
mysql性能优化以及配置连接参数设置
May 06 MySQL
关于mysql中string和number的转换问题
Jun 14 MySQL
mysql通过group by分组取最大时间对应数据的两种有效方法
Sep 23 MySQL
浅谈MySql update会锁定哪些范围的数据
Jun 25 #MySQL
MySQL导致索引失效的几种情况
Jun 25 #MySQL
Mysql中的触发器定义及语法介绍
Jun 25 #MySQL
MySQL数据库配置信息查看与修改方法详解
Jun 25 #MySQL
SQL语句中EXISTS的详细用法大全
Jun 25 #MySQL
MySQL约束(创建表时的各种条件说明)
Jun 21 #MySQL
MySQL数据库实验实现简单数据库应用系统设计
Jun 21 #MySQL
You might like
PHP安装攻略:常见问题解答(三)
2006/10/09 PHP
PHP高级对象构建 多个构造函数的使用
2012/02/05 PHP
PHP获取http请求的头信息实现步骤
2012/12/16 PHP
php教程之phpize使用方法
2014/02/12 PHP
php判断是否为json格式的方法
2014/03/04 PHP
ThinkPHP3.1新特性之查询条件预处理简介
2014/06/19 PHP
php获取网页里所有图片并存入数组的方法
2015/04/06 PHP
php微信公众账号开发之前五个坑(一)
2016/09/18 PHP
Ext.get() 和 Ext.query()组合使用实现最灵活的取元素方式
2011/09/26 Javascript
JS小功能(列表页面隔行变色)简单实现
2013/11/28 Javascript
jquery+ajax+C#实现无刷新操作数据库数据的简单实例
2014/02/08 Javascript
javascript性能优化之DOM交互操作实例分析
2015/12/12 Javascript
微信小程序  action-sheet详解及实例代码
2016/11/09 Javascript
微信小程序 wx.uploadFile在安卓手机上面the same task is working问题解决
2016/12/14 Javascript
Jquery把获取到的input值转换成json
2017/05/15 jQuery
vue深入解析之render function code详解
2017/07/18 Javascript
Three.js入门之hello world以及如何绘制线
2017/09/25 Javascript
AngularJS的$location使用方法详解
2017/10/19 Javascript
浅谈Webpack自动化构建实践指南
2017/12/18 Javascript
vue实现拖拽的简单案例 不超出可视区域
2019/07/25 Javascript
pycharm 使用心得(六)进行简单的数据库管理
2014/06/06 Python
RC4文件加密的python实现方法
2015/06/30 Python
Flask的图形化管理界面搭建框架Flask-Admin的使用教程
2016/06/13 Python
django轻松使用富文本编辑器CKEditor的方法
2017/03/30 Python
使用Turtle画正螺旋线的方法
2017/09/22 Python
Python中使用Counter进行字典创建以及key数量统计的方法
2018/07/06 Python
python多线程+代理池爬取天天基金网、股票数据过程解析
2019/08/13 Python
python使用配置文件过程详解
2019/12/28 Python
HTML5 声明兼容IE的写法
2011/05/16 HTML / CSS
Html5在手机端调用相机的方法实现
2020/05/13 HTML / CSS
美国面料纺织品商城:Fabric.com
2017/06/28 全球购物
澳大利亚在线时尚精品店:Hello Molly
2018/02/26 全球购物
MYSQL支持事务吗
2013/08/09 面试题
2014年元旦活动方案
2014/02/15 职场文书
模具专业毕业推荐信
2014/03/08 职场文书
软件项目实施计划书
2014/05/02 职场文书