校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > MySQL表結構變更你不可不知的Metadata Lock詳解

MySQL表結構變更你不可不知的Metadata Lock詳解

熱門標簽:商家地圖標注哪個好 合肥營銷外呼系統收費 陜西400電話如何申請 承德電腦地圖標注 深圳 外呼系統從哪買 地圖標注賺錢真假 遵義地圖標注app 德惠市地圖標注

前言

想必玩過mysql的人對Waiting for table metadata lock肯定不會陌生,一般都是進行alter操作時被堵住了,導致了我們在show processlist 時,看到線程的狀態是在等metadata lock。本文會對MySQL表結構變更的Metadata Lock進行詳細的介紹。

在線上進行DDL操作時,相對于其可能帶來的系統負載,其實,我們最擔心的還是MDL其可能導致的阻塞問題。

一旦DDL操作因獲取不到MDL被阻塞,后續其它針對該表的其它操作都會被阻塞。典型如下,如阻塞稍久的話,我們會看到Threads_running飆升,CPU告警。

mysql> show processlist;
+----+-----------------+-----------+-----------+---------+------+---------------------------------+------------------------------------+
| Id | User | Host | db | Command | Time | State  | Info  |
+----+-----------------+-----------+-----------+---------+------+---------------------------------+------------------------------------+
| 4 | event_scheduler | localhost | NULL | Daemon | 122 | Waiting on empty queue | NULL  |
| 9 | root | localhost | NULL | Sleep | 57 |   | NULL  |
| 12 | root | localhost | employees | Query | 40 | Waiting for table metadata lock | alter table slowtech.t1 add c1 int |
| 13 | root | localhost | employees | Query | 35 | Waiting for table metadata lock | select * from slowtech.t1 |
| 14 | root | localhost | employees | Query | 30 | Waiting for table metadata lock | select * from slowtech.t1 |
| 15 | root | localhost | employees | Query | 19 | Waiting for table metadata lock | select * from slowtech.t1 |
| 16 | root | localhost | employees | Query | 10 | Waiting for table metadata lock | select * from slowtech.t1 |
| 17 | root | localhost | employees | Query | 0 | starting  | show processlist  |
+----+-----------------+-----------+-----------+---------+------+---------------------------------+------------------------------------+
rows in set (0.00 sec)

如果發生在線上,無疑會影響到業務。所以,一般建議將DDL操作放到業務低峰期做,其實有兩方面的考慮,1. 避免對系統負載產生較大影響。2. 減少DDL被阻塞的概率。 

MDL引入的背景

MDL是MySQL 5.5.3引入的,主要用于解決兩個問題,

RR事務隔離級別下不可重復讀的問題

如下所示,演示環境,MySQL 5.5.0。

session1> begin;
Query OK, 0 rows affected (0.00 sec)

session1> select * from t1;
+------+------+
| id | name |
+------+------+
| 1 | a |
| 2 | b |
+------+------+
rows in set (0.00 sec)

session2> alter table t1 add c1 int;
Query OK, 2 rows affected (0.02 sec)
Records: 2 Duplicates: 0 Warnings: 0

session1> select * from t1;
Empty set (0.00 sec)

session1> commit;
Query OK, 0 rows affected (0.00 sec)

session1> select * from t1;
+------+------+------+
| id | name | c1 |
+------+------+------+
| 1 | a | NULL |
| 2 | b | NULL |
+------+------+------+
rows in set (0.00 sec)

可以看到,雖然是RR隔離級別,但在開啟事務的情況下,第二次查詢卻沒有結果。

主從復制問題

包括主從數據不一致,主從復制中斷等。

如下面的主從數據不一致。

session1> create table t1(id int,name varchar(10)) engine=innodb;
Query OK, 0 rows affected (0.00 sec)

session1> begin;
Query OK, 0 rows affected (0.00 sec)

session1> insert into t1 values(1,'a');
Query OK, 1 row affected (0.00 sec)

session2> truncate table t1;
Query OK, 0 rows affected (0.46 sec)

session1> commit;
Query OK, 0 rows affected (0.35 sec)

session1> select * from t1;
Empty set (0.00 sec)

再來看看從庫的結果

session1> select * from slowtech.t1;
+------+------+------+
| id | name | c1 |
+------+------+------+
| 1 | a | NULL |
+------+------+------+
row in set (0.00 sec)

