国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

生產運維腳本引發的 MDL 鎖故障排查之旅

運維
當事務持有?SHARED_UPGRADABLE?鎖時,可以根據操作需求將其升級為?SHARED_NO_WRITE?鎖(允許讀取但不允許寫入)或?EXCLUSIVE?鎖(獨占鎖,不允許其他事務同時訪問)。這種升級機制在數據庫操作中用于確保數據的一致性和并發控制。

1. 故障背景

在生產環境中,DBA 經常需要執行 DDL 變更操作。在此過程中,無法獲取 MDL(元數據鎖)的問題時有發生。

當執行 show processlist 命令時,若出現 waiting for table metadata lock 提示,這表明數據庫遭遇了 MDL 元數據鎖問題。

為此,筆者結合以往生產故障案例,梳理 MDL 鎖問題的排查思路與方法。

2. 問題重現

2.1 一個有隱患的腳本

生產運維腳本調用了連接池,但在執行完數據庫操作后,未關閉數據庫游標與連接,這為后續的 MDL 鎖問題埋下了隱患。

import mysql.connector
from dbutils.pooled_db import PooledDB
# 數據庫連接信息
pool = PooledDB(
    creator=mysql.connector,  # 使用mysql.connector作為數據庫驅動
    mincached=1,  # 連接池中空閑連接的初始數量
    maxcached=10,  # 連接池中空閑連接的最大數量
    maxshared=3,  # 共享連接的最大數量
    maxconnections=15,  # 連接池允許的最大連接數
    blocking=True,  # 當連接池達到最大連接數時,是否阻塞等待
    host='xx.xx.xx.xx',
    user='wms',
    password='123456',
    database='wms',
    unix_socket='/data/mysql8.0.23-3306/mysql-8.0.23/mysql3306.sock'
)
try:
    # 從連接池中獲取一個連接
    conn = pool.connection()
    cursor = conn.cursor()
    # 執行查詢語句
    sql = "SELECT * FROM wms.order_info LIMIT 1;"
    cursor.execute(sql)
    results = cursor.fetchall()
    for row in results:
        print(row)
    # 不釋放連接和連接池,模擬連接未釋放的情況
    # cursor.close()
    # conn.close()
    # 保持程序運行,方便在其他會話中執行 DDL 操作
    whileTrue:
        pass
except mysql.connector.Error as err:
    print(f"Error: {err}")

2.2 模擬生產 DDL 操作

變更窗口:DBA 在數據庫中進行相關表的 DDL 操作時,問題逐漸顯現。

// 執行腳本
[root@11-186-63-123 opt]# python3.8 pool.py

// 會話1:對該表加字段,執行 DDL 操作,發現 DDL 掛起
ALTER TABLE wms.order_info MODIFY COLUMN status varchar(35);

// 會話2:檢查數據庫會話,發現產生 MDL 鎖
mysql> select * from information_schema.processlist where command != 'Sleep';
+--------+-----------------+---------------------+------+------------------+---------+---------------------------------------------------------------+---------------------------------------------------------------------+
| ID     | USER            | HOST                | DB   | COMMAND          | TIME    | STATE                                                         | INFO                                                                |
+--------+-----------------+---------------------+------+------------------+---------+---------------------------------------------------------------+---------------------------------------------------------------------+
|     57 | repl            | 11.186.63.118:36624 | NULL | Binlog Dump GTID | 2872846 | Master has sent all binlog to slave; waiting for more updates | NULL                                                                |
| 377524 | root            | localhost           | wms  | Query            |      37 | Waiting for table metadata lock                               | ALTER TABLE wms.order_info MODIFY COLUMN status varchar(35)         |
|      5 | event_scheduler | localhost           | NULL | Daemon           | 3022562 | Waiting onempty queue                                        | NULL                                                                |
| 378462 | root            | localhost           | NULL | Query            |       0 | executing                                                     | select * from information_schema.processlist where command != 'Sleep' |
+--------+-----------------+---------------------+------+------------------+---------+---------------------------------------------------------------+---------------------------------------------------------------------+
4rowsinset (0.00 sec)

// 會話3:讀寫操作均被阻塞,業務受到影響
mysql> select * from wms.order_info limit 1;
mysql> insert into order_info values(9911131,121,'2012-12-12 12:00:00','1',1);

由于等待獲取 MDL 鎖,對該表的任何操作都處于阻塞狀態,嚴重影響業務。

3. 排查思路

3.1 查看當前已持有的 MDL 鎖的事務信息

