Slave SQL线程与PXB FTWRL死锁问题分析

这篇具有很好参考价值的文章主要介绍了Slave SQL线程与PXB FTWRL死锁问题分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 问题背景

2.27号凌晨生产环境MySQL备库在执行备份期间出现因FLUSH TABLES WITH READ LOCK未释放导致备库复制延时拉大,慢日志内看持锁接近25分钟未释放。

版本:

  • MySQL 5.7.21
  • PXB 2.4.18

慢查询日志:

Slave SQL线程与PXB FTWRL死锁问题分析

备份脚本中的备份命令:

Slave SQL线程与PXB FTWRL死锁问题分析

mysql_kill.sh的主要逻辑内容:

Slave SQL线程与PXB FTWRL死锁问题分析

备份参数:

Slave SQL线程与PXB FTWRL死锁问题分析

2. 问题复现及分析

2.1 问题分析

Slave SQL线程与PXB FTWRL死锁问题分析

  • 144是SQL线程,并行复制中的Coordinator线程;
  • 145/146是并行复制的worker线程,145/146worker线程队列中的事务可以并行执行。
  • 162线程是执行innobackup执行的flush tables with read lock;

144 Coordinator线程分发relay log中事务时发现这个事务不能执行,要等待前面的事务完成提交,所以处于waiting for dependent transaction to commit的状态。145/146线程和备份线程162形成死锁,145线程等待162线程 global read lock 释放,162线程占有MDL::global read lock 全局读锁,申请全局commit lock的时候阻塞等待146线程,146线程占有MDL:: commit lock,因为从库设置slave_preserve_commit_order=1,保证从库binlog提交顺序,而146线程执行事务对应的binlog靠后面,所以等待145的事务提交。最终形成了145->162->146->145的死循环,形成死锁。

三个线程相互形成死锁,还是很少见的。

2.2 相关参数为何未生效

--ftwrl-wait-timeout=60 指的是执行FTWRL之前,如果检测到存在长SQL,先等待指定时间(秒),如果超时后还存在长SQL,则备份报错退出。默认为0则表示立即执行。

--ftwrl-wait-threshold=5 指的是执行FTWRL之前,检测长SQL的方法,如果在执行flush前存在已经运行了超过指定时间(秒)的SQL,则将该SQL定义为长SQL,默认60s。

--kill-long-queries_timeout=0 在执行FTWRL后,如果flush操作被阻塞了N秒,则kill掉阻塞它的线程,默认0的情况就是不kill任何阻塞flush的SQL,直到该SQL执行完成。

从上面各个参数的解释,不难看出,--ftwrl-wait-*参数是针对执行FTWRL之前的长SQL检测机制,对于已执行FTWRL时无济于事,--kill-long-*参数则是设置默认值0,不起任何作用。

3. 结论与建议

  • PXB备份中执行FTWRL加全局读锁与SQL线程形成死锁是导致本次从库延迟过高的原因。
  • 启用--kill-long-queries\_type--kill-long-queries\_timeout参数,在检测到flush被阻塞后执行kill掉相关线程的操作。比较暴力,存在较大的风险,若备库无业务访问则可考虑。
  • 启用--safe-slave-backup参数,执行备份时该参数会停掉SQL线程,从而避免死锁的产生。仅建议在无业务访问的备库上执行。
  • 设置MySQL参数slave\_preserve\_commit\_order=0,关闭从库binlog的顺序提交,关闭该参数只是影响并行复制的事务在从库的提交顺序,对最终的数据一致性并无影响,所以如果无特别要求从库的binlog顺序必须与主库保持一致,可以考虑设置slave\_preserve\_commit\_order=0避免死锁的产生。

Enjoy GreatSQL 😃

关于 GreatSQL

GreatSQL是适用于金融级应用的国内自主开源数据库,具备高性能、高可靠、高易用性、高安全等多个核心特性,可以作为MySQL或Percona Server的可选替换,用于线上生产环境,且完全免费并兼容MySQL或Percona Server。

相关链接: GreatSQL社区 Gitee GitHub Bilibili

GreatSQL社区:

社区博客有奖征稿详情:https://greatsql.cn/thread-100-1-1.html

Slave SQL线程与PXB FTWRL死锁问题分析

技术交流群:

微信:扫码添加GreatSQL社区助手微信好友,发送验证信息加群

Slave SQL线程与PXB FTWRL死锁问题分析文章来源地址https://www.toymoban.com/news/detail-861897.html