看看binlog的內容,可以看到,truncate操作記錄在前,insert操作記錄在后。

# at 7140
#180714 19:32:14 server id 1 end_log_pos 7261 Query thread_id=31 exec_time=0 error_code=0
SET TIMESTAMP=1531567934/*!*/;
create table t1(id int,name varchar(10)) engine=innodb
/*!*/;

# at 7261
#180714 19:32:30 server id 1 end_log_pos 7333 Query thread_id=32 exec_time=0 error_code=0
SET TIMESTAMP=1531567950/*!*/;
BEGIN
/*!*/;
# at 7333
#180714 19:32:30 server id 1 end_log_pos 7417 Query thread_id=32 exec_time=0 error_code=0
SET TIMESTAMP=1531567950/*!*/;
truncate table t1
/*!*/;
# at 7417
#180714 19:32:30 server id 1 end_log_pos 7444 Xid = 422
COMMIT/*!*/;

# at 7444
#180714 19:32:34 server id 1 end_log_pos 7516 Query thread_id=31 exec_time=0 error_code=0
SET TIMESTAMP=1531567954/*!*/;
BEGIN
/*!*/;
# at 7516
#180714 19:32:24 server id 1 end_log_pos 7611 Query thread_id=31 exec_time=0 error_code=0
SET TIMESTAMP=1531567944/*!*/;
insert into t1 values(1,'a')
/*!*/;
# at 7611
#180714 19:32:34 server id 1 end_log_pos 7638 Xid = 421
COMMIT/*!*/;

如果會話2執行的是drop table操作,還會導致主從中斷。

有意思的是,如果會話2執行的是alter table操作,其依舊會被阻塞,阻塞時間受innodb_lock_wait_timeout參數限制。

mysql> show processlist;
+----+------+-----------+----------+---------+------+-------------------+---------------------------+
| Id | User | Host | db | Command | Time | State  | Info   |
+----+------+-----------+----------+---------+------+-------------------+---------------------------+
| 54 | root | localhost | NULL | Query | 0 | NULL  | show processlist  |
| 58 | root | localhost | slowtech | Sleep | 1062 |   | NULL   |
| 60 | root | localhost | slowtech | Query | 11 | copy to tmp table | alter table t1 add c1 int |
+----+------+-----------+----------+---------+------+-------------------+---------------------------+
rows in set (0.00 sec)

MDL的基本概念

首先,看看官方的說法,

To ensure transaction serializability, the server must not permit one session to perform a data definition language (DDL) statement on a table that is used in an uncompleted explicitly or implicitly started transaction in another session.

The server achieves this by acquiring metadata locks on tables used within a transaction and deferring release of those locks until the transaction ends.

A metadata lock on a table prevents changes to the table's structure.

This locking approach has the implication that a table that is being used by a transaction within one session cannot be used in DDL statements by other sessions until the transaction ends.

從上面的描述可以看到,

1. MDL出現的初衷就是為了保護一個處于事務中的表的結構不被修改。

2. 這里提到的事務包括兩類,顯式事務和AC-NL-RO(auto-commit non-locking read-only)事務。顯式事務包括兩類:1. 關閉AutoCommit下的操作,2. 以begin或start transaction開始的操作。AC-NL-RO可理解為AutoCommit開啟下的select操作。

3. MDL是事務級別的,只有在事務結束后才會釋放。在此之前,其實也有類似的保護機制,只不過是語句級別的。

需要注意的是,MDL不僅僅適用于表,同樣也適用于其它對象,如下表所示,其中,"等待狀態"對應的是"show processlist"中的State。

 

為了提高數據庫的并發度,MDL被細分為了11種類型。

  • MDL_INTENTION_EXCLUSIVE
  • MDL_SHARED
  • MDL_SHARED_HIGH_PRIO
  • MDL_SHARED_READ
  • MDL_SHARED_WRITE
  • MDL_SHARED_WRITE_LOW_PRIO
  • MDL_SHARED_UPGRADABLE
  • MDL_SHARED_READ_ONLY
  • MDL_SHARED_NO_WRITE
  • MDL_SHARED_NO_READ_WRITE
  • MDL_EXCLUSIVE

常用的有MDL_SHARED_READ,MDL_SHARE D_WRITE及MDL_EXCLUSIVE,其分別用于SELECT操作,DML操作及DDL操作。其它類型的對應操作可參考源碼sql/mdl.h。

對于MDL_EXCLUSIVE,官方的解釋是,

