电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

詳細分析mysql MDL元數(shù)據(jù)鎖

瀏覽:2日期:2023-10-13 14:33:05

前言:

當你在MySQL中執(zhí)行一條SQL時,語句并沒有在你預期的時間內(nèi)執(zhí)行完成,這時候我們通常會登陸到MySQL數(shù)據(jù)庫上查看是不是出了什么問題,通常會使用的一個命令就是 show processlist,看看有哪些session,這些session在做什么事情。當你看到 waiting for table metadata lock 時,那就是遇到MDL元數(shù)據(jù)鎖了。本篇文章將會介紹MDL鎖的產(chǎn)生與排查過程。

1.什么是MDL鎖

MDL全稱為metadata lock,即元數(shù)據(jù)鎖。MDL鎖主要作用是維護表元數(shù)據(jù)的數(shù)據(jù)一致性,在表上有活動事務(顯式或隱式)的時候,不可以對元數(shù)據(jù)進行寫入操作。因此從MySQL5.5版本開始引入了MDL鎖,來保護表的元數(shù)據(jù)信息,用于解決或者保證DDL操作與DML操作之間的一致性。

對于引入MDL,其主要解決了2個問題,一個是事務隔離問題,比如在可重復隔離級別下,會話A在2次查詢期間,會話B對表結構做了修改,兩次查詢結果就會不一致,無法滿足可重復讀的要求;另外一個是數(shù)據(jù)復制的問題,比如會話A執(zhí)行了多條更新語句期間,另外一個會話B做了表結構變更并且先提交,就會導致slave在重做時,先重做alter,再重做update時就會出現(xiàn)復制錯誤的現(xiàn)象。

元數(shù)據(jù)鎖是server層的鎖,表級鎖,每執(zhí)行一條DML、DDL語句時都會申請MDL鎖,DML操作需要MDL讀鎖,DDL操作需要MDL寫鎖(MDL加鎖過程是系統(tǒng)自動控制,無法直接干預,讀讀共享,讀寫互斥,寫寫互斥),申請MDL鎖的操作會形成一個隊列,隊列中寫鎖獲取優(yōu)先級高于讀鎖。一旦出現(xiàn)寫鎖等待,不但當前操作會被阻塞,同時還會阻塞后續(xù)該表的所有操作。事務一旦申請到MDL鎖后,直到事務執(zhí)行完才會將鎖釋放。(這里有種特殊情況如果事務中包含DDL操作,mysql會在DDL操作語句執(zhí)行前,隱式提交commit,以保證該DDL語句操作作為一個單獨的事務存在,同時也保證元數(shù)據(jù)排他鎖的釋放)。

注意:支持事務的InnoDB引擎表和不支持事務的MyISAM引擎表,都會出現(xiàn)Metadata Lock Wait等待現(xiàn)象。一旦出現(xiàn)Metadata Lock Wait等待現(xiàn)象,后續(xù)所有對該表的訪問都會阻塞在該等待上,導致連接堆積,業(yè)務受影響。

2.模擬與查找MDL鎖

MDL鎖通常發(fā)生在DDL操作掛起的時候,原因是有未提交的事務對該表進行DML操作。而MySQL的會話那么多,不知道哪個會話的操作沒有及時提交影響了DDL。通常我們排查這類問題,往往需要從information_schema.innodb_trx表中查詢當前在執(zhí)行的事務,但當SQL已經(jīng)執(zhí)行過了,沒有commit,這個時候這個表中是看不到SQL的。

在MySQL5.7中,performance_schema庫中新增了metadata_locks表,專門記錄MDL的相關信息。首先要開啟MDL鎖記錄,執(zhí)行如下SQL開啟:

UPDATE performance_schema.setup_instrumentsSET ENABLED = ’YES’, TIMED = ’YES’WHERE NAME = ’wait/lock/metadata/sql/mdl’;

下面展示下模擬及查找MDL鎖的過程:

# 會話1 事務中執(zhí)行DML操作mysql> begin;Query OK, 0 rows affected (0.00 sec)mysql> insert into student_tb (stu_id,stu_name) values (1009,’xin’);Query OK, 1 row affected (0.00 sec)mysql> select * from student_tb;+--------------+--------+----------+---------------------+---------------------+| increment_id | stu_id | stu_name | create_time | update_time |+--------------+--------+----------+---------------------+---------------------+| 1 | 1001 | from1 | 2019-11-28 16:36:14 | 2019-11-28 16:36:14 || 2 | 1002 | dfsfd | 2019-11-28 16:36:14 | 2019-11-28 16:36:14 || 3 | 1003 | fdgfg | 2019-11-28 16:36:14 | 2019-11-28 16:36:14 || 4 | 1004 | sdfsdf | 2019-11-28 16:36:14 | 2019-11-28 16:36:14 || 5 | 1005 | dsfsdg | 2019-11-28 16:36:14 | 2019-11-28 16:36:14 || 6 | 1006 | fgd | 2019-11-28 16:36:14 | 2019-11-28 16:36:14 || 7 | 1007 | fgds | 2019-11-28 16:36:14 | 2019-11-28 16:36:14 || 8 | 1008 | dgfsa | 2019-11-28 16:36:14 | 2019-11-28 16:36:14 || 9 | 1009 | xin | 2019-11-28 17:05:29 | 2019-11-28 17:05:29 |+--------------+--------+----------+---------------------+---------------------+# 會話2 對該表加字段 執(zhí)行DDL操作 發(fā)現(xiàn)DDL掛起mysql> alter table student_tb add stu_age int after stu_name;# 會話3 查詢所有會話 發(fā)現(xiàn)發(fā)生MDL鎖mysql> show processlist;+----+------+-----------+--------+---------+------+---------------------------------+-------------------------------------------------------+| Id | User | Host | db | Command | Time | State | Info |+----+------+-----------+--------+---------+------+---------------------------------+-------------------------------------------------------+| 31 | root | localhost | testdb | Sleep | 125 | | NULL || 32 | root | localhost | testdb | Query | 7 | Waiting for table metadata lock | alter table student_tb add stu_age int after stu_name || 33 | root | localhost | testdb | Query | 0 | starting | show processlist |+----+------+-----------+--------+---------+------+---------------------------------+-------------------------------------------------------+# 會話3 查看metadata_locks表記錄 發(fā)現(xiàn)student_tb表有MDL鎖沖突mysql> select * from performance_schema.metadata_locks;+-------------+--------------------+----------------+-----------------------+---------------------+---------------+-------------+--------+-----------------+----------------+| OBJECT_TYPE | OBJECT_SCHEMA | OBJECT_NAME | OBJECT_INSTANCE_BEGIN | LOCK_TYPE | LOCK_DURATION | LOCK_STATUS | SOURCE | OWNER_THREAD_ID | OWNER_EVENT_ID |+-------------+--------------------+----------------+-----------------------+---------------------+---------------+-------------+--------+-----------------+----------------+| TABLE | testdb | student_tb | 94189250717664 | SHARED_WRITE | TRANSACTION | GRANTED | | 56 | 34 || GLOBAL | NULL | NULL | 139764477045472 | INTENTION_EXCLUSIVE | STATEMENT | GRANTED | | 57 | 18 || SCHEMA | testdb | NULL | 139764477697808 | INTENTION_EXCLUSIVE | TRANSACTION | GRANTED | | 57 | 18 || TABLE | testdb | student_tb | 139764477697904 | SHARED_UPGRADABLE | TRANSACTION | GRANTED | | 57 | 18 || TABLE | testdb | student_tb | 139764477697696 | EXCLUSIVE | TRANSACTION | PENDING | | 57 | 18 || TABLE | performance_schema | metadata_locks | 139764544135120 | SHARED_READ | TRANSACTION | GRANTED | | 58 | 20 |+-------------+--------------------+----------------+-----------------------+---------------------+---------------+-------------+--------+-----------------+----------------+# 會話3 聯(lián)合其他系統(tǒng)表 查找出會話IDmysql> select m.*,t.PROCESSLIST_ID from performance_schema.metadata_locks m left join performance_schema.threads t on m.owner_thread_id=t.thread_id;+-------------+--------------------+----------------+-----------------------+---------------------+---------------+-------------+--------+-----------------+----------------+----------------+| OBJECT_TYPE | OBJECT_SCHEMA | OBJECT_NAME | OBJECT_INSTANCE_BEGIN | LOCK_TYPE | LOCK_DURATION | LOCK_STATUS | SOURCE | OWNER_THREAD_ID | OWNER_EVENT_ID | PROCESSLIST_ID |+-------------+--------------------+----------------+-----------------------+---------------------+---------------+-------------+--------+-----------------+----------------+----------------+| TABLE | testdb | student_tb | 94189250717664 | SHARED_WRITE | TRANSACTION | GRANTED | | 56 | 34 | 31 || GLOBAL | NULL | NULL | 139764477045472 | INTENTION_EXCLUSIVE | STATEMENT | GRANTED | | 57 | 18 | 32 || SCHEMA | testdb | NULL | 139764477697808 | INTENTION_EXCLUSIVE | TRANSACTION | GRANTED | | 57 | 18 | 32 || TABLE | testdb | student_tb | 139764477697904 | SHARED_UPGRADABLE | TRANSACTION | GRANTED | | 57 | 18 | 32 || TABLE | testdb | student_tb | 139764477697696 | EXCLUSIVE | TRANSACTION | PENDING | | 57 | 18 | 32 || TABLE | performance_schema | metadata_locks | 139764544135120 | SHARED_READ | TRANSACTION | GRANTED | | 58 | 22 | 33 || TABLE | performance_schema | threads | 139764549217280 | SHARED_READ | TRANSACTION | GRANTED | | 58 | 22 | 33 |+-------------+--------------------+----------------+-----------------------+---------------------+---------------+-------------+--------+-----------------+----------------+----------------+# 結果解讀:從上面結果明顯可以看出會話31持有student_tb表的SHARED_WRITE鎖,# 需要等待其提交后或手動殺掉該會話方可解除MDL鎖。

