什么情况下 MySQL 连查询都能被阻塞?

MySQL 的锁也是不少,在哪种情况下会连查询都能被阻塞?这是一个有意思的问题。

工作中,很多开发和 DBA 可能接触较多的锁也就行锁了。对于行锁,阻塞写能理解,阻塞读实在是想不到。能阻塞读的那肯定是颗粒度更大的锁了,比如表级别的。

作者:贾特特,MySQL DBA 从业者,公众号『数据库运维札记』作者,目前任职于某游戏公司担任DBA工程师

爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。

本文约 2000 字,预计阅读需要 8 分钟。

MySQL 的锁也是不少,在哪种情况下会连查询都能被阻塞?这是一个有意思的问题。

工作中,很多开发和 DBA 可能接触较多的锁也就行锁了。对于行锁,阻塞写能理解,阻塞读实在是想不到。能阻塞读的那肯定是颗粒度更大的锁了,比如表级别的。

本文操作环境为 MySQL 8.0。

MySQL 表级锁有两种实现

  1. 服务器(SERVER)层:本层的锁定主要是元数据锁(metadata lock,MDL)。
  2. 存储引擎(ENGINE)层:本层不同的存储引擎可能会实现不同的锁定策略。例如 MyISAM 引擎实现了表级锁,InnoDB 存储引擎实现了行级锁和表级锁,其中表级锁是通过意向锁体现的。

元数据锁(MDL)是由 SERVER 层管理,用于锁定数据库对象的元数据信息,如:表结构、索引等。元数据锁可以阻止对表结构的改变,以确保数据定义的一致性。

元数据锁的类型

点击放大

每种锁类型后面会详细介绍。简单来说,对于元数据锁而言,当对一个表进行增删改查操作的时候,会加 元数据读锁。当对表数据结构进行变更的时候会加 元数据写锁它读写互斥,写写互斥,只有读读不冲突。

意向锁是在存储引擎层实现的,用于协调不同事务对表级锁和行级锁的请求。当一个事务在某个层次(表级或行级)上获取锁时,会首先获取对应层次的意向锁,以提示其他事务该事务在该层次上有锁的意向。这样可以在更高层次上减少锁冲突,提高并发性能。

InnoDB 存储引擎的意向锁种类

  1. 意向共享锁(Intention Shared Lock,IS):事务打算给数据行加共享锁(S 锁)。
  2. 意向排他锁(Intention Exclusive Lock,IX):事务打算给数据行加排他锁(X 锁)。

这样看来,表对象不可读写有种情况可能就是元数据锁互斥所导致的。

Waiting for table metadata lock

本节中未完成的读写事务,在实际中可能是未完成的大事务,也可能是未显式结束的事务。

元数据锁互斥(未完成的读事务)

会话 1 执行:有未完成的读事务,此时获取了元数据共享读锁。

MDL_SHARED_READ: 这个锁允许会话读取表的数据,并允许其他会话获取 SHARED_READ 或 SHARED_WRITE 锁,但不允许获取 SHARED_NO_READ_WRITE 或 EXCLUSIVE 锁。

会话 2 执行:ALTER 表结构变更语句,此时 ALTER 语句要获取元数据排它锁。

MDL_EXCLUSIVE: 这个锁允许会话读取和修改表的数据和结构,但不允许其他会话获取任何类型的锁。

元数据锁互斥等待,之后其他会话对于所涉及表不可读写。

元数据锁互斥(未完成的写事务)

会话 1 执行:有未完成的写事务,此时获取了元数据写锁。

MDL_SHARED_WRITE: 这个锁允许会话读取和修改表的数据,并允许其他会话获取 SHARED_READ 锁,但不允许获取 SHARED_WRITE、SHARED_NO_READ_WRITE 或 EXCLUSIVE 锁。

会话 2 执行:ALTER 表结构变更语句,此时 ALTER 语句要获取元数据排它锁。

MDL_EXCLUSIVE:这个锁允许会话读取和修改表的数据和结构,但不允许其他会话获取任何类型的锁。

