如何迅速并识别处理MDL锁阻塞问题
摘要:TaurusDB推出MDL锁视图功能,帮助用户迅速识别并处理MDL锁阻塞问题,从而有效减少对业务的负面影响,提升数据库管理效率。
一、背景
二、MDL锁阻塞场景分析
表1 MDL锁阻塞案例
- SESSION 4执行TRUNCATE操作时,被其他SESSION持有的table metadata lock阻塞;
- SESSION 5执行SELECT操作时,也同样被阻塞;
- 无法确定哪个会话(2或3?)阻塞了SESSION 4和SESSION 5;
三、MDL锁视图介绍
表2 MDL锁视图表字段含义
四、MDL锁视图使用方法
图 2 元数据锁视图结果
- 会话4在等待获取test库t2表的MDL_EXCLUSIVE模式的元数据锁;
- 会话5在等待获取test库t2表的MDL_SHARED_READ模式的元数据锁;
- 会话3持有test库t2表t2的MDL锁,该MDL锁为事务级别,只要session 3 的事务不提交,session 4和5便会一直阻塞。
SELECT f.processlist_id, p.Info AS sql_info FROM ( SELECT DISTINCT c.blocking_processlist_id AS processlist_id FROM ( SELECT DISTINCT b.THREAD_ID AS blocking_processlist_id FROM information_schema.metadata_lock_info a JOIN information_schema.metadata_lock_info b ON a.TABLE_SCHEMA = b.TABLE_SCHEMA AND a.TABLE_NAME = b.TABLE_NAME AND a.lock_status = 'PENDING' AND b.lock_status = 'GRANTED' AND a.THREAD_ID <> b.THREAD_ID ) c WHERE c.blocking_processlist_id NOT IN ( SELECT DISTINCT d.THREAD_ID AS blocked_processlist_id FROM information_schema.metadata_lock_info d JOIN information_schema.metadata_lock_info e ON d.TABLE_SCHEMA = e.TABLE_SCHEMA AND d.TABLE_NAME = e.TABLE_NAME AND d.lock_status = 'PENDING' AND e.lock_status = 'GRANTED' AND d.THREAD_ID <> e.THREAD_ID ) ) f JOIN information_schema.processlist p ON processlist_id = p.Id;
五、原理解析
图 3. MDL锁基本概念图
- m_ticket_store: 用来存储当前线程获取的所有MDL_ticket。为了提升搜索效率,根据MDL锁的持续时间(语句执行时间段,事务执行时间段和显示指定时间段)将其划分为三个链表,在需要获取MDL锁前,会先在这些链表内查询是否已经获取到了相同的或这是更强类型的MDL锁,如果搜索不到继续获取MDL锁。
图 4 MDL锁视图实现流程
i_s_metadata_lock_info_fill_table() { //对系统中每一个THD执行List_THD_MDL_tickets函数找到持有和等待的MDL锁 Global_THD_manager::get_instance()->do_for_all_thd_copy(List_THD_MDL_tickets) } List_THD_MDL_tickets() { // 获取当前THD的MDL_context: MDL_context &mdl_ctx = inspect_thd->mdl_context; // 获取当前THD持有的MDL锁 const MDL_ticket_store &m_ticket_store = mdl_ctx.get_mdl_ticket_store(); // 遍历每个m_ticket_store的三个作用范围内的MDL_ticket for (int i = 0; i < MDL_DURATION_END; i++) { MDL_ticket_store::List_iterator it = m_ticket_store.list_iterator(duration); lock_extras.duration = duration; while ((ticket = it++)) { enum_mdl_duration duration = (enum_mdl_duration)(i); // 根据MDL_ticket中的信息填充到MDL锁视图中 fill_row_callback(ticket, &lock_extras, args); } } // 获取当前THD等待的MDL锁 ticket = dynamic_cast<const MDL_ticket *>(mdl_ctx.get_m_waiting_for()); if (ticket != nullptr) { // 填充MDL锁的额外信息,PENDING状态和作用范围 lock_extras.lock_status = MDL_ticket::PENDING; lock_extras.duration = ticket->get_duration(); // 根据MDL_ticket中的信息填充到MDL锁视图中 fill_row_callback(ticket, &lock_extras, args); } }
六、总结

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
课程实录 | Ingress Controller 与 Master 的通讯机制
原文作者:陶辉 原文链接:课程实录 | Ingress Controller 与 Master 的通讯机制 内容来源:NGINX 中文官网 NGINX 唯一中文官方社区 ,尽在nginx.org.cn 编者按——本文为系列课程《K8S Ingress Controller技术细节探讨》的第二节《Ingress Controller 与 Master 的通讯机制》的课程实录,点击观看课程回放。 在本节课程中,陶辉老师介绍了 Ingress Controller 与 Master 节点的通讯机制和流程,并列举了不同应用场景下的注意事项。 课程内容包括 Ingress Controller 的通讯原理,Kubernetes 通讯协议以及 K8s 官方 Ingress Controller 的源代码架构。 课程背景简介 在上一节课中,我们详细阐述了 Ingress Controller 的工作机制。本节课将专门探讨 Ingress Controller 如何与 Master 节点进行通信。尽管这个知识点相对较小,但具有非常重要的实际意义,包含以下四点: 1. 了解 Ingress Cont...
- 下一篇
金蛇贺岁迎新春,LFOSSA陪您开启 2025 技能进阶之路!LF 官方认证考试及培训65 折起!
金蛇起舞贺新春,春风送暖启新篇! 在这辞旧迎新的美好时刻,LFOSSA 向广大开源爱好者致以诚挚的祝福:让我们告别2024年的辉煌,共同迎接2025年的崭新篇章!愿您新春愉快,蛇年吉祥,步步高升,万事如意! 新的一年,愿您的学习与事业如蛇般灵动智慧,充满新机遇与新成就,在开源领域不断攀登更高的峰巅。LFOSSA 将与您一路同行,成为您追逐梦想的坚定伙伴,点亮前行路上的希望之光! LFOSSA 2025 新春限时折扣 为庆祝蛇年的到来,LFOSSA 于春节期间精心准备了新春特惠活动,LF官方认证考试/培训/部分套购产品65 折起,助力您的开源学习与职业发展! 活动时间: 2025年1月21日 9:00 至 2025年2月3日 23:59 温馨提示:自2月5日起,LF官方认证全线升级!考试、培训、精选套购产品,价格即将上调!抓紧春节特惠的最后机会,尽享折扣福利! 参与方式 1.访问 LFOSSA 官网:打开https://training.linuxfoundation.cn 2.选择学习产品:浏览并挑选适合您的认证考试或课程产品。 3.享受折扣:进入结账页面,系统将自动为订单应用...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Red5直播服务器,属于Java语言的直播服务器
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2全家桶,快速入门学习开发网站教程