華為云MySQL新增MDL鎖視圖特性,清晰查看各session元數(shù)據(jù)鎖信息

MDL鎖(Metadata Lock),即元數(shù)據(jù)鎖。元數(shù)據(jù)指的是描述數(shù)據(jù)的數(shù)據(jù),對(duì)數(shù)據(jù)及信息資源的描述性信息,在數(shù)據(jù)庫(kù)中元數(shù)據(jù)即數(shù)據(jù)字典信息,包括db,table,function,procedure,trigger,event等。

MySQL從 5.5版本開(kāi)始引入MDL鎖,MDL鎖主要為了保證元數(shù)據(jù)的一致性(主要是保證DDL操作與DML操作之間的一致性),用于處理不同線程操作同一元數(shù)據(jù)對(duì)象的同步與互斥問(wèn)題,在各個(gè)業(yè)務(wù)場(chǎng)景中會(huì)十分頻繁地使用到。

具體而言,MySQL引入MDL鎖可以解決如下問(wèn)題:一是事務(wù)隔離問(wèn)題,比如在可重復(fù)讀隔離級(jí)別下,會(huì)話A在2次查詢期間,會(huì)話B對(duì)表結(jié)構(gòu)做了修改,2次查詢結(jié)果就會(huì)不一致,無(wú)法滿足可重復(fù)讀的要求。二是數(shù)據(jù)復(fù)制問(wèn)題,比如會(huì)話A執(zhí)行了多條更新語(yǔ)句期間,另外一個(gè)會(huì)話B做了表結(jié)構(gòu)變更并且先提交,就會(huì)導(dǎo)致slave在重做時(shí),先重做alter,再重做update時(shí)就會(huì)出現(xiàn)復(fù)制錯(cuò)誤的現(xiàn)象。

何為MDL鎖視圖?

社區(qū)版MySQL無(wú)法獲取表MDL鎖的詳細(xì)信息,當(dāng)客戶遇到類似“Waiting for metadata lock”的問(wèn)題而阻塞DML或DDL后,由于無(wú)法確定各session之間的關(guān)聯(lián),往往無(wú)從下手,復(fù)雜情況下,只能重啟實(shí)例,從而增加解決問(wèn)題的成本,對(duì)業(yè)務(wù)產(chǎn)生較大影響。而且在業(yè)務(wù)場(chǎng)景較復(fù)雜的情況下,一旦涉及對(duì)數(shù)據(jù)庫(kù)元數(shù)據(jù)的互斥操作(如DDL、LOCK Table等),此類問(wèn)題便會(huì)頻繁發(fā)生,給一線運(yùn)維和客戶帶來(lái)很大的困擾。

針對(duì)以上痛點(diǎn),華為云數(shù)據(jù)庫(kù)MySQL在充分調(diào)研內(nèi)核的基礎(chǔ)上,推出了MDL鎖視圖特性,可以清晰查看數(shù)據(jù)庫(kù)各session持有和等待的元數(shù)據(jù)鎖信息,方便現(xiàn)網(wǎng)運(yùn)維進(jìn)行問(wèn)題定位,有效進(jìn)行系統(tǒng)診斷,幫助客戶更好地優(yōu)化自身業(yè)務(wù)。

MDL鎖視圖以系統(tǒng)表的形式呈現(xiàn),該表位于INFORMATION_SCHEMA,表名:METADATA_LOCK_INFO,表結(jié)構(gòu)如下:

華為云MySQL新增MDL鎖視圖特性,清晰查看各session元數(shù)據(jù)鎖信息

MDL鎖視圖主要由7個(gè)字段組成,各字段詳情為:

•THREAD_ID:session的ID,即會(huì)話ID

•LOCK_STATUS:MDL鎖的狀態(tài),主要分為PENDING和GRANTED兩種,分別表示session正在等待該MDL鎖和session已獲得該MDL鎖

•LOCK_MODE:加鎖的模式,如MDL_SHARED 、MDL_EXCLUSIVE 、MDL_SHARED_READ、MDL_SHARED_WRITE等

