slave开启MTS时执行mysqldump引发死锁案例(2)

简介: slave开启MTS时执行mysqldump引发死锁案例

五、关于woker线程w2的等待


这里可能的原因有2个:

  • 多线程并行的情况下,线程执行的顺序本生就是不定的,很可能线程由于丢失CPU而落后其他线程的处理,因为CPU调度的最小单位是线程。如果保证某个共享内存操作的完整性需要用到mutex、原子变量等技术。
  • 如果w2中的事务本生就包含了多个DML语句,那么获取 GLOBAL READ LOCK 本身就是间歇性的,也就是每个语句结束都会释放,然后下一个语句开始的时候再次open table来获取。

我们来看看第二点,只考虑row_format格式的binlog。

我们知道一个事务可以包含多个语句,每条语句都会包含一个map Event和多个DML Event,当本Event是语句的最后一个Event的时候会使用STMT_END_F进行标记,也正是在这个时候会释放 GLOBAL READ LOCK,源码有如下:



if (get_flags(STMT_END_F))
  {
    if((error= rows_event_stmt_cleanup(rli, thd)))

栈:
#0  MDL_context::release_lock (this=0x7fffa8000a08, duration=MDL_STATEMENT, ticket=0x7fffa800ea40) at /opt/percona-server-locks-detail-5.7.22/sql/mdl.cc:4350
#1  0x0000000001464bf1 in MDL_context::release_locks_stored_before (this=0x7fffa8000a08, duration=MDL_STATEMENT, sentinel=0x0) at /opt/percona-server-locks-detail-5.7.22/sql/mdl.cc:4521
#2  0x000000000146541b in MDL_context::release_statement_locks (this=0x7fffa8000a08) at /opt/percona-server-locks-detail-5.7.22/sql/mdl.cc:4813
#3  0x0000000001865c75 in Relay_log_info::slave_close_thread_tables (this=0x341e8b0, thd=0x7fffa8000970) at /opt/percona-server-locks-detail-5.7.22/sql/rpl_rli.cc:2014
#4  0x0000000001865873 in Relay_log_info::cleanup_context (this=0x341e8b0, thd=0x7fffa8000970, error=false) at /opt/percona-server-locks-detail-5.7.22/sql/rpl_rli.cc:1886
#5  0x00000000017e8fc7 in rows_event_stmt_cleanup (rli=0x341e8b0, thd=0x7fffa8000970) at /opt/percona-server-locks-detail-5.7.22/sql/log_event.cc:11782
#6  0x00000000017e8c79 in Rows_log_event::do_apply_event (this=0x7fffa8017dc0, rli=0x341e8b0) at /opt/percona-server-locks-detail-5.7.22/sql/log_event.cc:11660
#7  0x00000000017cfdcd in Log_event::apply_event (this=0x7fffa8017dc0, rli=0x341e8b0) at /opt/percona-server-locks-detail-5.7.22/sql/log_event.cc:3570
#8  0x00000000018476dc in apply_event_and_update_pos (ptr_ev=0x7fffec14f880, thd=0x7fffa8000970, rli=0x341e8b0) at /opt/percona-server-locks-detail-5.7.22/sql/rpl_slave.cc:4766
#9  0x0000000001848d9a in exec_relay_log_event (thd=0x7fffa8000970, rli=0x341e8b0) at /opt/percona-server-locks-detail-5.7.22/sql/rpl_slave.cc:5300
#10 0x000000000184f9cc in handle_slave_sql (arg=0x33769a0) at /opt/percona-server-locks-detail-5.7.22/sql/rpl_slave.cc:7543
(gdb) p ticket->m_lock->key.mdl_namespace()
$1 = MDL_key::GLOBAL
(gdb) p ticket->m_type
$2 = MDL_INTENTION_EXCLUSIVE
(gdb) p ticket->m_duration
$3 = MDL_STATEMENT


如果下一条语句开始又会重新获取GLOBAL READ LOCK,这就是我说的间歇性获取。


到这里死锁条件已经成熟,只要遇到这种情况就可能需要人为介入才能继续了。


六、关于mysqldump


社区版在如下情况下需要增加FTWRL:

  • 设置了master-data
  • 设置了singal-transaction和flush-logs

percona版在如下情况需要增加FTWRL:

  • 设置了singal-transaction和flush-logs

我们来大概看看社区版的代码如下(代码版本8.0.21),下面是从FTWRL倒UNLOCK的过程:



 if ((opt_lock_all_tables || opt_master_data || //如果设置了 master data 设置flush table with read lock

(opt_single_transaction && flush_logs)) &&//如果设置了single transaction和flush logs 设置flush table with read lock
do_flush_tables_read_lock(mysql)) //设置flush table with read lock
goto err;
/*
/*
Flush logs before starting transaction since
this causes implicit commit starting mysql-5.5.
*/
if (opt_lock_all_tables || opt_master_data ||
(opt_single_transaction && flush_logs) || opt_delete_master_logs) {
if (flush_logs || opt_delete_master_logs) {//如果设置了 flush logs 进行日志刷新
if (mysql_refresh(mysql, REFRESH_LOG)) { //进行日志刷新
DB_error(mysql, "when doing refresh");
goto err;
}
verbose_msg("-- main : logs flushed successfully!\n");
}

/ Not anymore! That would not be sensible. /
flush_logs = false;
}

if (opt_delete_master_logs) {
if (get_bin_log_name(mysql, bin_log_name, sizeof(bin_log_name))) goto err;
}

if (opt_single_transaction && start_transaction(mysql)) goto err; //开启事务 RR

/ Add 'STOP SLAVE to beginning of dump /
if (opt_slave_apply && add_stop_slave()) goto err;

/* Process opt_set_gtid_purged and add SET @@GLOBAL.GTID_PURGED if required.
*/
if (process_set_gtid_purged(mysql)) goto err; //设置GTID,如果设置了gtid_purged 这个函数会跳过

if (opt_master_data && do_show_master_status(mysql)) goto err; //获取主库binlog位置
if (opt_slave_data && do_show_slave_status(mysql)) goto err; //slave_data 设置相关 从show slave中获取
if (opt_single_transaction &&
do_unlock_tables(mysql)) / unlock but no commit! /
goto err;



percona版本中增加了判断函数 check_consistent_binlog_pos,如下(不过多描述)


 if (opt_single_transaction && opt_master_data)
{
/*
See if we can avoid FLUSH TABLES WITH READ LOCK with Binlog_snapshot_*
variables.
*/
consistent_binlog_pos= check_consistent_binlog_pos(NULL, NULL);
}

if ((opt_lock_all_tables || (opt_master_data && !consistent_binlog_pos) ||//consistent_binlog_pos 0 需要 1 不需要
(opt_single_transaction && flush_logs)))
{
if (do_flush_tables_read_lock(mysql))
goto err;
}



七、如何解决

总结如下:

  • master-data 一般备份都会增加,因此只能在低峰期进行备份,尽量减少影响。
  • 考虑关闭参数 slave_preserve_commit_order。但是FTWRL的堵塞还是存在,只是不会产生死锁。
  • 如果压力不大可以考虑关闭MTS。但是FTWRL的堵塞还是存在,只是不会产生死锁。

全文完。

Enjoy MySQL :)

            </div>
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
NoSQL 编译器 程序员
【C语言】 --- 段错误
【C语言】 --- 段错误
998 0
|
12月前
|
人工智能 安全 算法
《信息传播:人工智能助力驱散虚假信息阴霾》
在信息爆炸时代,虚假信息和谣言泛滥,严重影响社会秩序与公众生活。人工智能作为强大的技术工具,通过信息筛选、智能推荐、实时监测等手段,有效识别和阻止虚假信息传播,建立虚假信息数据库、加强审核并提高公众意识。尽管面临技术限制、隐私保护和信息安全等挑战,未来人工智能将在信息传播中发挥更大作用,助力构建健康和谐的信息环境。
310 11
太空资源的开发与利用:太空经济的新篇章
【9月更文挑战第25天】随着科技进步,人类正逐步开发太空资源,开启太空经济的新篇章。太空资源涵盖轨道、矿物与能源三类,如地球轨道支撑着卫星活动,而小行星带和月球则蕴藏丰富矿物质与水冰,特别是月球氦-3及水冰资源,对太空活动至关重要。然而,太空资源开发需克服技术挑战与高成本问题,涉及航天器设计到资源提取等多个环节。尽管如此,其潜在的经济价值巨大,预估地月空间经济活动年产值可达数万亿美元,并将促进太空采矿、制造等新兴工业的发展,为全球经济增长注入新动力,推动人类社会进入新的发展阶段。
|
安全 机器人 API
AppFlow通义千问机器人支持上下文会话
在最新升级的AppFlow中,通义千问对话功能现已支持上下文保留,使对话体验更加流畅。用户可通过配置AppFlow连接流,结合钉钉机器人实现与通义千问的交互。只需几步简单设置,即可在群聊中@机器人进行连续对话。此外,提供了两种创建钉钉机器人的方法:使用Outgoing机制或钉钉开放平台,方便不同需求的用户进行集成。通过这些步骤,您可以轻松实现与通义千问的高效沟通。
494 0
|
人工智能 自然语言处理 前端开发
|
网络协议 安全 网络安全
【专栏】IPv6是为解决IPv4地址不足、安全性和配置复杂性问题而提出的下一代互联网协议
【4月更文挑战第28天】IPv6是为解决IPv4地址不足、安全性和配置复杂性问题而提出的下一代互联网协议。它提供128位地址空间(几乎无限)、简化报文格式、内置IPsec安全机制、自动配置能力及增强的QoS。IPv6的优势包括更高的传输效率、更强的安全性、移动性和组播功能,以及即插即用的设备。然而,部署面临IPv4兼容性、技术更新、经济驱动和安全挑战。随着技术发展,IPv6的普及将成为必然趋势。
1469 1
|
供应链 安全 大数据
什么是关键信息基础设施及其安全保护条例?
关键信息基础设施是国家的重要战略资源,涉及到国家的主权、安全和发展利益。这些设施在国家经济和社会服务中承担着重要角色,其安全稳定运行直接关系到国家安全和经济社会健康发展。让我们一起来了解一下什么是关键信息基础设施及其安全保护条例。
381 0
|
人工智能
【AI Make Money】如何用人工智能赚钱
【AI Make Money】如何用人工智能赚钱
2069 0
|
缓存 自然语言处理 JavaScript
万字长文深度解析JDK序列化原理及Fury高度兼容的极致性能实现
Fury是一个基于JIT动态编译的高性能多语言原生序列化框架,支持Java/Python/Golang/C++/JavaScript等语言,提供全自动的对象多语言/跨语言序列化能力,以及相比于别的框架最高20~200倍的性能。
34428 10
万字长文深度解析JDK序列化原理及Fury高度兼容的极致性能实现
|
弹性计算 负载均衡 小程序
阿里云免费云服务器,新用户免费体验三个月
阿里云免费云服务器,新用户免费体验三个月,阿里云服务器免费试用申请链接入口 ,阿里云个人用户和企业用户均可申请免费试用,最高可以免费使用3个月,阿里云服务器网分享阿里云服务器免费试用申请入口链接及云服务器配置
1116 0