select OBJECT_SCHEMA,OBJECT_NAME,COLUMN_NAME,LOCK_TYPE,LOCK_STATUS,OWNER_THREAD_ID from performance_schema.metadata_locks where OBJECT_NAME='order_info';
+---------------+-------------+-------------+-------------------+-----------+-----------------+
| OBJECT_SCHEMA | OBJECT_NAME | COLUMN_NAME | LOCK_TYPE         | LOCK_STATUS | OWNER_THREAD_ID |
+---------------+-------------+-------------+-------------------+-----------+-----------------+
| wms           | order_info  | NULL        | SHARED_UPGRADABLE | GRANTED     |          392740 |
| wms           | order_info  | NULL        | EXCLUSIVE         | PENDING     |          392740 |
| wms           | order_info  | NULL        | SHARED_READ       | GRANTED     |          392747 |
+---------------+-------------+-------------+-------------------+-----------+-----------------+
3 rows in set (0.00 sec)

## LOCK_STATUS:表示鎖的當前狀態;GRANTED(已授予鎖),PENDING(等待授予鎖)。

從查詢結果可以推斷,有一個事務(線程 ID 為 392747)持有 order_info 表的共享讀鎖,另一個事務(線程 ID 為 392740)持有 SHARED_UPGRADABLE(共享升級鎖),并試圖將其升級為 EXCLUSIVE (排他鎖),但由于共享鎖的存在而等待。

3.2 根據線程 ID 獲取 MySQL 的 processlist_id

mysql> select THREAD_ID,PROCESSLIST_ID from performance_schema.threads where thread_id in (392740,392747);
+-----------+----------------+
| THREAD_ID | PROCESSLIST_ID |
+-----------+----------------+
|    392740 |         392568 |
|    392747 |         392575 |
+-----------+----------------+
2 rows in set (0.00 sec)

3.3 根據 processlist_id 獲取 sql_text

mysql> SELECT a.thread_id, a.sql_text  FROM performance_schema.events_statements_current a  WHERE a.THREAD_ID IN (     SELECT b.THREAD_ID      FROM performance_schema.threads b      WHERE b.PROCESSLIST_ID IN (392568, 392575) );
+-----------+-------------------------------------------------------------+
| thread_id | sql_text                                                    |
+-----------+-------------------------------------------------------------+
|    392740 | ALTER TABLE wms.order_info MODIFY COLUMN status varchar(30) |
|    392747 | SELECT * FROM wms.order_info LIMIT 1                        |
+-----------+-------------------------------------------------------------+
2 rows inset (0.00 sec)

綜上所述:select 查詢會話產生的 SHARED_READ(共享讀鎖),導致 SHARED_UPGRADABLE(共享升級鎖)無法升級為 EXCLUSIVE (排他鎖),故導致 DDL 掛起。

4. 解決方案

為了解決 DDL 掛起的問題,需要殺死持有 order_info 表共享讀鎖的相關事務。

kill 392575;

執行上述命令后,可以看到 DDL 操作成功執行。

mysql> ALTER TABLE wms.order_info MODIFY COLUMN status varchar(30);
Query OK, 1000001 rows affected (14 min 53.45 sec)
Records: 1000001  Duplicates: 0  Warnings: 0

5. 總結

5.1 鎖分類

鎖類型

作用范圍

核心作用

查看方法

行鎖

InnoDB 

存儲引擎層

實現事務并發控制與數據一致性,通過索引記錄鎖標志鎖定特定行,執行中自動獲取和釋放

可通過 SHOW ENGINE INNODB STATUS 查看行鎖相關信息

MDL 鎖

MySQL

Server 層

保護表元數據,操作表時自動獲取,防止表結構被修改

若有事務持有 MDL 寫鎖,其他等待獲取 MDL 鎖的會話會顯示處于 Waiting for table metadata lock 狀態。

全局鎖

MySQL

Server 層

對整個數據庫實例鎖定,執行 FLUSH TABLES WITH READ LOCK 獲取全局讀鎖,使數據庫只讀,阻塞寫操作,常用于數據庫邏輯備份保證數據一致性

1. SHOW PROCESSLIST 查看加鎖會話語句

2. 觀察寫操作會話,等待時顯示 Waiting for global read lock

5.2 共享升級鎖

SHARED_UPGRADABLE 是一種元數據鎖(Metadata Lock,簡稱 MDL),屬于 MySQL 中的鎖類型之一。它允許持有該鎖的事務在特定條件下將鎖升級為其他類型,如 EXCLUSIVE 鎖或 SHARED_NO_WRITE 鎖 。

