如何迅速并识别处理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条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS关闭SELinux安全模块
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS6,CentOS7官方镜像安装Oracle11G
- Crontab安装和使用
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长