亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > MySQL > 正文

Mysql解決USE DB堵塞詳解

2024-07-24 13:15:14
字體:
來源:轉載
供稿:網友

遇到故障,我們往往想的是如何解決這個故障,而不是從故障的根本去思考出現這個故障的原因?這樣的結果,只能使我們得到了魚,失去了漁。今天,我們就來分享一個由USE DB堵塞故障引發的思考案例。

故障描述

今天一個朋友遇到數據庫遇到一個嚴重的故障,故障環境如下:

MYSQL 5.6.16

RR隔離級別

GITD關閉

表現如下:

use db不能進入數據庫

show table status不能查詢到表信息

schema.processlist來看有大量的 Waiting for table metadata lock

情急之下他殺掉了一大堆線程后發現還是不能恢復,最后殺掉了一個沒有及時提交的事物才恢復正常。也僅僅留下了如下圖的一個截圖:

Mysql,USE,DB堵塞

故障信息提取

還是回到上圖,我們可以歸納一下語句類型如下:

1、CREATE TABLE A AS SELECT B

其STATE為 sending data

2、DROP TABLE A

其STATE為 Waiting for table metadata lock

3、SELECT * FROM A

其STATE為 Waiting for table metadata lock

4、 SHOW TABLE STATUS[like 'A']

其STATE為 Waiting for table metadata lock

信息分析

要分析出這個案列其實不太容易因為他是MYSQL層MDL LOCK和RR模式innodb row lock的一個綜合案列,并且我們要對schema.processlist的STATE比較敏感才行。

建議先閱讀我的如下文章來學習MDL LOCK:

http://www.49028c.com/article/131383.htm

本節關于MDL LOCK的驗證使用下面兩種方式:

方式一:筆者在MDL LOCK源碼加鎖函數處加日志輸出,如果要分析各種語句加MDL LOCK的類型還只能用這種方式,因為MDL LOCK加鎖往往一閃而過,performance_schema.metadata_locks 沒有辦法觀察到。

方式二:處于堵塞情況下使用5.7版本的performance_schema.metadata_locks觀察。

在P_S中打開mdl監測方法如下:

Mysql,USE,DB堵塞

一、關于CREATE TABLE A AS SELECT B 對B表sending data的分析

關于sending data這個狀態其實可以代表很多含義,從我現有的對的了解,這是MYSQL上層對SELECT類型語句的這類語句在INNODB層和MYSQL層進行數據交互的時候一個統稱,所以出現它的可能包含:

確實需要訪問數據量特別大,可能需要優化。

由于INNODB 層的獲取row lock需要等待,比如我們常見的SELECT FOR UPDATE。

同時我們還需要注意在RR模式下SELECT B這一部分加鎖方式和INSERT...SELECT是一致的參考不再贅述:

從他反應的情況因為他在最后殺掉了一個長期的未提交的事物所以他因為是情況2。并且整個CREATE TABLE A AS SELECT B語句由于B表上某些數據庫被上了鎖而不能獲取,導致整個語句處于sending data狀態下。

二、關于SHOW TABLE STATUS[like 'A'] Waiting for table metadata lock的分析

這是本案例中最重要的一環,SHOW TABLE STATUS[like 'A']居然被堵塞其STATE為Waiting for table metadata lock并且注意這里是table因為MDL LOCK類型分為很多。我在MDL介紹的那篇文章中提到了desc 一個表的時候會上MDL_SHARED_HIGH_PRIO(SH),其實在SHOW TABLE STATUS的時候也會對本表上MDL_SHARED_HIGH_PRIO(SH)。

方式一

Mysql,USE,DB堵塞

方式二

Mysql,USE,DB堵塞

兩種方式都能觀察到MDL_SHARED_HIGH_PRIO(SH)的存在并且我模擬的是處于堵塞情況下的。

但是MDL_SHARED_HIGH_PRIO(SH) 是一個優先級非常高的一個MDL LOCK類型表現如下:

