万答#4,延迟从库加上MASTER_DELAY,主库宕机后如何快速恢复服务
欢迎来到 GreatSQL社区分享的MySQL技术文章,如有疑问或想学习的内容,可以在下方评论区留言,看到后会进行解答
当主库宕机后,延迟从库如何才能"取消"主动延迟,以便恢复服务?
问题描述
本问题来自一位群友,他遇到的情况我简单归纳一下:
实例A是主库,B是延迟从库(设置了延迟7200秒)。
当A挂掉后(已无法连接,或无法启动),希望用B提升成主库。
但是在B上执行 change master to MASTER_DELAY=0 后,B上已经保存的7200秒的relay文件也会被清除掉,并尝试再次从A获取binlog,这样会造成7200秒的数据丢失,未能达成目的。
TA想问:在这样的场景下,还有办法让B库尽快跑完这7200秒延迟数据吗,或者正确的办法是什么呢?
问题解决
先回答问题:这个需求是有办法达成的(而且还不只一种方法),最正确的方法也并不麻烦/复杂(看到最后),只不过有些小窍门要注意下。
方法1,修改系统时间
也就是修改B主机的系统时间,将其往后调整超过7200秒,然后重启slave线程,就能让SQL_THREAD继续应用relay log了。所有relay log应用完毕后,再将系统时间修改回来。
# 修改系统时间,增加7200秒
[root@greatsql]# date -s "`date --date '7200 second'`"
# 重启slave线程
[root@GreatSQL](none)> STOP SLAVE; START SLAVE;
注意:这种方法(潜在)影响很大,可能对其他系统应用有影响,或者MySQL里部分涉及到日期时间的结果也会受到影响,非常不推荐。
方法2,自行手动恢复relay log/binlog
当主库(A)宕机后,查看当前slave的状态:
[root@GreatSQL](none)> SHOW SLAVE STATUS\G
...
Master_Log_File: binlog.000011
Read_Master_Log_Pos: 2671
Relay_Log_File: relay-bin.000005
Relay_Log_Pos: 361
Relay_Master_Log_File: binlog.000011
Slave_IO_Running: Connecting
Slave_SQL_Running: Yes
...
Exec_Master_Log_Pos: 746
Relay_Log_Space: 2704
...
Seconds_Behind_Master: 387
...
SQL_Delay: 7200
SQL_Remaining_Delay: 6814
Slave_SQL_Running_State: Waiting until MASTER_DELAY seconds after master executed event
可以看到这时候有387秒的落后,主动延迟7200秒,还有6814秒之后才能应用最新的relay log。虽然事务有延迟,但其实slave已经把binlog都复制过来了,在relay log里。
Read_Master_Log_Pos: 2671 <-- 已读取到最新的binlog了,pos = 2671
Relay_Log_File: relay-bin.000005 <-- 对应的relay log
Relay_Log_Pos: 361 <-- 对应的relay log pos
...
Exec_Master_Log_Pos: 746 <-- 但只apply到 pos = 746
现在,只需要手动把这中间的差异数据拿出来apply就可以了。解析relay log,找到对应master binlog pos = 746的位置,或者直接指定realy log pos = 361的位置也可以:
[root@greatsql]# ls -la relay-bin.*
-rw-r----- 1 mysql mysql 418 Jun 13 13:31 relay-bin.000004
-rw-r----- 1 mysql mysql 2286 Jun 13 13:33 relay-bin.000005
-rw-r----- 1 mysql mysql 58 Jun 13 13:31 relay-bin.index
[root@greatsql]# mysqlbinlog --base64-output=decode-rows -vvv relay-bin.000005
...
# at 196
#700101 8:00:00 server id 5001 end_log_pos 0 CRC32 0xaf7e0f79 Rotate to binlog.000011 pos: 746
# at 240
#210613 11:26:08 server id 5001 end_log_pos 0 CRC32 0xfa7fd769 Start: binlog v 4, server v 8.0.22-13 created 210613
11:26:08
# at 361
#210613 13:33:41 server id 5001 end_log_pos 825 CRC32 0xd5161853 GTID last_committed=1 sequence_number=3
rbr_only=yes original_committed_timestamp=1623562421106412 immediate_commit_timestamp=1623562421106412 transaction_length=275
...
确认对应的事务是存在的,接下来就可以利用relay log恢复数据了。
[root@greatsql]# mysqlbinlog relay-bin.000005 --start-position=361 | mysql -S./mysql.sock -f
当然了,如果此时A主机还可以连接,只是mysqld服务无法启动的话,亦可直接用A主机上的binlog进行恢复。
这种方法需要细心谨慎,手眼配合密切,容易出错,因此也不推荐。
方法3,正确理解MASTER_DELAY,一键搞定
前面铺垫了那么多,看起来想要让延迟从库快速恢复好像有点麻烦的样子。
事实上,只要正确理解,一键命令就搞定了。
当主库发生故障宕机后,binlog其实已经都复制到从库并写入成relay log了。当然了,为避免误操作,建议先备份relay log。
接下来的操作很重要,看准了,一定不要做错:
# 只关闭SQL_THREAD,而不是直接关闭整个SLAVE服务
[root@GreatSQL](none)> STOP SLAVE SQL_THREAD;
# 修改MASTER_DELAY,使之不再延迟
[root@GreatSQL](none)> CHANGE MASTER TO MASTER_DELAY=0;
# 再次启动SQL_THREAD
[root@GreatSQL](none)> START SLAVE SQL_THREAD;
主库虽然宕机了,但从库上只有IO_THREAD会报告连接错误,SQL_THREAD还是可以正常工作的。
上述操作的关键点在于,修改 MASTER_DELAY 时并没有先停掉 IO_THREAD,否则会清空所有的relay log,尝试去主库再次拉取。
再次启动 SQL_THREAD 之后,从库就会继续应用relay log,待到全部应用完毕后,完成必要的数据校验,即可提成成为新的主库,对外提供服务了。
看,真的挺简单的吧。
现在来验证下:完全停掉SLAVE服务后修改MASTER_DELAY值,再启动SLAVE服务,此时会清空重置relay log。
# 主库宕机后,查看SLAVE状态
[root@GreatSQL](none)> SHOW SLAVE STATUS\G
...
Master_Log_File: binlog.000017
Read_Master_Log_Pos: 471
Relay_Log_File: relay-bin.000002
Relay_Log_Pos: 321
Relay_Master_Log_File: binlog.000017
Slave_IO_Running: Connecting
Slave_SQL_Running: Yes
...
Exec_Master_Log_Pos: 196
...
Seconds_Behind_Master: 69
...
SQL_Delay: 7200
SQL_Remaining_Delay: 7132
Slave_SQL_Running_State: Waiting until MASTER_DELAY seconds after master executed event
...
# 查看relay log状态
[root@greatsql]# ls -la relay-bin.*
-rw-r----- 1 mysql mysql 213 Jun 13 15:11 relay-bin.000001
-rw-r----- 1 mysql mysql 596 Jun 13 15:11 relay-bin.000002
-rw-r----- 1 mysql mysql 58 Jun 13 15:11 relay-bin.index
# 关闭SLAVE服务,修改MASTER_DELAY,再启动SLAVE服务
[root@GreatSQL](none)> STOP SLAVE; CHANGE MASTER TO MASTER_DELAY=0; START SLAVE;
# 再次查看relay log,发现被清空重置了
[root@greatsql]# ls -la relay-bin.*
-rw-r----- 1 mysql mysql 156 Jun 13 15:18 relay-bin.000001
-rw-r----- 1 mysql mysql 29 Jun 13 15:18 relay-bin.index
所以,请记住了,当延迟从库要修改延迟设置时,只需重启SQL_THREAD,千万别图省事重启整个SLAVE服务,这样relay log就不会被清空重置了,也就能实现快速恢复并提升为主库。为以防万一,也请务必备份好relay log。
因为relay log是由 IO_THREAD 负责的,所以只要 IO_THREAD 不重启,就不会清空重置。看下MySQL文档中关于relay log的说明:
#原文出处 https://dev.mysql.com/doc/refman/8.0/en/replica-logs.html
The replica's relay log, which is written by the replication I/O thread, contains the transactions read from the replication source server's binary log. The transactions in the relay log are applied on the replica by the replication SQL thread. For information about the relay log, see Section 17.2.4.1, “The Relay Log”.
P.S,本文使用的GreatSQL 8.0.22-13,关于这个版本的说明详见 GreatSQL,打造更好的MGR生态。
延伸阅读
13.4.2.1 CHANGE MASTER TO Statement, https://dev.mysql.com/doc/refman/8.0/en/change-master-to.html
18.17.2.4 Relay Log and Replication Metadata Repositories, https://dev.mysql.com/doc/refman/8.0/en/replica-logs.html
18.17.4.11 Delayed Replication, https://dev.mysql.com/doc/refman/8.0/en/replication-delayed.html
Enjoy GreatSQL
文章推荐:
技术分享 | MGR最佳实践(MGR Best Practice)
https://mp.weixin.qq.com/s/66u5K7a9u8GcE2KPn4kCaA
技术分享 | 万里数据库MGR Bug修复之路
https://mp.weixin.qq.com/s/IavpeP93haOKVBt7eO8luQ
Macos系统编译percona及部分函数在Macos系统上运算差异
https://mp.weixin.qq.com/s/jAbwicbRc1nQ0f2cIa_2nQ
技术分享 | 利用systemd管理MySQL单机多实例
https://mp.weixin.qq.com/s/iJjXwd0z1a6isUJtuAAHtQ
产品 | GreatSQL,打造更好的MGR生态
https://mp.weixin.qq.com/s/ByAjPOwHIwEPFtwC5jA28Q
产品 | GreatSQL MGR优化参考
https://mp.weixin.qq.com/s/5mL_ERRIjpdOuONian8_Ow
关于 GreatSQL
GreatSQL是由万里数据库维护的MySQL分支,专注于提升MGR可靠性及性能,支持InnoDB并行查询特性,是适用于金融级应用的MySQL分支版本。
Gitee:
https://gitee.com/GreatSQL/GreatSQL
GitHub:
https://github.com/GreatSQL/GreatSQL
微信&QQ群:
可扫码添加GreatSQL社区助手微信好友,发送验证信息“加群”加入GreatSQL/MGR交流微信群,亦可直接扫码加入GreatSQL/MGR交流QQ群。

