从库mysqldump会导致复制中断

2023-10-29

背景

环境

  • 数据库版本:5.6.24-log
  • 主从架构:一主两从搭配mha

操作步骤

1、开发要求truncate一张表,在删除之前需要备份下数据;
2、在从库上使用mysqldump命令做逻辑备份,备份sql:

mysqldump -uXXX -p osdc osdc_XXX > /tmp/osdc_info.sql;

3、这台从库与主库的同步出现中断,报错为:

Slave_IO_Running: Yes
Slave_SQL_Running: No
Last_Errno: 1756
Last_Error: ... The slave coordinator and worker threads are stopped, possibly leaving data in inconsistent state. A restart should restore consistency automatically, although using non-transactional storage for data or info tables or DDL queries could lead to problems. In such cases you have to examine your data (see documentation for details).

ERROR NO 是1756,而且只是 Slave_SQL_Running 停了。

处理方式

1.停止同步:

stop slave;

2、打开同步:

start slave;

重新启停同步服务后,恢复正常。

分析

之前形形色色的主从问题遇到过很多,但是 1756 这个错误还是第一次遇到,所以事后还是很有兴趣去深入分析下这个问题。

1. 详细报错

查看数据库的 error log ,这个报错的具体输出如下:

2020-08-18 22:04:19 208840 [Warning] Slave SQL: Worker 2 failed executing transaction 'fe0ed3ca-cacc-11e9-8d49-6c92bfcf73b6:1377629720' at master log mysql-bin.003536, end_log_pos 861741231
; Could not execute Update_rows event on table osdc.osdc_XXX; Lock wait timeout exceeded; try restarting transaction, Error_code: 1205; handler error HA_ERR_LOCK_WAIT_TIMEOUT; the event's
master log mysql-bin.003536, end_log_pos 861741231, Error_code: 1205

2020-08-18 22:04:19 208840 [Note] Worker 2 is exiting: killed 0, error 1, running_status 1

2020-08-18 22:04:19 208840 [ERROR] Slave SQL: ... The slave coordinator and worker threads are stopped, possibly leaving data in inconsistent state. A restart should restore consistency aut
omatically, although using non-transactional storage for data or info tables or DDL queries could lead to problems. In such cases you have to examine your data (see documentation for detail
s). Error_code: 1756

错误日志里有个 Lock wait timeout exceeded ,这个我们先记下,稍后再说。
先找到 master 事务的 gtid,直接去主库的 binlog 里找下这个 gtid 所对应的 sql:

SET @@SESSION.GTID_NEXT= 'fe0ed3ca-cacc-11e9-8d49-6c92bfcf73b6:1377629720'/*!*/;

# at 861740635

#200818 21:58:42 server id 31  end_log_pos 861740715 CRC32 0xa9ab0dd2   Query   thread_id=9403182       exec_time=0     error_code=0
SET TIMESTAMP=1597759122/*!*/;
BEGIN
/*!*/;

# at 861740715

#200818 21:58:42 server id 31  end_log_pos 861740840 CRC32 0xbd8ba613   Rows_query

# update osdc_XXX
#         set modify_time=now(),status='04'
#         where id=9298XXXXX and status='01'

可以看到,这时候主库对 osdc_XXX 表进行了 update 操作。

2. 问题分析

1、首先,mysqldump 不加任何参数去执行,会对备份的表加表级锁。
2、这时候从库需要执行从主库同步过来的 update 语句,因为 mysqldump 表锁的存在,该语句会处理等待状态。
3、update 等待超时,这个错误我们在上面的 error log 里可以看到(Lock wait timeout exceeded)。
4、因为在5.6.26版本下,在使用 MTS 的情况下,slave_transaction_retries 是不生效的。所以当 update 语句超时后,它没有重试机制,导致整个 SQL threads 都停掉了(这也就是为什么 Slave_IO_Running 显示YES,而 Slave_SQL_Running 显示NO)。

在 rpl_slave.cc 里可以看到:

----
/* MTS technical limitation no support of trans retry */
if (mi->rli->opt_slave_parallel_workers != 0 && slave_trans_retries != 0
----

这个 bug 很早就由 Yoshinori Matsunobu 提在 https://bugs.mysql.com/bug.php?id=68465 了,官方也采纳了,并于 MySQL 5.7.5 修复掉了该问题。

Yoshinori Matsunobu 就是大名鼎鼎的 MHA 的作者!

3. 问题复现

相关参数

slave_parallel_workers:3

[root@localhost][(none)]> show variables like '%slave_parallel_workers%';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| slave_parallel_workers | 5     |
+------------------------+-------+

innodb_lock_wait_timeout:50

[root@localhost][(none)]> show variables like '%innodb_lock_wait_timeout%';
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| innodb_lock_wait_timeout | 50    |
+--------------------------+-------+

slave_transaction_retries:10

[root@localhost][none]> show variables like '%slave_transaction_retries%';
+---------------------------+-------+
| Variable_name             | Value |
+---------------------------+-------+
| slave_transaction_retries | 10    |
+---------------------------+-------+

测试数据:

[root@localhost][bug]> select * from repl_test;
+------+-------+
| id   | info  |
+------+-------+
|    1 | tom   |
|    2 | jerry |
+------+-------+

从库加锁操作

从库:

[root@localhost][bug]> begin;update repl_test set info='all';
Query OK, 0 rows affected (0.00 sec)

Query OK, 2 rows affected (0.01 sec)
Rows matched: 2  Changed: 2  Warnings: 0

显性开启事务,让它持续持有 InnoDB lock

主库更新操作

主库:

[root@localhost][bug]> update repl_test set info='all' where id=1;commit;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

Query OK, 0 rows affected (0.00 sec)

手工更新 repl_test 表的一条数据,此时从库的复制线程会等待这条sql的应用,并处于 system lock 状态:

从库:

[root@localhost][(none)]> show processlist;

+----+-----------------+-----------+------+---------+------+-----------------------------------------------------------------------------+--------------------------------------------+
| Id | User            | Host      | db   | Command | Time | State                                                                       | Info                                       |
+----+-----------------+-----------+------+---------+------+-----------------------------------------------------------------------------+--------------------------------------------+
|  6 | event_scheduler | localhost | NULL | Daemon  |  545 | Waiting on empty queue                                                      | NULL                                       |
|  9 | root            | localhost | bug  | Sleep   |   10 |                                                                             | NULL                                       |
| 15 | system user     |           | NULL | Connect |   44 | Waiting for master to send event                                            | NULL                                       |
| 16 | system user     |           | NULL | Connect |    5 | Slave has read all relay log; waiting for the slave I/O thread to update it | NULL                                       |
| 17 | system user     |           | NULL | Connect |   44 | Waiting for an event from Coordinator                                       | NULL                                       |
| 18 | system user     |           | NULL | Connect |   44 | Waiting for an event from Coordinator                                       | NULL                                       |
| 19 | system user     |           | NULL | Connect |    5 | System lock                                                                 | update repl_test set info='all' where id=1 |
| 20 | root            | localhost | NULL | Query   |    0 | init                                                                        | show processlist                           |
+----+-----------------+-----------+------+---------+------+-----------------------------------------------------------------------------+--------------------------------------------+
8 rows in set (0.04 sec)

errorlog

错误日志开始打印错误信息:

2020-08-20 11:01:00 22391 [Warning] Slave SQL: Worker 2 failed executing transaction '' at master log mysql-bin.000272, end_log_pos 654587717; Could not execute Update_rows event on table bug.repl_test; Lock wait timeout exceeded; try restarting transaction, Error_code: 1205; handler error HA_ERR_LOCK_WAIT_TIMEOUT; the event's master log FIRST, end_log_pos 654587717, Error_code: 1205
2020-08-20 11:01:00 22391 [ERROR] Slave SQL: ... The slave coordinator and worker threads are stopped, possibly leaving data in inconsistent state. A restart should restore consistency automatically, although using non-transactional storage for data or info tables or DDL queries could lead to problems. In such cases you have to examine your data (see documentation for details). Error_code: 1756
2020-08-20 11:01:00 22391 [Note] Error reading relay log event: slave SQL thread was killed

报的错与当时的内容一致。

4. 总结

1、mysqldump 即使在从库中执行,也必须加上 --single-transcation 等参数,直接执行会上表锁,成本大大。
2、部分mysql工具,如 navicat 直接使用它自带的导出功能,也会锁住全表。所以尽量不要使用工具去处理导出工作。

mysql> show open tables where in_use >0 ;
+----------+-----------+--------+-------------+
| Database | Table     | In_use | Name_locked |
+----------+-----------+--------+-------------+
| osdc     | osdc_XXX |      1 |           0 |
+----------+-----------+--------+-------------+
1 row in set (0.00 sec)

3、5.6 的主从的坑已经踩了很多了,大多是由于自身的bug,而且在 5.6 下根本体现不出 MTS 的优势。把 5.6 升级至 5.7 或 8.0 是非常有必要的,之前测试的 8.0 的复制稳定性和性能的提升非常大,推荐直接升级至 8.0 版本。

参考链接 :
从库mysqldump会导致复制中断 :
https://mp.weixin.qq.com/s/W3d8YW9AtfM1hwXUhhRTnw

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从库mysqldump会导致复制中断 的相关文章

随机推荐

  • 蓝桥云课——数字三角形 Python(动态规划)

    由于本人还在复习考研 留给蓝桥杯的时间不会太多 能不能拿奖还另说 听天由命吧 题目地址 数字三角形 一道比较简单的动态规划题目 比较适合新手学习 从动态规划三部曲开始走 1 先确认dp方程含义 在这我们采用二维数组 每个数组用来储存最大的值
  • Typora文本颜色设置

    Typora文本颜色设置 前言 方法一 使用markdown语法的内联公式 设置颜色 文本颜色设置公式 常用的颜色公式代码表 效果预览 方法二 使用html代码 设置颜色 文本颜色设置公式 颜色代码 方法三 借助第三方软件AutoHotKe
  • 数据库之SqlSessionTemplate源码解析

    前言 在普遍的JAVA WEB项目的实际业务处理中 最终都是通过SqlSessionTemplate执行数据库的CURD操作 本文结合mybatis源码 对SqlSessionTemplate进行详细的介绍 SqlSessionTempla
  • 【微信小程序】微信小程序怎么让tabbar右上角的红点动起来,闪烁红点。

    1 需要用到两个API分别是wx showTabBarRedDot 和wx hideTabBarRedDot wx showTabBarRedDot 显示 tabBar 某一项的右上角的红点 wx hideTabBarRedDot 隐藏 t
  • ERC20接口下USDT代币的深入解析

    ERC20代币合约规则简介 ERC20 是各个代币的标准接口 ERC20 代币仅仅是以太坊代币的子集 为了充分兼容 ERC20 开发者需要将一组特定的函数 接口 集成到他们的智能合约中 以便在高层面能够执行这些操作 获得代币总供应量 获得账
  • Hbase存储方式

    Hbase概念 HBase是一个分布式的 面向列的数据库它介于nosql和RDBMS之间 仅能通过主键 row key 和主键的range来检索数据 仅支持单行事务 可通过hive支持来实现多表join等复杂操作 主要用来存储非结构化和半结
  • do{}while(0)的用法

    这几天在看代码的时候遇到了一个好像很神奇的用法 do while 0 do while 1 我能理解 就是一直循环 然后在循环体内设置跳出条件 或者干脆就不跳出 那do while 0 是干嘛的呢 在内部也改变不了循环条件 然后执行一次就结
  • 测试-1-基础篇

    基础概念 一 相关概念 1 软件测试 2 软件测试和研发的区别 3 软件开发的生命周期 4 需求 5 什么是 BUG 6 什么是测试用例 二 开发模型 1 瀑布模型 2 螺旋模型 3 增量模型 4 迭代模型 5 敏捷开发 三 测试模型 1
  • usb的pid和vid

    根据USB 规范的规定 所有的USB设备都有供应商ID VID 和产品识别码 PID 主机通过不同的VID和PID来区别不同的设备 VID和PID都是两个字节长 其中 供应商ID VID 由供应商向USB执行论坛申请 每个供应商的VID是唯
  • 【课程作业经验】盘古α模型数据集生成以及训练初始化问题解决方案

    盘古模型代码及指导 models Models of MindSpore Gitee com 环境 华为云ModelArts Ascend 8 Ascend 910 Mindspore 1 5 1 PyTorch 1 8 一 盘古数据集生成
  • 前后端中的异步和事件机制

    前言 在前后端程序设计开发工作中 小伙伴们一定都接触过事件 异步这些概念 出现这些概念的原因之一是 我们的代码在执行过程中所涉及的逻辑在不同的场合下执行时间的期望是各不相同的 为了尽量做到充分利用CPU等资源做尽可能多的事 免不了通过异步和
  • 处理跨域问题

    1 vue hr2 1234567890 gitee com 2 画图 整个的登录流程 3 画图解释 vue cli的proxy代理解决跨域问题 4 cookie和localStorage区别 存储大小 cookie 一般不超过4K 因为每
  • 毕业设计-基于街景影像中行人车辆检测方法 -YOLO

    目录 前言 课题背景和意义 实现技术思路 一 方法理论 二 试验与分析 实现效果图样例 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近几年各个学校要求的毕设项目
  • 特征变换:特征归一化(Normalization)作用以及方法 Min-Max、Z-Score

    为什么需要对特征数据进行归一化 1 在基于梯度下降的算法中 使用特征归一化方法将特征统一量纲 能够提高模型收敛速度和最终的模型精度 1 如上图所示 黄色的圈圈图代表的是两个特征的等高线 其中左图两个特征 X1 和 X2 的区间相差非常大 X
  • Element UI input输入框实现模糊查询

    Element UI的input输入框进行搜索的时候 根据输入内容提供对应的输入建议 有个坑 它只能用第一个字进行搜索 不能够实现模糊匹配 下面的方法就是填这个坑 原来搜 奖 后台给返回数据 但是不会出现下拉框 例如 只要搜 抽 才出现下拉
  • JAVA面试

    JAVA网络通信篇 一 TCP和UDP有什么区别 TCP为什么是三次握手 而不是两次 TCP Transfer Control Protocol 是一种面向连接 可靠的 传输层通信协议 特点 好比是打电话 面向连接的 点对点的通信 高可靠的
  • 基础笔记(二):设计模式摘录

    基础笔记 二 设计模式摘录 前言 收录一些自己在开发过程中比较常用的模式 整理出来以便自己复习 毕竟熟才能生巧 才能变通 举一反三 设计模式在大多数灵活性好 可扩展性高 可移植的优秀程序中都有运用 比如界面展现层运用的MVC模式的主要关系就
  • Java俄罗斯方块,老程序员花了一个周末,连接中学年代!

    Java俄罗斯方块 老程序员花了一个周末 连接中学年代 热门专栏推荐 1 Java小游戏 俄罗斯方块 飞机大战 植物大战僵尸等 2 JavaWeb项目实战 图书管理 在线考试 宿舍管理等 3 JavaScript精彩实例 飞机大战 贪吃蛇
  • 从零开始基于nonebot2搭建Q群机器人自动获取各大平台热搜

    从零开始基于nonebot2搭建Q群机器人自动获取各大平台热搜 目录 从零开始基于nonebot2搭建Q群机器人自动获取各大平台热搜 安装步骤 使用方法 退出方法 启用方法 参考链接 安装步骤 安装步骤如下所示 总共仅需简单的17步 1 创
  • 从库mysqldump会导致复制中断

    背景 环境 数据库版本 5 6 24 log 主从架构 一主两从搭配mha 操作步骤 1 开发要求truncate一张表 在删除之前需要备份下数据 2 在从库上使用mysqldump命令做逻辑备份 备份sql mysqldump uXXX