兼容性:

Mysql,USE,DB堵塞

阻塞隊列優先級:

Mysql,USE,DB堵塞

其被堵塞的條件除了被MDL_EXCLUSIVE(X)堵塞沒有其他的可能。那么這就是一個非常重要的突破口。

三、關于CREATE TABLE A AS SELECT B 對A表的加MDL LOCK的分析

這一點也是我以前不知道的,也是本案列中花時間最多的地方,前文已經分析過要讓SHOW TABLE STATUS[like 'A']這種只會上MDL_SHARED_HIGH_PRIO(SH) MDL LOCK的語句堵塞在MDL LOCK上只有一種可能那就是A表上了MDL_EXCLUSIVE(X)。

那么我開始懷疑這個DDL語句在語句結束之前會對A表上MDL_EXCLUSIVE(X) ,然后進行實際測試不出所料確實是這樣的如下:

方式一

Mysql,USE,DB堵塞

方式二

Mysql,USE,DB堵塞

這里比較遺憾在performance_schema.metadata_locks中并沒有顯示出MDL_EXCLUSIVE(X),而顯示為MDL_SHARED(S)是我們在我輸出的日志中可以看到這里做了升級操作將MDL_SHARED(S) 升級為了MDL_EXCLUSIVE(X)。并且由前面的兼容性列表來看,只有MDL_EXCLUSIVE(X)會堵塞MDL_SHARED_HIGH_PRIO(SH)。所以我們應該能夠確認這里確實做了升級操作,否則SHOW TABLE STATUS[like 'A'] 是不會被堵塞的。

四、關于SELECT * FROM A Waiting for table metadata lock的分析

也許大家認為SELECT不會上鎖,但是那是在innodb 層次,在MYSQL層會上MDL_SHARED_READ(SR) 如下:

方式一

Mysql,USE,DB堵塞

方式二

Mysql,USE,DB堵塞

可以看到確實有MDL_SHARED_READ(SR)的存在,當前處于堵塞狀態

其兼容性如下:

Mysql,USE,DB堵塞

顯然MDL_SHARED_READ(SR) 和MDL_SHARED_HIGH_PRIO(SH)是不兼容的需要等待。

五、關于DROP TABLE A Waiting for table metadata lock的分析

這一點很好分析因為A表上了X鎖而DROP TABLE A必然上MDL_EXCLUSIVE(X)鎖它當然和MDL_EXCLUSIVE(X)不兼容。如下:

方式一

Mysql,USE,DB堵塞

方式二

Mysql,USE,DB堵塞

其中EXCLUSIVE就是我們說的MDL_EXCLUSIVE(X)它確實存在當前處于堵塞

六、為何use db也會堵塞?

如果使用mysql客戶端不使用-A選項(或者 no-auto-rehash)在USE DB的時候至少要做如下事情:

1、 對db下每個表上MDL (SH) lock如下(調用MDL_context::acquire_lock 這里給出堵塞時候的信息)

方式一

Mysql,USE,DB堵塞

方式二

Mysql,USE,DB堵塞

可以看到USE DB確實也因為MDL_SHARED_HIGH_PRIO(SH) 發生了堵塞。

2、對每個表加入到table cache,并且打開表(調用open_table_from_share())

那么這種情況就和SHOW TABLE STATUS[like 'A']被堵塞的情況一模一樣了,也是由于MDL 鎖不兼容造成的。

分析梳理

有了前面的分析那么我們可以梳理這個故障發生的原因如下:

有一個在B表上長期未提交的DML
語句會在innodb層對B表某些數據加innodb row lock。

由步驟1引起了CREATE TABLE A AS SELECT B的堵塞
因為RR模式下SELECT B必然對B表上滿足的數據上鎖,因為步驟1已經加鎖所以觸發等待,STATE為sending data。