本文由博客一文多发平台 OpenWrite 发布!
万答#4,延迟从库加上MASTER_DELAY,主库宕机后如何快速恢复服务的更多相关文章
- 【MySQL】MySQL主从库配置和主库宕机解决方案
1.转载:https://blog.csdn.net/zfl589778/article/details/51441719/ 2.效果:亲测有效,数据写入成功. 3.主机宕机后,如果不是长时间宕机,且 ...
- MySQL 从库日志比主库多
在群里聊天的时候,一个群友说,生产库主库宕机,但是主从数据库数据一致,但是从库的日志比主库多,很是不理解! 咨询后发现,生产库的主库没有设置sync_binlog=1,而是为sync_binlog=0 ...
- 万答17,AWS RDS怎么搭建本地同步库
欢迎来到 GreatSQL社区分享的MySQL技术文章,如有疑问或想学习的内容,可以在下方评论区留言,看到后会进行解答 背景说明 AWS RDS 权限受限,使用 mysqldump 的时候无法添加 - ...
- 万答#5,binlog解析出来的日志为何无法恢复
欢迎来到 GreatSQL社区分享的MySQL技术文章,如有疑问或想学习的内容,可以在下方评论区留言,看到后会进行解答 问题描述 问题来自一位群友,简单说就是用 mysqlbinlog 工具读取 bi ...
- 教你如何6秒钟往MySQL插入100万条数据!然后删库跑路!
教你如何6秒钟往MySQL插入100万条数据!然后删库跑路! 由于我用的mysql 8版本,所以增加了Timezone,然后就可以了 前提是要自己建好库和表. 数据库test, 表user, 三个字段 ...
- 万答#21,如何查看 MySQL 数据库一段时间内的连接情况
GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 查看方式 已知至少有两种方式可以实现 1.开启 general_log 就可以观察到 开启命令 mysql> set ...
- 万答#11,MySQL中char与varchar有什么区别
万答#11,MySQL中char与varchar有什么区别 1.实验场景 GreatSQL 8.0.25 InnoDB 2.实验测试 2.1 区别 参数 char varchar 长度是否可变 定长 ...
- #万答10:mysqldump 是如何实现一致性备份的
万答10:mysqldump 是如何实现一致性备份的 实验场景 MySQL 8.0.25 InnoDB 实验步骤: 先开启 general_log 观察导出执行过程的变化 set global gen ...
- 万答#18,MySQL8.0 如何快速回收膨胀的UNDO表空间
欢迎来到 GreatSQL社区分享的MySQL技术文章,如有疑问或想学习的内容,可以在下方评论区留言,看到后会进行解答 GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 背 ...
随机推荐
- 零基础学Java第六节(面向对象二)
本篇文章是<零基础学Java>专栏的第六篇文章,文章采用通俗易懂的文字.图示及代码实战,从零基础开始带大家走上高薪之路! 本文章首发于公众号[编程攻略] 继承 创建一个Person类 我们 ...
- 149_1秒获取Power BI Pro帐号
一.背景 当你来到这篇文章的时候,我想你已经在网上搜索了一圈了.网上有一大把教你如何注册Power BI帐号的方法,我们这里就不在赘述了.因为各种因素的限制确实比较麻烦.我们直接提供Power BI ...
- Win10系统下怎么让局域网内其他电脑通过IP访问网站
最近,有位win10系统用户在电脑上制作好网站后,希望能让局域网内的其他电脑通过IP直接访问自己电脑的网站,以便得到更好地测试效果.可是,该用户操作了很久都没成功.那么,我们如何配置win10电脑的I ...
- 最大流&最小割&费用流模版
好久都没有搞博客了.想认真写又要准备文化课期末了. ISAP 流程: 原理就是dfs找增广路. 最基础的建反向边以便反悔就不说了. 但是记录一个dep(dis)表示层数,一开始BFS(从t开始,dis ...
- [第18届 科大讯飞杯 J] 能到达吗
能到达吗 题目链接:牛客5278 J 能到达吗 Description 给定一个 \(n\times m\) 的地图,地图的左上角为 \((1, 1)\) ,右下角为 \((n,m)\). 地图上有 ...
- 什么是Netty编解码,Netty编解码器有哪些?Protostuff怎么使用?
哈喽!大家好,我是小奇,一位热爱分享的程序员 小奇打算以轻松幽默的对话方式来分享一些技术,如果你觉得通过小奇的文章学到了东西,那就给小奇一个赞吧 文章持续更新 一.前言 书接上回,昨天下雨没怎么上街上 ...
- 可变参数——JavaSE基础
可变参数 方法声明中,在指定参数类型后加一个省略号...即可声明可变参数 可变参数必须是参数列表的最后一个参数 声明 public void test(int... i){ System.out.pr ...
- Datax源码改造关键步骤记录
Datax源码改造关键步骤记录: 一.作业配置1.一个job配置:reader 和writer 的column 字段必须是所有表共有的:2.reader多张表,writer一个表时,所有reader的 ...
- 使用VMware安装Ubuntu虚拟机
一.下载安装VM软件 这一步跳过,因为网上都能找到下载地址,下载后一步一步的安装即可,网上也有很多下载地址,这里提供一个Windows的下载链接. 链接: https://pan.baidu.com/ ...
- Docker容器固定ip
Docker容器固定IP 必须停止docker服务才能创建网桥 查看docker服务状态 停止docker服务 启动docker服务 [root@docker Tools]# systemctl st ...