升級機制

當事務持有 SHARED_UPGRADABLE 鎖時,可以根據操作需求將其升級為 SHARED_NO_WRITE 鎖(允許讀取但不允許寫入)或 EXCLUSIVE 鎖(獨占鎖,不允許其他事務同時訪問)。這種升級機制在數據庫操作中用于確保數據的一致性和并發控制。例如,在對表結構進行修改(如 DDL操作)時,可能需要將 SHARED_UPGRADABLE 鎖升級為 EXCLUSIVE 鎖,以防止其他事務在表結構修改過程中對表進行讀寫操作。

5.3 如何優化與避免 MDL 鎖

MDL 鎖一旦發生,會對業務造成極大影響,因為后續所有對該表的訪問都會被阻塞,導致連接積壓。為了盡量避免 MDL 鎖的發生,以下是幾點優化建議:

  • 開啟 metadata_locks 表記錄 MDL 鎖,以便更好地監控和分析鎖的使用情況。
  • 設置參數 lock_wait_timeout 為較小值,使被阻塞的操作能夠主動停止,避免長時間等待。
  • 規范使用事務,及時提交事務,避免使用大事務,減少鎖的持有時間。
  • 增強監控告警,及時發現 MDL 鎖問題,以便及時采取措施解決。
  • 將 DDL 操作及備份操作放在業務低峰期執行,減少對業務的影響。
  • 少用工具開啟事務進行查詢,圖形化工具使用后要及時關閉,避免不必要的鎖占用。
  • 規范運維腳本的使用,避免出現未關閉數據庫游標與連接等情況,本次故障就是由這種情況引發的。
責任編輯:武曉燕 來源: 愛可生開源社區
相關推薦

2020-09-25 11:10:51

運維故障排查監控

2021-10-28 17:05:11

IT運維故障

2020-11-12 11:00:42

運維IT架構

2018-09-10 05:03:51

網絡故障故障排查運維

2012-08-31 14:00:40

IT運維

2023-11-10 07:23:57

Kubernetes集群網絡

2022-04-12 08:43:04

生產故障Dubbo調用

2020-07-08 10:36:18

Linux 運維 數據

2021-07-21 16:22:40

運維架構技術

2017-07-25 10:53:27

2018-03-01 19:40:44

Linux運維常見問題

2024-01-08 16:14:40

美圖AIGC運維

2025-08-06 06:05:00

網絡故障Linux命令

2018-06-29 10:36:29

阿里云互聯網故障

2012-03-01 14:43:32

MySQLMDL

2013-08-04 21:44:48

運維故障故障排查云計算

2013-03-04 01:54:41

BYOD網絡建設網絡基礎架構

2019-04-01 14:39:32

Node.js故障排查

2020-06-12 13:26:03

線程池故障日志

2017-04-18 13:55:24

運維云計算WOT
點贊
收藏

51CTO技術棧公眾號