由步驟2引起了其他語句的堵塞
因為CRATE TABLE A AS SELECT B在A表建立完成之前會上MDL_EXCLUSIVE(X),這把鎖會堵塞其他全部的關于A表的語句,包括DESC/SHOW TABLE STATUS/USE DB(非-A) 這種只上MDL_SHARED_HIGH_PRIO(SH)MDL LOCK 的語句。STATE統一為Waiting for table metadata lock。

模擬測試

測試環境:

5.7.14

GITD關閉

RR隔離級別

使用腳本

Mysql,USE,DB堵塞

步驟如下:

session1 session2 session3 session4------use test;---use test;begin; delete from b;------------use test;create table a asselect * from b;(由于b表innodb row lock堵塞)------------show table status like 'a';(由于a表MDL LOCK堵塞)------------use test(由于a表MDL LOCK堵塞)

最后我們看到的等待狀態如下:

Mysql,USE,DB堵塞

這樣我們就完美的模擬出線上的狀態,如果我們殺掉session1中的事物,自然就全部解鎖了,讓我們再來看一下performance_schema.metadata_locks中的輸出:

Mysql,USE,DB堵塞

我們可以看到如上的輸出,但是需要注意LOCK_TYPE: SHARED它不可能堵塞LOCK_TYPE: SHARED_HIGH_PRIO(可以參考附錄或者我以前寫的MDL LOCK分析的文章)如上文分析這里實際上是做了升級操作升級為了MDL_EXCLUSIVE(X)。

總結

RC模式下雖然CREATE TABLE A SELECT B中B表不會上任何INNODB ROW LOCK但是如果B表非常大那么A表也會處于MDL_EXCLUSIVE(X)保護下,因此也會觸發USE DB/SHOW TABLE STATUS等待的情況。

如果打開GTID不能使用CREATE TABLE A SELECT B這樣的語句。

對于DML/DDL混用的系統一定要注意并發,就像本例中如果注意到高并發下的情況可以想辦法避免。

這個案列再次說明了長期不提交的事物可能引發悲劇,所以建議監控超過N秒沒結束的事務。

附錄

MDL LOCK TYPE

Mysql,USE,DB堵塞

兼容性矩陣

Mysql,USE,DB堵塞

等待隊列優先級矩陣

Mysql,USE,DB堵塞

 