到了这里,关于Slave SQL线程与PXB FTWRL死锁问题分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【SQL Server】表死锁/解锁和sql语句分析

    1 首先创建一个测试用的表: 2 执行下面的SQL语句将此表锁住: 3 通过下面的语句可以查看当前库中有哪些表是发生死锁的: 4 上面语句执行结果如下: spid :被锁进程ID。 tableName:发生死锁的表名。 5 只需要使用kill来杀掉被锁的进程ID就可以对表进行解锁: 需要将锁

    2024年02月04日
    浏览(42)
  • 【并发编程】多线程安全问题,如何避免死锁

    从今天开始阿Q将陆续更新 java并发编程专栏 ,期待您的订阅。 在系统学习线程之前,我们先来了解一下它的概念,与经常提到的进程做个对比,方便记忆。 线程和进程是操作系统中的两个重要概念,它们都代表了程序运行时的执行单位,它们的出现是为了更好地管理计算机

    2024年02月11日
    浏览(50)
  • 线程的状态,多线程带来的风险,synchronized关键字及死锁问题

    目录 状态  线程的意义 多线程带来的风险——线程安全✅ 线程安全的概念 线程不安全的原因 抢占式执行,随机性调度 修改共享数据 原子性-加🔒 可见性 指令重排序 解决线程不安全问题(学完线程再总结) synchronized——监视器锁monitor lock​编辑   互斥 使用示例

    2024年02月06日
    浏览(51)
  • (17)线程的实例认识:wait,waitany,waitall,及经典死锁问题

         1、界面: 一个textbox,四个button。                       2、程序:前面(15)的book类与data类             1、t.Wait();         Task.Wait方法用于阻塞当前线程,并等待异步操作的完成。它是一个实例方法,针对具体的单一任务使用,用法:             task.Wait(

    2024年02月09日
    浏览(54)
  • MySQL next-key锁引发的死锁问题分析与处理

    当方法A被多线程并发执行的时候会偶现死锁问题,分析问题: 因为业务上有限制:每次并发执行方法A的时候,每个线程执行到sql里面的参数:data_name_en有可能是一样的,但是空间#{tenantId}肯定都是不一样的,也就是并发时候,线程1要删除和插入的数据一定和线程2要删除和插

    2024年02月11日
    浏览(48)
  • mysql 主从同步排查和处理 Slave_IO、Slave_SQL

    目录 查看主从是否同步 详解Slave_IO、Slave_SQL  判断主从完全同步 各个 Log_File 和 Log_Pos的关系 修复命令 Slave_IO_Running、Slave_SQL_Running,这两个值是Yes表示正常,No是异常 使用竖排显示: Slave_IO 线程负责把 主库 的bin日志( Master_Log )内容,抄写到 从库 的中继日志上( Relay_Log )。

    2024年02月15日
    浏览(53)
  • java死锁、线程状态、线程通信、线程池

    java实现多线程: [1]继承Thread类并重写run方法 [2]实现Runnable接口 线程Thread中常用的方法: setName(): Thread.currentThread().getName(): ​ static void sleep(); static void yield(): join(): setDeamon()设置后台线程 线程安全问题: ---当多个线程共享同一个资源时,对该资源的操作就会出现线程安全问题。

    2024年02月13日
    浏览(39)
  • MySql主从复制1032错误(Slave_IO_Running: Yes Slave_SQL_Running: No)

    报错: Last_SQL_Error: Could not execute Delete_rows event on table hr.test; Can’t find record in ‘test’, Error_code: 1032; handler error HA_ERR_END_OF_FILE; the event’s master log mysqlbin.000017, end_log_pos 3392 原因: 个人搭建mysql主从复制后,进行相关表的主从同步练习进行多次操作发现表数据的增加、删除、更

    2024年02月13日
    浏览(43)
  • 【Linux】线程互斥 -- 互斥锁 | 死锁 | 线程安全

    我们写一个多线程同时访问一个全局变量的情况(抢票系统),看看会出什么bug: 假如创建4个线程同时抢票,总票数有10000张,每个线程抢到票以后减一,按照正常情况我们应该是抢票到0截至。 多个线程交叉执行本质:就是让调度器尽可能的频繁发生线程调度与切换 线程一般

    2024年02月14日
    浏览(45)
  • Java多线程编程中的线程死锁

    ​ 在多线程编程中,线程死锁是一种常见的问题,它发生在两个或多个线程互相等待对方释放资源的情况下,导致程序无法继续执行 。本文将介绍线程死锁的概念、产生原因、示例以及如何预防和解决线程死锁问题。 线程死锁的概念 ​ 线程死锁是指两个或多个线程被阻塞

    2024年02月12日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包