MySQL運(yùn)維-元數(shù)據(jù)鎖問(wèn)題定位

問(wèn)題

最近維護(hù)MySQL數(shù)據(jù)庫(kù)時(shí)毕莱,有個(gè)業(yè)務(wù)報(bào)障說(shuō)所有的SQL語(yǔ)句都超時(shí),執(zhí)行了5分鐘都執(zhí)行不完础浮。
我登錄到他的MySQL后嘀粱,執(zhí)行了Show Process就發(fā)現(xiàn)問(wèn)題了。
過(guò)程是他在一個(gè)表上執(zhí)行了一個(gè)大查詢爬迟,查詢沒(méi)有結(jié)束的情況下橘蜜,又在該表發(fā)起了一個(gè)DDL語(yǔ)句,然后后續(xù)在該表上的SQL語(yǔ)句執(zhí)行就一直在等待了付呕。
具體的細(xì)節(jié)先不分析计福,讓我們來(lái)重現(xiàn)這個(gè)場(chǎng)景,并在場(chǎng)景中進(jìn)行分析徽职。

環(huán)境準(zhǔn)備

首先我們準(zhǔn)備一張表象颖,并在表中插入一點(diǎn)數(shù)據(jù)。

mysql> CREATE TABLE `t` (
    ->   `id` int(11) NOT NULL,
    ->   `name` varchar(30) DEFAULT NULL,  
    ->   PRIMARY KEY (`id`)
    -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; 
Query OK, 0 rows affected (0.05 sec)

mysql> insert into t values ( 1, '123') ;
Query OK, 1 row affected (0.03 sec)

問(wèn)題重現(xiàn)

為了重現(xiàn)問(wèn)題姆钉,我們至少需要4個(gè)會(huì)話说订,因?yàn)樗械腟QL語(yǔ)句執(zhí)行都會(huì)堵住,我們按照會(huì)話執(zhí)行的先后順序來(lái)執(zhí)行潮瓶。

  • 會(huì)話1
    在會(huì)話1中執(zhí)行一條大查詢陶冷,這條查詢語(yǔ)句要執(zhí)行很長(zhǎng)時(shí)間。
mysql> select id , name , sleep(300) from t ; 
  • 會(huì)話2
    發(fā)起一條DDL操作毯辅。
mysql> alter table t add ts timestamp;

因?yàn)镈DL語(yǔ)句會(huì)申請(qǐng)MDL鎖埂伦,MDL鎖是表級(jí)別獨(dú)占鎖,前面有一條查詢t表的SQL語(yǔ)句沒(méi)有結(jié)束思恐,所以該DDL語(yǔ)句會(huì)等待沾谜。

  • 會(huì)話3
    發(fā)起t表上的其他任何語(yǔ)句膊毁,都會(huì)堵住,這里執(zhí)行一條簡(jiǎn)單sql語(yǔ)句类早。
mysql> select * from t where id=1 ;

可以看到會(huì)話堵住了媚媒。

  • 會(huì)話4
    在該會(huì)話嗜逻,我們來(lái)通過(guò)show processlist 看看發(fā)生了什么涩僻?
mysql> show processlist ; 
+--------+-------------+--------------------+------------+-------------+-------+-----------------------------------------------------------------------------+---------------------------------------+
| Id     | User        | Host               | db         | Command     | Time  | State                                                                       | Info                                  |
+--------+-------------+--------------------+------------+-------------+-------+-----------------------------------------------------------------------------+---------------------------------------+
| 177915 | test         | 127.0.0.1:27538  | testdb     | Query       |    17 | User sleep                                                                  | select id , name , sleep(300) from t  |
| 178701 | test         | 127.0.0.1:28316  | testdb     | Query       |    15 | Waiting for table metadata lock                                             | alter table t add column ts timestamp |
| 178751 | test         | 127.0.0.1:28346  | testdb     | Query       |    12 | Waiting for table metadata lock                                             | select * from t where id=1            |
| 188250 | test         | 127.0.0.1:37604  | testdb     | Query       |     0 | init                                                                        | show processlist                      |
+--------+-------------+--------------------+------------+-------------+-------+-----------------------------------------------------------------------------+---------------------------------------+

從show process結(jié)果中可以看到,第一條sql語(yǔ)句select id , name , sleep(300) from t 正在執(zhí)行中栈顷,而第二條和第三條sql語(yǔ)句都在等待MDL鎖逆日。
在這個(gè)案例中第一條大SQL是起因,結(jié)合DDL操作就會(huì)出現(xiàn)該問(wèn)題萄凤。

如何避免文中的問(wèn)題

如果我們按照上面問(wèn)題重現(xiàn)的步驟在一個(gè)MySQL上執(zhí)行那么基本上沒(méi)法避免出現(xiàn)MDL鎖的問(wèn)題室抽。
業(yè)務(wù)方問(wèn)咨詢的時(shí)候,我建議他盡量不要自己執(zhí)行DDL靡努,在數(shù)據(jù)庫(kù)管理平臺(tái)申請(qǐng)SQL坪圾,我們的平臺(tái)會(huì)審核后,對(duì)于DDL語(yǔ)句惑朦,會(huì)在底層通過(guò)pt工具執(zhí)行兽泄,依賴防止大表ALTER操作影響后續(xù)的SQL,而來(lái)漾月,pt工具在執(zhí)行DDL之前會(huì)判斷處理該表上的長(zhǎng)SQL病梢,如果超過(guò)10s,會(huì)直接kill掉sql語(yǔ)句后梁肿,再執(zhí)行DDL蜓陌。這樣就避免了MDL鎖的出現(xiàn)。
當(dāng)然最好的方式是大查詢SQL不要在主庫(kù)執(zhí)行吩蔑,在從庫(kù)中執(zhí)行影響就會(huì)很小了钮热,而且可以通過(guò)代理層(參考一步一步打造MySQL高可用平臺(tái)),把讀操作自動(dòng)負(fù)載均衡到從庫(kù)烛芬。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末霉旗,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蛀骇,更是在濱河造成了極大的恐慌厌秒,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件擅憔,死亡現(xiàn)場(chǎng)離奇詭異鸵闪,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)暑诸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門蚌讼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)辟灰,“玉大人,你說(shuō)我怎么就攤上這事篡石〗胬” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵凰萨,是天一觀的道長(zhǎng)继控。 經(jīng)常有香客問(wèn)我,道長(zhǎng)胖眷,這世上最難降的妖魔是什么武通? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮珊搀,結(jié)果婚禮上冶忱,老公的妹妹穿的比我還像新娘。我一直安慰自己境析,他們只是感情好囚枪,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著劳淆,像睡著了一般链沼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上憔儿,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天忆植,我揣著相機(jī)與錄音,去河邊找鬼谒臼。 笑死朝刊,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蜈缤。 我是一名探鬼主播拾氓,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼底哥!你這毒婦竟也來(lái)了咙鞍?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤趾徽,失蹤者是張志新(化名)和其女友劉穎续滋,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體孵奶,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡疲酌,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片朗恳。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡湿颅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出粥诫,到底是詐尸還是另有隱情油航,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布怀浆,位于F島的核電站谊囚,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏揉稚。R本人自食惡果不足惜秒啦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一熬粗、第九天 我趴在偏房一處隱蔽的房頂上張望搀玖。 院中可真熱鬧,春花似錦驻呐、人聲如沸灌诅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)猜拾。三九已至,卻和暖如春佣盒,著一層夾襖步出監(jiān)牢的瞬間挎袜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工肥惭, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留盯仪,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓蜜葱,卻偏偏與公主長(zhǎng)得像全景,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子牵囤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容