•LOCK_TYPE:MDL鎖的類型,如Tablemetadata lock、Schema metadata lock、Global read lock、Tablespace lock等

•LOCK_DURATION:MDL鎖的范圍,有三種取值:MDL_STATEMENT、MDL_TRANSACTION、MDL_EXPLICIT,分別表示語(yǔ)句級(jí)別、事務(wù)級(jí)別、global級(jí)別

•TABLE_SCHEMA:數(shù)據(jù)庫(kù)名,對(duì)于部分global級(jí)別的MDL鎖,該值為空

•TABLE_NAME:表名,對(duì)于部分global級(jí)別的MDL鎖,該值為空

MDL鎖視圖好在哪?

下面通過(guò)兩則案例來(lái)對(duì)MDL鎖視圖進(jìn)行進(jìn)一步的說(shuō)明。

場(chǎng)景一:長(zhǎng)時(shí)間未提交事務(wù),阻塞DDL,繼而阻塞所有同表的操作

華為云MySQL新增MDL鎖視圖特性,清晰查看各session元數(shù)據(jù)鎖信息

客戶發(fā)現(xiàn)表t2的truncate一直被阻塞后,業(yè)務(wù)流程中對(duì)表t2的select操作也全部被阻塞。DDL被阻塞后,客戶立刻執(zhí)行show processlist:

華為云MySQL新增MDL鎖視圖特性,清晰查看各session元數(shù)據(jù)鎖信息

但是通過(guò)processlist信息,只能看到session 4執(zhí)行truncate操作時(shí)被其他session持有的table metadata lock阻塞,session 5執(zhí)行select操作時(shí)也同樣被阻塞,無(wú)法確定哪個(gè)session阻塞了session 4和session 5。此時(shí),如果盲目的去kill其他session(2或3)會(huì)給線上業(yè)務(wù)帶來(lái)很大風(fēng)險(xiǎn),因此只能等待其他session釋放該MDL鎖。

而當(dāng)客戶引入MDL鎖視圖后,執(zhí)行SELECT * FROM INFORMATION_SCHEMA.METADATA_LOCK_INFO:

華為云MySQL新增MDL鎖視圖特性,清晰查看各session元數(shù)據(jù)鎖信息

結(jié)合show processlist的結(jié)果,從元數(shù)據(jù)鎖視圖中可以明顯看出,session 4 pending在表t2的metadata lock,session 3持有表t2的metadata lock,該MDL鎖為事務(wù)級(jí)別,只要session 3的事務(wù)不提交,session 4便會(huì)一直阻塞。因此,客戶只需要在session 3中執(zhí)行commit或kill session 3,便可以讓業(yè)務(wù)繼續(xù)運(yùn)行。

場(chǎng)景二:長(zhǎng)時(shí)間持有MDL鎖,導(dǎo)致全備失敗

華為云MySQL新增MDL鎖視圖特性,清晰查看各session元數(shù)據(jù)鎖信息

客戶實(shí)例最近幾次全備均失敗,但是業(yè)務(wù)表現(xiàn)似乎正常,而且最近系統(tǒng)業(yè)務(wù)量不高,未出現(xiàn)明顯問(wèn)題。運(yùn)維團(tuán)隊(duì)發(fā)現(xiàn)全備被阻塞后,立刻show processlist,發(fā)現(xiàn)有多個(gè)活躍的用戶session:

華為云MySQL新增MDL鎖視圖特性,清晰查看各session元數(shù)據(jù)鎖信息

全備是基于xtrabackup,在執(zhí)行真正的備份之前需要執(zhí)行l(wèi)ock tables for backup,但從show processlist中只能看到:lock tables for backup時(shí)一直被某個(gè)MDL鎖阻塞,全備超時(shí)失敗;客戶的多個(gè)session業(yè)務(wù)量很小,都處于sleep狀態(tài),于是客戶繼續(xù)執(zhí)行show open tables where in_use >=1:

華為云MySQL新增MDL鎖視圖特性,清晰查看各session元數(shù)據(jù)鎖信息