元数据锁互斥等待,之后其他会话对于所涉及表不可读写。

LOCK TABLES ... READ/WRITE

LOCK TABLES 可以显式获取表锁,需要注意的是会话只能自己获取和释放表锁。UNLOCK TABLES 可以显式释放当前会话的表锁。

LOCK TABLES … READ

会话 1 执行:lock tables db_version read;

MDL_SHARED_READ_ONLY: 这个锁允许会话读取表的数据,并允许其他会话获取 SHARED_READ 锁,但不允许获取 SHARED_WRITE、SHARED_NO_READ_WRITE 或 EXCLUSIVE 锁。

此时 db_version 加了元数据共享只读锁。

会话 2 执行:ALTER 表结构变更语句,此时 ALTER 语句要获取元数据排它锁,元数据锁互斥等待。

之后所涉及表对象将不可读写。

LOCK TABLES … WRITE

会话 1 执行:lock tables db_version write;

MDL_SHARED_NO_READ_WRITE: 这个锁允许当前会话读取和修改表的数据,但不允许其他会话获取任何类型的锁。

此时 db_version 加上了独占写锁。只能在 会话 1 读写,它会阻止其他会话获取任何类型的锁。

因此其他会话既不能读也不能写,当然查询也会被阻塞了。

需要注意的是,此时 会话 1 对其他表也会不可读写。

FLUSH TABLES & WAITING FOR TABLE FLUSH

FLUSH TABLES 关闭所有打开的表,强制关闭所有正在使用的表,并刷新准备好的语句缓存。当存在活动的 LOCK TABLES 时,不允许执行 FLUSH TABLES 操作。

FLUSH TABLES

  1. ALTER 表结构时,执行 FLUSH TABLES 阻塞,从而导致表对象不可读写。

  1. LOCK TABLES 后,执行 FLUSH TABLES 会被阻塞,从而导致表对象不可读写。

    • 会话 1 执行:lock tables db_version read;
    • 会话 2 执行:flush tables;

此时,会话 2 会被阻塞,其他会话对所涉及表将不可读写。SHOW PROCESSLIST 中会提示 Waiting for table flush

需要说明的是,会话 1 执行完 lock tables...read lock 后,其他会话执行 DML 增删改语句,虽然会因获取不到元数据锁而阻塞,但不会阻塞其他会话执行 SELECT 查询。

换言之,执行 lock tables...read 后,当遇到元数据锁排它锁互斥阻塞(ALTER 语句)或者 FLUSH TABLES 发生阻塞后,才会发生所涉及表对象不可读写。

处理延伸

如何处理并找到源头 SQL 呢?

对于因元数据锁互斥而导致的表不可读写,一般可以通过 sys 库下的内置视图来查看。可能会涉及的表:

sys.schema_table_lock_waits: 可直接通过 sys 下内置视图,看到元数据锁互斥的相关信息。

information_schema.innodb_trx: 找到长时间未提交的事务。

对于因 FLUSH TABLE 等待而导致的表不可读写的场景,通过上述视 图/表 是不一定有数据的。大致会有以下两种情况:

Waiting for table flush: 可以按如下方式寻找源头。这种情况主要出现于因 FLUSH TABLES 而等待后,执行 DML 语句。

SELECT
  b.PROCESSLIST_ID,
  b.THREAD_ID,
  a.OBJECT_NAME,
  a.LOCK_TYPE,
  a.LOCK_STATUS,
  b.PROCESSLIST_STATE 
FROM
  `performance_schema`.metadata_locks a
  LEFT JOIN `performance_schema`.threads b ON a.OWNER_THREAD_ID = b.THREAD_ID 
WHERE
  a.OBJECT_SCHEMA = 'tmp';

也可以通过线程 ID 找到会话最近的 10 条语句进一步判断确认。

select THREAD_ID,event_id,sql_text from 
`performance_schema`.events_statements_history
where THREAD_ID =  14503
order by event_id;

Waiting for table metadata lock: 可以参考元数据锁互斥而导致的表不可读写处理。这种情况主要出现于因 FLUSH TABLES 而等待后,执行 DDL 语句如 ALTER TABLE