/*
An exclusive metadata lock.
A connection holding this lock can modify both table's metadata and data.
No other type of metadata lock can be granted while this lock is held.
To be used for CREATE/DROP/RENAME TABLE statements and for execution of
certain phases of other DDL statements.
*/

簡而言之,MDL_EXCLUSIVE是獨占鎖,在其持有期間是不允許其它類型的MDL被授予,自然也包括SELECT和DML操作。

這也就是為什么DDL操作被阻塞時,后續其它操作也會被阻塞。

關于MDL的補充

1. MDL的最大等待時間由lock_wait_timeout參數決定,其默認值為31536000(365天)。在使用工具進行DDL操作時,這個值就不太合理。事實上,pt-online-schema-change和gh-ost對其就進行了相應的調整,其中,前者60s,后者3s。

2. 如果一個SQL語法上有效,但執行時報錯,如,列名不存在,其同樣會獲取MDL鎖,直到事務結束才釋放。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

您可能感興趣的文章:
  • MySQL出現Waiting for table metadata lock的原因方法
  • MYSQL METADATA LOCK(MDL LOCK)MDL鎖問題分析
  • MySQL slave 延遲一列 外鍵檢查和自增加鎖
  • 淺談MySQL next-key lock 加鎖范圍
  • MySQL 加鎖控制并發的方法
  • PHP+MySQL高并發加鎖事務處理問題解決方法
  • MYSQL METADATA LOCK(MDL LOCK) 理論及加鎖類型測試

標簽:南陽 三門峽 新余 揚州 贛州 巴中 商丘 貴州