注:相關教程知識閱讀請移步到MYSQL教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文字幕欧美亚洲| 欧美做受高潮电影o| 在线免费看av不卡| 成人黄色免费片| 成人免费观看网址| 久久99精品国产99久久6尤物| 日韩中文字幕在线免费观看| 日韩美女福利视频| 国产成人一区二区三区小说| 精品国产一区二区在线| 亚洲人成网7777777国产| 亚洲国产一区二区三区四区| 亚洲成色777777在线观看影院| 国产欧美精品日韩| 国产视频久久网| 国产丝袜一区二区三区免费视频| 91在线观看免费高清| 亚洲人成五月天| 日韩美女免费观看| 国产成人精品免高潮费视频| 亚洲免费成人av电影| 日韩高清av在线| 人人做人人澡人人爽欧美| 欧美在线视频观看免费网站| 中文字幕亚洲一区二区三区五十路| 欧美日韩国产精品专区| 亚洲欧美国产高清va在线播| www.日韩免费| 久久成人人人人精品欧| 日韩av在线免费观看| 久久久久久久久久av| 国产精品av电影| 久久影院中文字幕| 国产精品久久久久久中文字| 国产精品久久一区| 国产精品亚洲欧美导航| 国产97人人超碰caoprom| 日韩精品中文字幕视频在线| 日韩一区二区久久久| 国产在线一区二区三区| 日本久久久a级免费| 亚洲免费av网址| 国产一区二区黄| 亚洲欧美一区二区三区在线| 国产69久久精品成人看| 精品视频一区在线视频| 中文字幕日本欧美| 成人激情黄色网| 国产亚洲精品91在线| 欧美最顶级的aⅴ艳星| 亚洲成人a**站| 国产精品99一区| 性欧美视频videos6一9| 日韩中文字幕免费视频| 色综合久久久久久中文网| 日韩av电影中文字幕| 久久影院中文字幕| 激情成人在线视频| 国产成人免费av| 亚洲va国产va天堂va久久| 成人精品久久久| 日韩在线观看免费高清完整版| 亚洲第一天堂av| 国产欧美 在线欧美| 日韩免费观看av| 亚洲美女视频网| 亚洲国产精品99| 91午夜理伦私人影院| 97免费视频在线播放| 亚洲视频在线免费看| 国产免费一区视频观看免费| 亚洲欧美色图片| 三级精品视频久久久久| 精品国产欧美一区二区三区成人| 日韩中文字幕在线免费观看| 97在线视频精品| 91久久精品国产91久久| 国产精品成人aaaaa网站| 国产日产欧美a一级在线| 成人欧美一区二区三区黑人| 久久99久久99精品免观看粉嫩| 日韩欧美中文字幕在线观看| 日韩电影中文 亚洲精品乱码| 色综合天天综合网国产成人网| 亚洲福利视频在线| 97在线视频国产| 日本视频久久久| 韩日精品中文字幕| 国产日韩欧美日韩| 国产精品永久免费观看| 亚洲人成在线播放| 成人福利网站在线观看11| 欧美最顶级丰满的aⅴ艳星| 久久伊人精品天天| 亚洲国产精品电影在线观看| 日韩欧美在线视频| 欧美床上激情在线观看| 亚洲国产成人av在线| 久久久最新网址| 色多多国产成人永久免费网站| 理论片在线不卡免费观看| 国产一区二区久久精品| 欧美精品福利在线| 亚洲天堂男人的天堂| 久久国产加勒比精品无码| 亚洲国产成人精品久久久国产成人一区| 亚洲国产美女精品久久久久∴| 久久久久久久999精品视频| 成人精品一区二区三区电影免费| 亚洲免费av片| 91欧美精品午夜性色福利在线| 亚洲国产精品大全| 国产精品久久激情| 国产精品尤物福利片在线观看| 在线视频中文亚洲| 伊人亚洲福利一区二区三区| 中文国产成人精品久久一| 26uuu国产精品视频| 91精品久久久久久久久| 亚洲乱亚洲乱妇无码| 国产精品av在线| 热久久这里只有| 日韩精品久久久久久久玫瑰园| 亚洲国产高清福利视频| 久久精品中文字幕| 久久久久久久久久久成人| 亚洲精品91美女久久久久久久| 欧美乱人伦中文字幕在线| 91欧美视频网站| 国产日本欧美一区二区三区| 亚洲欧洲在线观看| 欧美日韩午夜剧场| 午夜精品福利电影| 日韩欧美成人网| 九九热r在线视频精品| 欧美人成在线视频| 51午夜精品视频| 国产精品劲爆视频| 国产精品都在这里| 国产成人综合久久| 1769国产精品| 2018日韩中文字幕| 色妞在线综合亚洲欧美| 最近2019中文字幕一页二页| 欧美日本在线视频中文字字幕| 日韩精品中文字幕在线播放| 国产成人精品久久亚洲高清不卡| 日韩av在线电影网| 欧美日韩高清在线观看| 久久精品国产99国产精品澳门| 黑人巨大精品欧美一区免费视频| 欧美性高潮床叫视频| 欧美中文在线观看国产| 91精品国产综合久久香蕉的用户体验| 久久av.com| 国内精品久久久久久| 亚洲男女自偷自拍图片另类| 国产精品视频精品视频| 国产精品揄拍一区二区| 国产美女精品免费电影| 国产精品18久久久久久首页狼| 国产成人欧美在线观看| 懂色aⅴ精品一区二区三区蜜月| 欧美日韩ab片|