成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

MySQL 實戰筆記 第02期:MySQL 元數據鎖

數據庫 MySQL
當我們在 MySQL 中執行 DDL 語句時,經常會發現語句沒有在你預期的時間完成,這時候我們通常會使用 show full processlist ,來看看發生了什么狀況。當你看到 waiting for table metadata lock 時,那就碰到元數據鎖了。那元數據鎖是怎樣產生的又應該怎樣避免呢?讓我們從這篇文章開始了解它。

當我們在 MySQL 中執行 DDL 語句時,經常會發現語句沒有在你預期的時間完成,這時候我們通常會使用 show full processlist ,來看看發生了什么狀況。當你看到 waiting for table metadata lock 時,那就碰到元數據鎖了。那元數據鎖是怎樣產生的又應該怎樣避免呢?讓我們從這篇文章開始了解它。

1、什么是元數據鎖

MDL 全稱為 metadata lock,即元數據鎖,一般也可稱為字典鎖。MDL 的主要作用是為了管理數據庫對象的并發訪問和確保元數據一致性。元數據鎖適用對象包含:table、schema、procedures, functions, triggers, scheduled events、tablespaces 。

2、加鎖規則

獲取規則:

  • 語句逐個( one by one )獲取元數據鎖,不是同時獲取,并在獲取過程中執行死鎖檢測。
  • DML 語句獲取鎖按照語句中 table 出現的順序來獲取鎖。
  • DDL 語句、LOCK TABLES 和其他類似語句按名稱順序獲取鎖,對于隱式使用的表(例如外鍵關系中也必須鎖定的表)可能會以不同的順序獲取鎖。
  • DDL 的寫鎖請求優先級高于 DML

3、模擬加鎖規則

兩個相同表結構的表 t 和 t_new 開始。三個線程來操作這些表:

場景一

線程 1:

  1. LOCK TABLE t WRITE, t_new WRITE; 

該語句按表名順序在 t 和 t_new 上獲取寫鎖

線程 2:

  1. INSERT INTO t VALUES(1); 

該語句處于也需要獲取表 t 上的 MDL 所以處于等待狀態

線程 3:

  1. RENAME TABLE t TO t_old, t_new TO t; 

該語句需要按表名順序在 t 、t_new、t_old 上獲取互斥鎖,所以也處于等待狀態

線程 1:

  1. UNLOCK TABLES; 

該語句釋放對 t 和 t_new 的寫鎖定。線程 3 對 t 加寫鎖的優先級高于 線程 2 ,因此線程 3 在 t 上優先獲得互斥鎖,然后依次在 t_new、t_old 上獲取互斥鎖,執行重命名后釋放其鎖定。線程 2 獲得 t 上的寫鎖,執行插入操作,然后釋放其鎖定。rename 操作在 insert 之前執行。

場景二

兩個具有相同表結構的表 t 和 new_t ,同樣是三個線程來操作這些表

線程 1:

  1. LOCK TABLE t WRITE, new_t WRITE; 

該語句按表名順序在 new_t 和 t 上獲取寫鎖

線程 2:

  1. INSERT INTO t VALUES(1); 

該語句處于也需要獲取表 t 上的 MDL 所以處于等待狀態

線程 3:

  1. RENAME TABLE t TO old_t, new_t TO t; 

該語句需要按表名順序在 new_t 、old_t、t 上獲取互斥鎖,所以也處于等待狀態

該語句釋放對 t 和 new_t 的寫鎖定。對于 t 首先發起鎖請求的是線程 2 ,因此線程 2 優先獲得了 t 上的元數據寫鎖,執行完插入操作,然后釋放該鎖。線程 3 首先獲取的是 new_t 、old_t 的互斥鎖,最后才會請求 t 上的互斥鎖,所以線程 3 在線程 2 執行完畢之前都是處于等待狀態的。rename 操作在 insert 操作之后。

4、 如何監控元數據鎖

performance_schema.metadata_locks 表中記錄了元數據鎖相關的信息,開啟方式如下:在線開啟 metadata_locks,操作如下:

  1. --UPDATE performance_schema.setup_consumers SET ENABLED = 'YES' WHERE NAME ='global_instrumentation'; 
  2. --此值默認已開啟了,可檢查確認。 
  3.  
  4. UPDATE performance_schema.setup_instruments SET ENABLED = 'YES' WHERE NAME ='wait/lock/metadata/sql/mdl'

若可停庫維護,則在 my.cnf 中添加如下:

  1. [mysqld] 
  2. performance-schema-instrument='wait/lock/metadata/sql/mdl=ON' 

5、如何優化元數據鎖

MDL 鎖一旦發生會對業務造成極大影響,因為后續所有對該表的訪問都會被阻塞,造成連接積壓。我們日常要盡量避免 MDL 鎖的發生,下面給出幾點優化建議可供參考:

  • 開啟 metadata_locks 表記錄 MDL 鎖。
  • 設置參數 lock_wait_timeout 為較小值,使被阻塞端主動停止。
  • 規范使用事務,及時提交事務,避免使用大事務。
  • 增強監控告警,及時發現 MDL 鎖。
  • DDL 操作及備份操作放在業務低峰期執行。 

 

責任編輯:龐桂玉 來源: 楊建榮的學習筆記
相關推薦

2020-12-24 17:40:00

MySQL角色管理數據庫

2024-02-01 12:32:35

MySQL數據鎖數據庫

2018-01-18 20:47:18

CPU數據線程

2021-12-14 08:10:00

MySQL行鎖間隙鎖

2018-06-21 13:50:33

MySQL主從信息元數據

2022-03-29 10:52:08

MySQL數據庫

2009-06-16 13:09:15

Hibernate實戰Hibernate

2009-06-18 14:20:45

hibernate實戰

2022-02-08 17:39:04

MySQL服務器存儲

2017-07-10 13:38:07

MySQL數據類型整數類型

2017-06-14 23:08:29

報表數據計算層

2010-11-22 14:27:05

MySQL鎖表

2010-06-07 13:30:15

2016-07-15 09:08:12

V課堂數字化制造

2024-08-22 14:16:08

2024-11-29 07:38:12

MySQL數據庫

2020-04-24 15:44:50

MySQL數據庫鎖機制

2013-01-21 13:41:59

IBMdW

2010-06-04 09:33:28

連接MySQL數據庫
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91超碰caoporn97人人| 国产一区二区三区四区 | 中文字幕日韩一区 | 国产精品久久久久久久午夜片 | 男女下面一进一出网站 | 欧美精品成人 | 欧美在线视频a | 亚洲国产日韩一区 | av黄色在线 | 中文二区| 日韩在线免费 | 精品伊人| 谁有毛片 | 久草在线在线精品观看 | 久久精品国产一区二区电影 | 免费黄色大片 | 午夜影院免费体验区 | 超碰在线人 | 亚洲一区综合 | 欧美久久综合 | 在线视频日韩精品 | 一级在线毛片 | 一级毛片视频在线 | 青青久久久 | av电影手机版 | 国产在线麻豆精品入口 | 国产成人99久久亚洲综合精品 | 九九精品网 | 欧美狠狠操 | 日韩在线视频一区二区三区 | 欧美精品乱码99久久影院 | 免费在线观看av片 | 欧美成人精品一区 | 麻豆天堂 | 国产精品一二三区 | 成人免费视频7777777 | 久久久久久久91 | 成年人视频在线免费观看 | 蜜桃av一区二区三区 | 亚洲成人观看 | 91国在线视频 |