有了MDL鎖檢視,業務死鎖從此一目瞭然
摘要:MDL鎖檢視讓一線運維人員清晰地檢視資料庫各session持有和等待的元資料鎖資訊,從而找出資料庫MDL鎖等待的根因,準確地進行下一步決策。
當多使用者共同存取資料時,資料庫中就會產生多個事務同時存取同一資料的情況。若不控制這種併發操作,資料庫的一致性就會被破壞。這種情況下,加鎖是實現資料庫併發控制的關鍵技術。
舉個例子,加鎖後事務就對該資料物件有了一定的控制,在事務釋放鎖之前,其他的事務不能對此資料物件進行更新操作。
MySQL從 5.5版本開始引入MDL鎖(即元資料鎖),MDL鎖主要為了保證元資料的一致性(主要是保證DDL操作與DML操作之間的一致性),用於處理不同執行緒操作同一元資料物件的同步與互斥問題,在各個業務場景中會十分頻繁地使用到。
具體而言,MySQL引入MDL鎖可以解決如下問題:一是事務隔離問題,比如在可重複讀隔離級別下,會話A在2次查詢期間,會話B對錶結構做了修改,2次查詢結果就會不一致,無法滿足可重複讀的要求。二是資料複製問題,比如會話A執行了多條更新語句期間,另外一個會話B做了表結構變更並且先提交,就會導致slave在重做時,先重做alter,再重做update時就會出現複製錯誤的現象。
MDL鎖檢視,一目瞭然元資料鎖問題
社群版MySQL無法獲取表MDL鎖的詳細資訊,當客戶遇到類似“Waiting for metadata lock”的問題而阻塞DML或DDL後,由於無法確定各session之間的關聯,往往無從下手,複雜情況下,只能重啟例項,從而增加解決問題的成本,對業務產生較大影響。
而且在業務場景較複雜的情況下,一旦涉及對資料庫元資料的互斥操作(如DDL、LOCK Table等),此類問題便會頻繁發生,給一線運維和客戶帶來很大的困擾。
針對以上痛點,華為雲資料庫MySQL在充分調研核心的基礎上,推出了MDL鎖檢視特性,可以清晰檢視資料庫各session持有和等待的元資料鎖資訊,方便現網運維進行問題定位,有效進行系統診斷,幫助客戶更好地優化自身業務。
MDL鎖檢視以系統表的形式呈現,該表位於INFORMATION_SCHEMA,表名:METADATA_LOCK_INFO,表結構如下:
MDL鎖檢視主要由7個欄位組成,各欄位詳情為:
- THREAD_ID:session的ID,即會話ID
- LOCK_STATUS:MDL鎖的狀態,主要分為PENDING和GRANTED兩種,分別表示session正在等待該MDL鎖和session已獲得該MDL鎖
- LOCK_MODE:加鎖的模式,如MDL_SHARED 、MDL_EXCLUSIVE 、MDL_SHARED_READ、MDL_SHARED_WRITE等
- LOCK_TYPE:MDL鎖的型別,如Table metadata lock、Schema metadata lock、Global read lock、Tablespace lock等
- LOCK_DURATION:MDL鎖的範圍,有三種取值:MDL_STATEMENT、MDL_TRANSACTION、MDL_EXPLICIT,分別表示語句級別、事務級別、global級別
- TABLE_SCHEMA:資料庫名,對於部分global級別的MDL鎖,該值為空
- TABLE_NAME:表名,對於部分global級別的MDL鎖,該值為空
MDL鎖檢視好在哪?
下面通過兩則案例來對MDL鎖檢視進行進一步的說明。
場景一:長時間未提交事務,阻塞DDL,繼而阻塞所有同表的操作
客戶發現表t2的truncate一直被阻塞後,業務流程中對錶t2的select操作也全部被阻塞。DDL被阻塞後,客戶立刻執行show processlist:
但是通過processlist資訊,只能看到session 4執行truncate操作時被其他session持有的table metadata lock阻塞,session 5執行select操作時也同樣被阻塞,無法確定哪個session阻塞了session 4和session 5。此時,如果盲目的去kill其他session(2或3)會給線上業務帶來很大風險,因此只能等待其他session釋放該MDL鎖。
而當客戶引入MDL鎖檢視後,執行SELECT * FROM INFORMATION_SCHEMA.METADATA_LOCK_INFO:
結合show processlist的結果,從元資料鎖檢視中可以明顯看出,session 4 pending在表t2的metadata lock,session 3持有表t2的metadata lock,該MDL鎖為事務級別,只要session 3的事務不提交,session 4便會一直阻塞。因此,客戶只需要在session 3中執行commit或kill session 3,便可以讓業務繼續執行。
場景二:長時間持有MDL鎖,導致全備失敗
客戶例項最近幾次全備均失敗,但是業務表現似乎正常,而且最近系統業務量不高,未出現明顯問題。運維團隊發現全備被阻塞後,立刻show processlist,發現有多個活躍的使用者session:
全備是基於xtrabackup,在執行真正的備份之前需要執行lock tables for backup,但從show processlist中只能看到:lock tables for backup時一直被某個MDL鎖阻塞,全備超時失敗;客戶的多個session業務量很小,都處於sleep狀態,於是客戶繼續執行show open tables where in_use >=1:
發現有個表t1始終處於in use狀態,所以猜測是使用者某個session持有了該表t1的MDL鎖未釋放,導致lock tables for backup等待超時。但是結合show processlist仍然無法確定是哪個session持有表t1的MDL鎖,想讓全備執行成功,只能通知客戶逐一斷連session或者重啟例項。
引入MDL鎖檢視後,客戶執行SELECT * FROM INFORMATION_SCHEMA.METADATA_LOCK_INFO:
結合show processlist的結果,從元資料鎖檢視中可以明顯看出,session 4 pending在全域性backup lock上;session 2持有全域性的backup lock,該MDL鎖型別為MDL_EXPLICIT,global級別。因此,客戶只需要在session 2顯式呼叫unlock tables釋放鎖或者kill session 2即可讓業務繼續執行。
通過以上兩個案例,MDL鎖檢視的重要性不言而喻,它可以讓客戶和一線運維人員清晰地檢視資料庫各session持有和等待的元資料鎖資訊,從而找出資料庫MDL鎖等待的根因,準確地進行下一步決策,有效降低對業務的影響。
華為雲資料庫MySQL在828企業上雲節期間,還有眾多優惠活動,體驗MDL鎖檢視的最佳時機。
相關推薦
有了MDL鎖檢視,業務死鎖從此一目瞭然
摘要:MDL鎖檢視讓一線運維人員清晰地檢視資料庫各session持有和等待的元資料鎖資訊,從而找出資料庫MDL鎖等待的根因,準確地進行下一步決策。 當多使用者共同存取資料時,資料庫中就會產生多個事務同時存取同一資料的情況。若不控制這種併發操作,資料庫的一致性就會被破壞。這種情況下,加鎖是實現資料庫併發控制的關
MYSQL的鎖介紹,以及死鎖發生情況-帶例子
mysql鎖能在併發情況下的mysql進行更好的優化 MySQL有三種鎖的級別:頁級、表級、行級,這3種鎖的特性可大致歸納如下: 表級鎖:開銷小,加鎖快;不會出現死鎖;鎖定粒度大,發生鎖衝突的概率最高,併發度最低。 行級鎖:開銷大,加鎖慢;會出現死鎖;鎖定粒度最小,
事務的隔離級別,加鎖的細節,以及兩者之間的關係。 同時也說明了 索引 與 鎖 之間的關係,以及死鎖成因的簡化的情況
背景 MySQL/InnoDB的加鎖分析,一直是一個比較困難的話題。我在工作過程中,經常會有同事諮詢這方面的問題。同時,微博上也經常會收到MySQL鎖相關的私信,讓我幫助解決一些死鎖的問題。本文,準備就MySQL/InnoDB的加鎖問題,展開較為深入的分析與討論,
什麽是死鎖,簡述死鎖發生的四個必要條件,如何避免與預防死鎖
競爭 時間 鎖死 分配 獲得 進程 發生 未使用 例如 什麽是死鎖 死鎖是指多個進程因競爭資源而造成的一種僵局(互相等待),若無外力作用,這些進程都將無法向前推進。例如,在某一個計算機系統中只有一臺打印機和一臺輸入 設備,進程P1正占用輸入設備,同時又提出使用打印機的請求,
手機有了這些小程序,媽媽再也不用擔心我的手機內存不足|極限工坊淘小咖
××× 公交 proc 列表 替代 ext roc 知識 vpd 自從騰訊開始推小程序之後,各式各樣的小程序也開始層出不窮! 自從用了這些小程序,生活方便了很多,完美替代APP,拯救了手機內存不足。 今天來給大家分享幾款比較常用的。 車來了實時公交: 有沒有覺得每次去了公
程式猿的血淚史:一定要有資料備份的思想,不然死都不知道咋死的!!!
最近幾天水逆過頭了,硬碟在發生了眾多小毛病後,今天它終於被我搞掛了,600多G的資料,雖然真正有用的也就一點,但之前裝的軟體,配的環境什麼的一下全沒了,這感覺還是很爽啊!!!!QAQ!!! 硬碟掛掉的原因很簡單:首先它出現了一點小問題: 聯想Y700筆記本:硬碟突然不見了。好不容易
有了億視康,讓你對近視說拜拜
億視康採用的物理訓練法,就是針對眼的解剖結構和生理機能,通過有針對性的視覺訓練,促使睫狀肌持續進行主動調節,從而恢復晶狀體彈性,使其厚薄調節範圍恢復到正常範疇,改善屈光度,以保證視網膜成像的聚焦清晰,從而緩解或解除視力障礙,恢復視力健康。一.治療效果: 輕度近視、弱視:雙眼視力在0.6以上者,經1個療
有了麝香鼻炎靈,再也不怕得鼻炎了,二十年老鼻炎都能治好!
detail png 特點 通過 健康 進行 左右 就是 分享圖片 ??如果你有十年,20年的各類老鼻炎,鼻竇炎,中耳炎,就用麝香鼻炎靈滴鼻液。淘寶購買地址:點擊購買麝香鼻炎靈打開淘寶搜索:宜爽中醫鼻炎選用了三十多味專門治療鼻炎方面的一些中藥材,選用了珍稀名貴的野生中藥材麝
有了這些 Chrome 外掛,效率提升10倍
Chrome 瀏覽器深受廣大程式設計師的喜愛,把她稱之為一場瀏覽器革命毫不為過。而它的外掛能夠極大地提高生產效率,筆者把自己經常用到的感覺不錯的外掛分享給大家,同時歡迎大夥兒推薦更多更好玩的外掛。 0、Proxy SwitchyOmega Proxy SwitchyOmega 是科學上網的必
C++ 鎖,socket死鎖
我們常常對需要多執行緒共同訪問的資源進行加鎖,但當在同一個執行緒中時,一個鎖還沒離開之前,還可以加一道鎖。。。 例: CRITICAL_SECTION cs; InitializeCriticalSection(&cs);Ente
java實現哲學家進餐問題,及其死鎖問題的解決
首先我們來了解一下哲學家進餐問題的背景: 話說有5個哲學家圍在一張桌子上吃飯,桌上只有5g根筷子,一個要吃飯必須的得有兩根筷子,哲學家要吃飯時總是先拿起左邊的筷子,在拿起右邊的筷子,這樣最佳的情況是可同時有兩人可以進餐,最壞的情況是大家都拿起了左邊的筷子,大家
oracle資料庫檢視和解除死鎖
檢視死鎖: select sess.sid, sess.serial#, lo.oracle_username, lo.os_user_name, ao.object_name, lo.locked_mode, SESS.machine from v$locked_object lo, dba_o
【面試系列】哲學家就餐問題(3個)--多執行緒,防死鎖
public class Dinning { public static void main(String[] args) { KuaiZi k1 = new KuaiZi("筷子一號"); KuaiZi k2 = new KuaiZi("筷子二號"); Ku
自從有了Phantomjs和Casperjs,後臺網頁抓取和互動變得異常的簡單
Casperjs是基於Phantomjs的,而Phantom JS是一個伺服器端的 JavaScript API 的 WebKit。 這跟我一直想找個自帶瀏覽器核心的後臺東西的想法“暗合”。所以,在我發現這東西的時候就已經開始不由自主的興奮起來了,研究一番之後
什麼是死鎖,簡述死鎖發生的四個必要條件,如何避免與預防死鎖
什麼是死鎖 死鎖是指多個程序因競爭資源而造成的一種僵局(互相等待),若無外力作用,這些程序都將無法向前推進。例如,在某一個計算機系統中只有一臺印表機和一臺輸入 裝置,程序P1正佔用輸入裝置,同時又提出使用印表機的請求,但此時印表機正被程序P2 所佔用,而P
有了這個模板集合,輕鬆玩轉版本控制中的ignore檔案
關於ignore檔案 如果你也像筆者一樣,在軟體開發過程中經常使用版本控制(Version Control)工具來對專案中的程式碼檔案進行管理,那麼本文就可以繼續閱讀下去了。 通常我們會用Git、SVN兩大工具管理專案程式碼檔案,使用Git的程式碼託管平臺常見有:國外的GitHub和國
有了陣列和字典,為何Swift還需要元組(tuples)?
**### 為什麼需要元組 為了回答這個問題,首先讓我們腦補一個例子:\ 假設有一個班級,數學科目經常小測((⊙o⊙)),數學老師非常用心的把每次成績都記錄下來了。如果我要拿到小明同學最近5次的數學成績,應該怎麼定義資料格式? 首先回顧一下,在c的時代,資
連線池中連線失效,mysql死鎖
mysqs資料庫,連線池為dbcp、druid,出現問題: 1、The last packet successfully received from the server was 915,358 m
9.死鎖的概念、導致死鎖的原因,導致死鎖的四個必要條件,預防死鎖的方法、避免死鎖的方法
死鎖避免策略 銀行家演算法:首先需要定義狀態和安全狀態的概念。系統的狀態是當前給程序分配的資源情況。因此,狀態包含兩個向量Resource(系統中每種資源的總量)和Available(未分配給程序的每種資源的總量)及兩個矩陣Claim(表示程序對資源的需求)和Allocation(表示當前分配給程
sqlserver數據庫,查詢死鎖進程SQL語句
sys pre associate 死鎖 entity from tran -- object -----查詢死鎖IDselect request_session_id spid, OBJECT_NAME(resource_associated_entity_id