今日突然發現當mysql進行冷備時,正好進行DDL操作,此時引發了死鎖,進行DDL的表很小,請問有大神知道嗎?是不是冷備時此表的DML操作引發了大量的metadata lock?
uj5u.com熱心網友回復:
另一類的表級鎖是MDL即meta data lock,MDL不需要顯式使用,在訪問一個表的時候會被自動加上。MDL的作用是保證讀寫的正確性。例如,如果一個查詢正在遍歷一個表中的資料,而執行期間另一個執行緒對這個表結構做變更,刪了一列,那么查詢執行緒拿到的結果跟表結構對不上,這是肯定有誤的。
當對一個表增刪改查時,加MDL讀鎖,當對表結構變更操作時候加MDL寫鎖。
1、讀鎖之間不互斥,因此可以有多個執行緒同時對一張表增刪改查。
2、讀寫鎖之間、寫鎖之間是互斥的,用來保正變更表結構操作的安全性。因此如果有兩個執行緒要同時給一個表加欄位,其中一個要等另一個執行完成才能開始執行。
事務中的MDL鎖,在陳述句執行開始時申請,但是陳述句結束后并不會馬上釋放,而會等到整個事務提交后再釋放。
出現查詢一行資料或是少量資料長時間不回傳,可能就是有執行緒在表上請求或持有MDL寫鎖,把select陳述句堵了。
mysql里對表做flush操作有兩種情況:
flush tables t with read lock; flush tables with read lock;指定表,則只關閉表t,如果沒有指定則關閉所有打開的表。所以出現waiting for table flush狀態可能情況是:有一個flush tables命令被別的陳述句堵住了,然后又堵住了當前select陳述句。
uj5u.com熱心網友回復:
冷備時,正好進行DDL操作冷備時,你怎么執行的DDL ?
uj5u.com熱心網友回復:
應該是熱備份吧?冷備份不是資料斷開連接了么?轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/18281.html
標籤:MySQL
上一篇:請一句sql查詢