發(fā)現(xiàn)有個(gè)表t1始終處于in use狀態(tài),所以猜測(cè)是用戶某個(gè)session持有了該表t1的MDL鎖未釋放,導(dǎo)致lock tables for backup等待超時(shí)。但是結(jié)合showprocesslist仍然無(wú)法確定是哪個(gè)session持有表t1的MDL鎖,想讓全備執(zhí)行成功,只能通知客戶逐一斷連session或者重啟實(shí)例。

引入MDL鎖視圖后,客戶執(zhí)行SELECT*FROM INFORMATION_SCHEMA.METADATA_LOCK_INFO:

華為云MySQL新增MDL鎖視圖特性,清晰查看各session元數(shù)據(jù)鎖信息

結(jié)合showprocesslist的結(jié)果,從元數(shù)據(jù)鎖視圖中可以明顯看出,session4 pending在全局backup lock上;session2持有全局的backup lock,該MDL鎖類型為MDL_EXPLICIT,global級(jí)別。因此,客戶只需要在session 2顯式調(diào)用unlock tables釋放鎖或者killsession 2即可讓業(yè)務(wù)繼續(xù)運(yùn)行。

通過(guò)以上兩個(gè)案例,MDL鎖視圖的重要性不言而喻,它可以讓客戶和一線運(yùn)維人員清晰地查看數(shù)據(jù)庫(kù)各session持有和等待的元數(shù)據(jù)鎖信息,從而找出數(shù)據(jù)庫(kù)MDL鎖等待的根因,準(zhǔn)確地進(jìn)行下一步?jīng)Q策,有效降低對(duì)業(yè)務(wù)的影響。

欲了解更多詳情,敬請(qǐng)前往華為云官網(wǎng):產(chǎn)品——基礎(chǔ)服務(wù)——數(shù)據(jù)庫(kù)——云數(shù)據(jù)庫(kù)MySQL。

華為云MySQL新增MDL鎖視圖特性,清晰查看各session元數(shù)據(jù)鎖信息

免責(zé)聲明:本網(wǎng)站內(nèi)容主要來(lái)自原創(chuàng)、合作伙伴供稿和第三方自媒體作者投稿,凡在本網(wǎng)站出現(xiàn)的信息,均僅供參考。本網(wǎng)站將盡力確保所提供信息的準(zhǔn)確性及可靠性,但不保證有關(guān)資料的準(zhǔn)確性及可靠性,讀者在使用前請(qǐng)進(jìn)一步核實(shí),并對(duì)任何自主決定的行為負(fù)責(zé)。本網(wǎng)站對(duì)有關(guān)資料所引致的錯(cuò)誤、不確或遺漏,概不負(fù)任何法律責(zé)任。任何單位或個(gè)人認(rèn)為本網(wǎng)站中的網(wǎng)頁(yè)或鏈接內(nèi)容可能涉嫌侵犯其知識(shí)產(chǎn)權(quán)或存在不實(shí)內(nèi)容時(shí),應(yīng)及時(shí)向本網(wǎng)站提出書面權(quán)利通知或不實(shí)情況說(shuō)明,并提供身份證明、權(quán)屬證明及詳細(xì)侵權(quán)或不實(shí)情況證明。本網(wǎng)站在收到上述法律文件后,將會(huì)依法盡快聯(lián)系相關(guān)文章源頭核實(shí),溝通刪除相關(guān)內(nèi)容或斷開(kāi)相關(guān)鏈接。

2020-01-15
華為云MySQL新增MDL鎖視圖特性,清晰查看各session元數(shù)據(jù)鎖信息
MDL鎖(Metadata Lock),即元數(shù)據(jù)鎖。元數(shù)據(jù)指的是描述數(shù)據(jù)的數(shù)據(jù),對(duì)數(shù)據(jù)及信息資源的描述性信息,在數(shù)據(jù)庫(kù)中元數(shù)據(jù)即數(shù)據(jù)字典信息,包括db,table,function,procedure,trigger,event等。

長(zhǎng)按掃碼 閱讀全文