总结

以下情况会导致表对象不可读写:

  1. Waiting for table metadata lock 而导致的表对象不可读写。
  2. Waiting for table flush 而导致的表对象不可读写。

更多技术文章,请访问:https://opensource.actionsky.com/

关于 SQLE

SQLE 是一款全方位的 SQL 质量管理平台,覆盖开发至生产环境的 SQL 审核和管理。支持主流的开源、商业、国产数据库,为开发和运维提供流程自动化能力,提升上线效率,提高数据质量。

SQLE 获取

类型地址
版本库https://github.com/actiontech/sqle
文档https://actiontech.github.io/sqle-docs/
发布信息https://github.com/actiontech/sqle/releases
数据审核插件开发文档https://actiontech.github.io/sqle-docs/docs/dev-manual/plugins/howtouse

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/603098.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

用于视频大型多模态模型(Video-LMMs)的复杂视频推理和鲁棒性评估套件

1 引言 最近,大型语言模型(LLMs)在同时处理广泛的NLP任务的同时展示了令人印象深刻的推理和规划能力。因此,将它们与视觉模态集成,特别是用于视频理解任务,催生了视频大型多模态模型(Video-LMMs)。这些模型充当视觉聊天机器人,接受文本和视频作为输入,并处理各种任务,包括视频…

技术分享 | 京东商品API接口|京东零售数据可视化平台产品实践与思考

导读 本次分享题目为京东零售数据可视化平台产品实践与思考。 主要包括以下四个部分: 1.京东API接口介绍 2. 平台产品能力介绍 3. 业务赋能案例分享 01 京东API接口介绍 02 平台产品能力介绍 1. 产品矩阵 数据可视化产品是一种利用数据分析和可视化技术&…

软件测试小妙招:详细解读 postman接口测试导入导出操作

🍅 视频学习:文末有免费的配套视频可观看 🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 postman中的集合脚本,环境变量、全局变量全部都可以导出,然后分享给团队…

618购物狂欢有哪些值得买的?五款心水好物真实分享!

618购物狂欢即将到来,你是不是已经迫不及待地期待着各种优惠和折扣?在这个充满购物狂欢的时刻,大家可能会犹豫在众多商品中该如何选择。不用担心!我已经为大家精心挑选了五款心水好物,并进行了真实的分享,帮…

在家中访问一个网站的思考