3.如何優(yōu)化與避免MDL鎖

MDL鎖一旦發(fā)生會對業(yè)務造成極大影響,因為后續(xù)所有對該表的訪問都會被阻塞,造成連接積壓。我們?nèi)粘RM量避免MDL鎖的發(fā)生,下面給出幾點優(yōu)化建議可供參考:

開啟metadata_locks表記錄MDL鎖。 設置參數(shù)lock_wait_timeout為較小值,使被阻塞端主動停止。 規(guī)范使用事務,及時提交事務,避免使用大事務。 增強監(jiān)控告警,及時發(fā)現(xiàn)MDL鎖。 DDL操作及備份操作放在業(yè)務低峰期執(zhí)行。 少用工具開啟事務進行查詢,圖形化工具要及時關閉。

總結:

本篇文章主要分三方面來詳解MDL鎖,首先介紹了MDL鎖產(chǎn)生的原因及作用,然后我們模擬出MDL鎖,并給出查找及解決方法,最后給出幾點避免MDL鎖的建議。其實,MDL鎖在DB運維過程中經(jīng)常遇到,它不是洪水猛獸,只是為了保護數(shù)據(jù)庫對象,保證數(shù)據(jù)一致性。希望大家看完這篇文章后能對MDL鎖有更清晰的認識。

以上就是詳細分析mysql MDL元數(shù)據(jù)鎖的詳細內(nèi)容,更多關于mysql MDL元數(shù)據(jù)鎖的資料請關注好吧啦網(wǎng)其它相關文章!