成人午夜激情视频| 久久久精品一品道一区| 亚洲美女喷白浆| 日本三区在线观看| 老牛国产精品一区的观看方式| 久久国产精品偷| 婷婷视频在线| k8久久久一区二区三区| 黄色99视频| 日韩大尺度在线观看| 精品国产乱码久久久久久久| 男男做性免费视频网| 成人妖精视频yjsp地址| 久久精品人成| 五月天综合网站| 亚洲3p在线观看| 欧美日韩va| 国产婷婷成人久久av免费高清| 玖玖综合伊人| 日韩码欧中文字| 青青艹视频在线| 麻豆久久久久久久| 97人人澡人人爽| 婷婷激情久久| 欧美精品在线播放| 欧美gay视频| 日韩黄色在线免费观看| 最新日本在线观看| 91精品国产综合久久婷婷香蕉| 黑人与亚洲人色ⅹvideos| 亚洲一区二区视频| 国产乱妇乱子| 久久久.com| 日韩av片在线看| 91免费视频大全| 真人抽搐一进一出视频| 国产精品一二一区| 天堂а√在线中文在线| 精品一二三四在线| 2025韩国大尺度电影| 精品在线免费观看| 中文字幕久久综合| 国产最新精品精品你懂的| 日韩在线国产| 国模少妇一区二区三区| 激情视频小说图片| 国产麻豆午夜三级精品| 五月天久久狠狠| 奇米色777欧美一区二区| 欧美一区国产一区| 免费欧美日韩国产三级电影| 日本一区二区三区视频免费看| 老司机午夜精品视频在线观看| 久久av二区| 亚洲视频大全| 亚洲精品9999| 成人久久视频在线观看| 欧美成人xxxxx| 136国产福利精品导航| 成年人视频免费看| 欧美性生活大片免费观看网址| 香蕉97视频观看在线观看| 色噜噜狠狠成人中文综合| 成人18在线| 日韩一区二区三区在线观看| 国产福利在线免费观看| 亚洲视频专区在线| 国产一区精品二区| 国产精品日韩在线播放| 亚洲国产美女| 日本女人高潮视频| 久久久影院官网| 午夜刺激在线| 精品视频1区2区3区| 国产传媒av在线| 欧美日本高清一区| 日韩国产在线| 欧美日韩在线精品一区二区三区| 免费人成黄页网站在线一区二区| 玩弄中年熟妇正在播放| 亚洲欧洲www| 91精品国产91久久久久游泳池| 精品91自产拍在线观看一区| 国外成人福利视频| 国产精品第三页| 久久国产精品久久w女人spa| 国产 日韩 欧美在线| 亚洲午夜视频在线观看| www.久久ai| 欧美极品美女视频网站在线观看免费 | 日韩欧美二区| 日韩精品欧美在线| 久久精品亚洲乱码伦伦中文| 一本到av在线| 亚洲国产第一页| 国产精品22p| 国内精品**久久毛片app| 99亚偷拍自图区亚洲| 污网站在线看| 一色桃子一区二区| 日韩.com| 国产传媒久久久| 欧美日韩一区二区免费在线观看| 免费看电影在线| 欧美一级大片视频| 九色综合狠狠综合久久| 午夜影院观看视频免费| 精品国产青草久久久久福利| 久久中文字幕导航| 欧美一区国产一区| 亚洲欧美日韩一区二区三区在线观看| 18+激情视频在线| 日本最新高清不卡中文字幕| 美女视频免费一区| 色视频www在线播放国产| 一区二区三区无码高清视频| 在线中文字幕亚洲| 成年人视频在线免费| 精品美女被调教视频大全网站| 日韩中文av| 欧美国产视频一区| 91精品久久久久久久91蜜桃| 欧美激情网址| 人体内射精一区二区三区| 欧洲中文字幕精品| 欧美人与动xxxxz0oz| 大地资源网在线观看免费官网| 精品久久中文字幕| 精品久久久久久久久久岛国gif| 精选一区二区三区四区五区| 亚洲欧洲综合另类在线| 国产成人精品一区二区三区在线| 成人免费看片网站| 亚洲欧洲日韩av| 午夜不卡一区| 先锋影音一区二区三区| 色综合婷婷久久| 真实原创一区二区影院| 97在线免费公开视频| 日韩毛片在线看| 美女爽到呻吟久久久久| 韩国精品视频| 成人欧美一区二区三区黑人| 中文字幕精品—区二区四季| av激情成人网| 99亚洲国产精品| 日韩精品福利网站| 久久久久综合| 亚洲成a人v欧美综合天堂麻豆| 国产免费观看久久黄| 一区二区三区中文免费| 欧美国产不卡| 黄色一级片视频| 日本精品视频在线| 最新国产成人在线观看| 日韩综合一区二区三区| 米仓穗香在线观看| 亚洲免费视频一区二区| 狠狠狠色丁香婷婷综合激情| 久草在线中文最新视频| 亚洲五月六月| 亚洲精品suv精品一区二区| 日韩不卡免费视频| sm在线观看| 2022中文字幕| 亚洲欧美国产日韩天堂区| 国产在线不卡一区| free欧美| 国产老熟妇精品观看| 精品中文字幕在线观看| 国产精品网站一区| 国产成人短视频在线观看| 黑料吃瓜在线观看| 国产一区二区三区奇米久涩| 欧美精品日韩一区| 久久男女视频| 国产h片在线观看| 国产freexxxx性播放麻豆| 中文字幕欧美日韩va免费视频| 成人免费精品视频| 北条麻妃一区二区三区在线观看| 国产在线播放观看| 久久久久久久久久av| 一区二区三区影院| 午夜视频精品| av电影在线地址| 久久久99精品视频| 久久人人爽人人| 欧美日韩日本国产| 日本不卡视频在线| 亚洲精品伊人| 3d动漫成人在线| 国产精品视频在线免费观看| 亚洲精品在线观| 91在线视频在线| 欧美在线观看视频一区| 免费在线观看av网站| 激情伊人五月天| 国产精品国产自产拍高清av水多 | 中文字幕在线亚洲精品|