在家中访问一个网站的思考 1、家庭网络简介2、家庭WLAN DHCP2.1、家庭路由器PPPOE拨号2.2、DHCP(动态主机配置协议)2.3、接入家庭网的主机IP地址2.4、家庭总线型以太网2.5、Mac地址2.6、ARP协议2.7、IP协议 & UDP/TCP协议2.8、NAT(Netwo…

使用凌鲨建立软件研发技能学习小组

凌鲨(OpenLinkSaas)的团队功能除了提供论坛功能,还能记录团队成员的成长记录。 使用方法 打开团队功能 团队功能在默认情况下是关闭的,你可以在登录后打开团队功能开关。 创建学习团队 日报/周报/个人目标一般是企业团队需要,建议关闭。 …

FPGA第二篇,FPGA与CPU GPU APU DSP NPU TPU 之间的关系与区别

简介:首先,FPGA与CPU GPU APU NPU TPU DSP这些不同类型的处理器,可以被统称为"处理器"或者"加速器"。它们在计算机硬件系统中承担着核心的计算和处理任务,可以说是系统的"大脑"和"加速引擎&qu…

通过 Java 操作 redis -- set 集合基本命令

关于 redis set 集合类型的相关命令推荐看Redis - Set 集合 要想通过 Java 操作 redis,首先要连接上 redis 服务器,推荐看通过 Java 操作 redis -- 连接 redis 本博客只介绍了一小部分常用的命令,其他的命令根据上面推荐的博客也能很简单的使…

12大价值:揭秘可视化大屏在机械行业应用(大量案例图)

1. 生产监控: 可视化数据大屏可以实时显示机械自动化生产线的运行状态、生产进度、设备故障等信息,帮助管理人员及时了解生产情况并做出相应的决策。 2. 故障诊断: 通过可视化数据大屏,可以将机械自动化设备的故障信息以图表、…

低代码在物品领用领域数字化转型的案例分析

办公用品管理数字化不仅代表了企业管理模式的革新,更是提升运营效率和成本控制的关键举措。通过数字化手段,企业能够实现采购、库存、领用等流程的自动化和智能化管理,大幅减少人工操作,提高处理速度,确保数据的准确性…

Zabbix+Grafana-常见报错及异常处理方式记录

文章目录 Zabbix安装篇Zabbix Web页面连接数据库失败 Zabbix使用篇中文显示不全 Zabbix报警篇新建的用户,配置报警后,无法收到报警 Grafana安装篇Windows系统安装时,添加zabbix报错:An error occurred within the plugin Zabbix安…

STM32快速入门(串口传输之USART)

STM32快速入门(串口传输之USART) 前言 USART串口传输能实现信息在设备之间的点对点传输,支持单工、半双工、全全双工,一般是有三个引脚:TX、RX、SW_RX(共地)。不需要一根线来同步时钟。最大优…

【小迪安全2023】第61天:服务攻防-中间件安全CVE复现K8sDockeruettyWebsphere

🍬 博主介绍👨‍🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~ ✨主攻领域:【渗透领域】【应急响应】 【Java、PHP】 【VulnHub靶场复现】【面试分析】 🎉点赞➕评论➕收…

不要和别人比,要和自己的过去比!才会有进步!

现在的人都喜欢拿自己去和别人比较,当然是和比你混得好的人比,比你弱的你也不会去比。比如这个朋友又换了一辆车,那个朋友又买了一套房,另一个朋友又加薪了等等,比来比去总觉得比不上别人。这样比较对自己很不好&#…

【C语言视角】数据结构之~二叉树

前言:总所周知~数据结构的二叉树对于初学者来说是一个十分难理解的知识点。接下来,请阅读本人对二叉树拙劣的理解~ 目录 1.二叉树概念及结构 和性质 二叉树的结构 二叉树的存储结构 2.二叉树顺序结构 3.二叉树链式结构的实现 二叉树层序遍历 1.二叉树…

指定地区|CSC高级研究学者赴澳大利亚访学交流

CSC高级研究学者均是正高或博导级的,学术背景较强,多数能DIY联系到国外合作机构。但也有些申请者因指定地域或学校,或须在短期内获取邀请函故而求助于我们。本案例D教授就指定澳大利亚的墨尔本地区,我们最终用维多利亚大学的邀请函…

优化理论复习——(四)

无约束优化专题,主要使用了序列无约束极小化方法 无约束优化问题相关解法 最优性条件 互补松弛条件 对于一般约束优化问题: 整理一下就是著名的kkt条件: 这里只需要注意一点,那就是互补松弛条件只对不等式约束有限制。 然后是…

Metasploit Framework(MSF)从入门到实战(二)

Metasploit Framework(MSF)从入门到实战(一)_安装msf更新-CSDN博客 MSF模块介绍 MSF有7个模块,分别对下面目录下的7个子文件夹: auxiliary(辅助模块 ) show auxiliary //查看所有…

Apache DolphinScheduler 4月简报:社区发展与技术革新速递

各位热爱 DolphinScheduler 的小伙伴们,4 月份的 DolphinScheduler 社区月报更新啦!这里将记录 DolphinScheduler 社区每月的重要更新,欢迎关注! 月度 Merge 之星 感谢以下小伙伴 4 月为 Apache DolphinScheduler 所做的精彩贡献…

【话题】如何看待AI技术,以及AI技术的发展现状和未来趋势

大家好,我是全栈小5,欢迎阅读小5的系列文章,这是《话题》系列文章 目录 背景一、引言二、AIGC技术的发展现状2.1、技术突破与成果2.2、应用领域的拓展2.3、市场规模的增长 三、AIGC技术的未来趋势3.1、技术融合与创新3.2、应用领域的深化3.3、…