相關文章:
主站蜘蛛池模板: 课件导航网_ppt课件_课件模板_课件下载_最新课件资源分享发布平台 | 尊享蟹太太美味,大闸蟹礼卡|礼券|礼盒在线预订-蟹太太官网 | 智能汉显全自动量热仪_微机全自动胶质层指数测定仪-鹤壁市科达仪器仪表有限公司 | BAUER减速机|ROSSI-MERSEN熔断器-APTECH调压阀-上海爱泽工业设备有限公司 | RS系列电阻器,RK_RJ启动调整电阻器,RQ_RZ电阻器-上海永上电器有限公司 | 运动木地板_体育木地板_篮球馆木地板_舞台木地板-实木运动地板厂家 | 经济师考试_2025中级经济师报名时间_报名入口_考试时间_华课网校经济师培训网站 | 金属波纹补偿器厂家_不锈钢膨胀节价格_非金属伸缩节定制-庆达补偿器 | 通风气楼_通风天窗_屋顶风机-山东美创通风设备有限公司 | 气动机械手-搬运机械手-气动助力机械手-山东精瑞自动化设备有限公司 | 软启动器-上海能曼电气有限公司 真空搅拌机-行星搅拌机-双行星动力混合机-广州市番禺区源创化工设备厂 | 耐磨焊丝,堆焊焊丝,耐磨药芯焊丝,碳化钨焊丝-北京耐默公司 | 刺绳_刀片刺网_刺丝滚笼_不锈钢刺绳生产厂家_安平县浩荣金属丝网制品有限公司-安平县浩荣金属丝网制品有限公司 | 钢骨架轻型板_膨石轻型板_钢骨架轻型板价格_恒道新材料 | 消电检公司,消电检价格,北京消电检报告-北京设施检测公司-亿杰(北京)消防工程有限公司 | PC构件-PC预制构件-构件设计-建筑预制构件-PC构件厂-锦萧新材料科技(浙江)股份有限公司 | 阀门智能定位器_电液动执行器_气动执行机构-赫尔法流体技术(北京)有限公司 | 光伏支架成型设备-光伏钢边框设备-光伏设备厂家 | 武汉创亿电气设备有限公司_电力检测设备生产厂家 | 无缝钢管-聊城无缝钢管-小口径无缝钢管-大口径无缝钢管 - 聊城宽达钢管有限公司 | FAG轴承,苏州FAG轴承,德国FAG轴承-恩梯必传动设备(苏州)有限公司 | 冲锋衣滑雪服厂家-冲锋衣定制工厂-滑雪服加工厂-广东睿牛户外(S-GERT) | 全国冰箱|空调|洗衣机|热水器|燃气灶维修服务平台-百修家电 | 100国际学校招生 - 专业国际学校择校升学规划 | 干洗店加盟_洗衣店加盟_干洗店设备-伊蔻干洗「武汉总部」 | 东莞市天进机械有限公司-钉箱机-粘箱机-糊箱机-打钉机认准东莞天进机械-厂家直供更放心! | 圣才学习网-考研考证学习平台,提供万种考研考证电子书、题库、视频课程等考试资料 | 【甲方装饰】合肥工装公司-合肥装修设计公司,专业从事安徽办公室、店面、售楼部、餐饮店、厂房装修设计服务 | 环境模拟实验室_液体-气体控温机_气体控温箱_无锡双润冷却科技有限公司 | 砍排机-锯骨机-冻肉切丁机-熟肉切片机-预制菜生产线一站式服务厂商 - 广州市祥九瑞盈机械设备有限公司 | 转向助力泵/水泵/发电机皮带轮生产厂家-锦州华一精工有限公司 | 热风机_工业热风机生产厂家上海冠顶公司提供专业热风机图片价格实惠 | 聚氨酯催化剂K15,延迟催化剂SA-1,叔胺延迟催化剂,DBU,二甲基哌嗪,催化剂TMR-2,-聚氨酯催化剂生产厂家 | 北京开源多邦科技发展有限公司官网 | 免联考国际MBA_在职MBA报考条件/科目/排名-MBA信息网 | 工控机-图像采集卡-PoE网卡-人工智能-工业主板-深圳朗锐智科 | 净化车间装修_合肥厂房无尘室设计_合肥工厂洁净工程装修公司-安徽盛世和居装饰 | 刑事律师_深圳著名刑事辩护律师_王平聚【清华博士|刑法教授】 | 泡沫消防车_水罐消防车_湖北江南专用特种汽车有限公司 | 茶叶百科网-茶叶知识与茶文化探讨分享平台| 暖气片十大品牌厂家_铜铝复合暖气片厂家_暖气片什么牌子好_欣鑫达散热器 |