巨人網絡通訊聲明:本文標題《MySQL表結構變更你不可不知的Metadata Lock詳解》,本文關鍵詞  MySQL,表,結構,變更,你,不可,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《MySQL表結構變更你不可不知的Metadata Lock詳解》相關的同類信息!
  • 本頁收集關于MySQL表結構變更你不可不知的Metadata Lock詳解的相關信息資訊供網民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    极品美女销魂一区二区三区免费| 欧美激情一区二区三区不卡| 色爱区综合激月婷婷| 国产精品1024| 91在线看国产| 在线一区二区三区四区| 成人av免费网站| 91理论电影在线观看| 日韩一区二区免费在线观看| 日韩欧美久久久| 2023国产精品| 国产一区二区三区在线观看免费视频| 狠狠色丁香久久婷婷综合丁香| 国产成人三级在线观看| 欧美老女人在线| 久久久精品国产99久久精品芒果| 亚洲视频狠狠干| 美女任你摸久久| 91视频免费观看| 久久精品水蜜桃av综合天堂| 亚洲国产欧美一区二区三区丁香婷| 奇米777欧美一区二区| 99久久精品国产精品久久| 91精品国产综合久久婷婷香蕉 | 国产欧美一区二区精品性色 | 欧美在线一区二区三区| 精品国产精品网麻豆系列| 亚洲人一二三区| 国产一区不卡在线| 欧美色精品在线视频| 国产欧美在线观看一区| 美国精品在线观看| 欧美午夜精品一区| 亚洲天堂福利av| 国产成人亚洲综合a∨猫咪| 日韩欧美亚洲国产精品字幕久久久| 亚洲欧美在线高清| 99视频精品全部免费在线| 久久午夜电影网| 国产一区二区视频在线| 国产精品情趣视频| av在线不卡网| 亚洲三级视频在线观看| 91丨九色丨国产丨porny| 国产精品国产三级国产专播品爱网| 国产成人亚洲综合a∨婷婷图片| 51精品秘密在线观看| 精品亚洲成a人在线观看| 久久一区二区三区四区| 国产美女精品在线| 中文字幕亚洲视频| 在线观看亚洲a| 久久99蜜桃精品| 欧美激情在线免费观看| 色94色欧美sute亚洲线路一久| 亚洲国产wwwccc36天堂| 欧美不卡一区二区| 99久久精品国产网站| 视频在线观看一区二区三区| 精品国内二区三区| 色婷婷亚洲综合| 狠狠网亚洲精品| 午夜av电影一区| 国产亚洲午夜高清国产拍精品 | 国产欧美精品一区二区色综合| 91视视频在线观看入口直接观看www | 国产精品三级av在线播放| 亚洲国产精品欧美一二99| 久久久久久久网| 欧美性xxxxxxxx| 国产在线国偷精品免费看| 亚洲欧美日韩一区二区 | 色偷偷一区二区三区| 韩国精品久久久| 亚洲一区二区欧美| 日韩欧美色电影| 欧美亚一区二区| 国产成人免费视频精品含羞草妖精| 一色屋精品亚洲香蕉网站| 欧美精品色一区二区三区| 99久久婷婷国产综合精品电影| 亚洲成人综合视频| 中文字幕一区二区三区精华液| 欧美大片国产精品| 欧美日韩国产一级二级| 高清不卡在线观看av| 午夜视频一区二区| 怡红院av一区二区三区| 综合久久久久综合| 国产欧美精品区一区二区三区 | 92精品国产成人观看免费| 免费一级欧美片在线观看| 午夜精彩视频在线观看不卡| 一区二区三区四区视频精品免费| 欧美日韩午夜影院| 欧美肥妇bbw| 日韩免费高清视频| 欧美一区二区视频在线观看2020| 欧美日韩一区二区在线视频| 日韩高清在线电影| 亚洲无人区一区| 琪琪久久久久日韩精品| 麻豆成人久久精品二区三区红| 免费美女久久99| 丰满岳乱妇一区二区三区| 国产美女娇喘av呻吟久久| 国产白丝精品91爽爽久久| 暴力调教一区二区三区| 欧美另类高清zo欧美| 欧美午夜片在线看| 中文字幕在线一区免费| 亚洲大片在线观看| 六月丁香婷婷久久| 91免费观看视频在线| 日韩视频免费观看高清完整版 | 91丨国产丨九色丨pron| 欧美不卡视频一区| 亚洲三级在线免费观看| 国产精选一区二区三区| 欧美曰成人黄网| 欧美国产精品久久| 亚洲女同ⅹxx女同tv| 婷婷开心激情综合| 精品视频免费在线| 精品国产污污免费网站入口 | 精品一区二区在线视频| 国产综合色产在线精品| 色吧成人激情小说| 国产精品午夜在线观看| 久久国产尿小便嘘嘘| 欧美在线一二三| 亚洲国产精品久久久男人的天堂| 色香蕉成人二区免费| 欧美国产一区二区在线观看| 国内偷窥港台综合视频在线播放| 91精品一区二区三区久久久久久 | 色综合久久久久综合体桃花网| 久久一区二区三区四区| 国产一区二区在线免费观看| 欧美xxxx在线观看| 国产高清精品网站| 久久久三级国产网站| 成人看片黄a免费看在线| 国产精品视频你懂的| 成人免费高清在线| 久色婷婷小香蕉久久| 亚洲人被黑人高潮完整版| 成人av网在线| 亚洲激情图片小说视频| 7777精品久久久大香线蕉| 日韩精品一卡二卡三卡四卡无卡| 在线视频国产一区| 亚洲国产精品久久一线不卡| 欧美色网一区二区| 丝瓜av网站精品一区二区| 3atv一区二区三区| 美女性感视频久久| 久久久欧美精品sm网站| 欧美性极品少妇| 精品一区免费av| 中文字幕一区在线观看视频| 久久免费国产精品| 在线播放日韩导航| 高清不卡一区二区在线| 一区二区三区四区激情| 日本一区免费视频| 欧美一级高清大全免费观看| 成人h版在线观看| 粉嫩av一区二区三区在线播放 | ...av二区三区久久精品| 欧美巨大另类极品videosbest| 成人精品一区二区三区中文字幕| 视频在线在亚洲| 久久久久久久久蜜桃| 久久久久久久性| 国产午夜亚洲精品不卡| 日韩一区二区三区精品视频| 欧美影院一区二区| 91美女视频网站| 欧美私人免费视频| 777xxx欧美| 精品国产免费一区二区三区四区| 欧美日韩一区二区在线观看| 91视频在线观看免费| 91福利小视频| 国产精品久久久久久久久图文区| 欧美午夜精品免费| 日韩午夜av电影| 欧美国产日产图区| 国产精品护士白丝一区av| 一区二区三区 在线观看视频| 一二三区精品视频| 日本成人在线视频网站| 久久99国产精品麻豆| 日本va欧美va欧美va精品| 久久99久国产精品黄毛片色诱| 国产一区二区三区在线观看免费 | 色哟哟亚洲精品| 欧美丝袜自拍制服另类| 久久综合九色欧美综合狠狠|