技术分享 | MySQL 的 MDL 锁解惑

【MySQL 进阶之路】元数据锁(MDL)详解 MDL 锁是 MySQL 中一种确保表元数据一致性的机制,它通过协调 DML 和 DDL 操作的执行,防止数据和结构的冲突。在高并发环境下,MDL 锁有时会对性能产生一定影响,了解其工作机制及使用场景对于优化数据库性能和避免死锁至关重要。 阅读详情

作者:刘晨

网名 bisal ,具有十年以上的应用运维工作经验,目前主要从事数据库应用研发能力提升和技术管理相关的工作,Oracle ACE ,腾讯云TVP,拥有 Oracle OCM & OCP 、EXIN DevOps Master 、SCJP 等国际认证,国内首批 Oracle YEP 成员,OCMU 成员,《DevOps 最佳实践》中文译者之一,优快云 & ITPub 专家博主,公众号"bisal的个人杂货铺",长期坚持分享技术文章,多次在线上和线下分享技术主题。

本文来源:原创投稿

*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。


前几天,某个使用 MySQL 的应用,出现了一些问题,表象上是应用请求无响应,通过检索数据库,发现很多会话执行的 SQL 提示"Waiting for table metadata lock"的等待,经过确认,这些SQL对应的就是这些请求,SQL 无返回,自然从应用端不能得到响应。

但为什么出现这种现象?"table metadata lock"又是什么锁?

从"table metadata lock"的名称,可以知道他是个表锁,"metadata lock"简称为 MDL ,即元数据锁,从 MySQL 5.5 开始引入的,他是基于表元数据(表结构)的锁,MDL锁是为了保证并发环境下元数据和表数据的结构一致性。如果有事务对表加了MDL锁,那么其他事务就不能对表结构进行变更,同样对于正在进行表结构变更的时候也不允许其他事务对表数据进行增删改查,他能解决或者保证的是 DDL 操作与 DML 操作之间的一致性。

我们通过实验来体验下MDL锁的情况。

MySQL 5.7中,performance_schema库中新增了metadata_locks表,专门记录MDL的相关信息,但在5.7中默认关闭(8.0默认打开),

mysql> select * from performance_schema.setup_instruments \G;
...
NAME: wait/lock/metadata/sql/mdl
ENABLED: NO
TIMED: NO

为了更直观了解MDL锁,首先要开启MDL锁记录,执行如下SQL开启,此时就可以通过关联 metadata_locks 和 threads 等,观测 MDL 的相关信息,

mysql> update performance_schema.setup_instruments set enabled='YES',TIMED='YES'
    -> where name='wait/lock/metadata/sql/mdl';
Query OK, 1 row affected (0.02 sec)
Rows matched: 1  Changed: 1  Warnings: 0
场景1 会话1执行SELECT操作

为了能关注到锁的信息,使用sleep函数,

mysql> select sleep(10) from t;
+-----------+
| sleep(10) |
+-----------+
|         0 |
|         0 |
+-----------+
2 rows in set (20.01 sec)

processlist 显示的是 user sleep ,

执行如下SQL,

select m.*, t.* from performance_schema.metadata_locks m 
left join performance_schema.threads t on m.owner_thread_id = t.thread_id\G;

可以看到这条SQL当前正在持有SHARED_READ类型的锁,说明SELECT读操作,实际上需要锁,

场景2 会话1在事务中执行SELECT操作

执行BEGIN,再执行SELECT,但是不提交,

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

mysql> select * from t;
+------+
| id   |
+------+
|    1 |
|    2 |
+------+
2 rows in set (0.00 sec)

此时检索metadata_locks和threads,SELECT当前还是持有SHARED_READ类型的锁,

场景3 事务中执行INSERT

开启一个事务,执行插入INSERT操作,但是不提交,

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

mysql> insert into t values(3);
Query OK, 1 row affected (0.01 sec)

此时检索metadata_locks和threads,INSERT当前是持有SHARED_WRITE类型的锁,

场景4 执行alter table

场景3插入操作不提交的情况下,会话2执行 alter table ,此时就出现 hang ,

alter table t add c varchar(1);

processlist 显示 alter table 操作等待 Waiting for table metadata lock ,

此时检索 metadata_locks 和 threads,alter table 依次持有了以下几种锁,INTENTION_EXCLUSIVE、SHARED_UPGRADABLE、EXCLUSIVE,

          OBJECT_TYPE: GLOBAL
        OBJECT_SCHEMA: NULL
          OBJECT_NAME: NULL
OBJECT_INSTANCE_BEGIN: 140512405331056
            LOCK_TYPE: INTENTION_EXCLUSIVE
        LOCK_DURATION: STATEMENT
          LOCK_STATUS: GRANTED
               SOURCE: 
      OWNER_THREAD_ID: 34
       OWNER_EVENT_ID: 21
            THREAD_ID: 34
                 NAME: thread/sql/one_connection
                 TYPE: FOREGROUND
       PROCESSLIST_ID: 8
     PROCESSLIST_USER: root
     PROCESSLIST_HOST: localhost
       PROCESSLIST_DB: bisal
  PROCESSLIST_COMMAND: Query
     PROCESSLIST_TIME: 5
    PROCESSLIST_STATE: Waiting for table metadata lock
     PROCESSLIST_INFO: alter table t add c varchar(1)
     PARENT_THREAD_ID: 1
                 ROLE: NULL
         INSTRUMENTED: YES
              HISTORY: YES
      CONNECTION_TYPE: Socket
         THREAD_OS_ID: 6836
*************************** 5. row ***************************
          OBJECT_TYPE: SCHEMA
        OBJECT_SCHEMA: bisal
          OBJECT_NAME: NULL
OBJECT_INSTANCE_BEGIN: 140512405285536
            LOCK_TYPE: INTENTION_EXCLUSIVE
        LOCK_DURATION: TRANSACTION
          LOCK_STATUS: GRANTED
               SOURCE: 
      OWNER_THREAD_ID: 34
       OWNER_EVENT_ID: 21
            THREAD_ID: 34
                 NAME: thread/sql/one_connection
                 TYPE: FOREGROUND
       PROCESSLIST_ID: 8
     PROCESSLIST_USER: root
     PROCESSLIST_HOST: localhost
       PROCESSLIST_DB: bisal
  PROCESSLIST_COMMAND: Query
     PROCESSLIST_TIME: 5
    PROCESSLIST_STATE: Waiting for table metadata lock
     PROCESSLIST_INFO: alter table t add c varchar(1)
     PARENT_THREAD_ID: 1
                 ROLE: NULL
         INSTRUMENTED: YES
              HISTORY: YES
      CONNECTION_TYPE: Socket
         THREAD_OS_ID: 6836
*************************** 6. row ***************************
          OBJECT_TYPE: TABLE
        OBJECT_SCHEMA: bisal
          OBJECT_NAME: t
OBJECT_INSTANCE_BEGIN: 140512405330960
            LOCK_TYPE: SHARED_UPGRADABLE
        LOCK_DURATION: TRANSACTION
          LOCK_STATUS: GRANTED
               SOURCE: 
      OWNER_THREAD_ID: 34
       OWNER_EVENT_ID: 21
            THREAD_ID: 34
                 NAME: thread/sql/one_connection
                 TYPE: FOREGROUND
       PROCESSLIST_ID: 8
     PROCESSLIST_USER: root
     PROCESSLIST_HOST: localhost
       PROCESSLIST_DB: bisal
  PROCESSLIST_COMMAND: Query
     PROCESSLIST_TIME: 5
    PROCESSLIST_STATE: Waiting for table metadata lock
     PROCESSLIST_INFO: alter table t add c varchar(1)
     PARENT_THREAD_ID: 1
                 ROLE: NULL
         INSTRUMENTED: YES
              HISTORY: YES
      CONNECTION_TYPE: Socket
         THREAD_OS_ID: 6836
*************************** 7. row ***************************
          OBJECT_TYPE: TABLE
        OBJECT_SCHEMA: bisal
          OBJECT_NAME: t
OBJECT_INSTANCE_BEGIN: 140512406836304
            LOCK_TYPE: EXCLUSIVE
        LOCK_DURATION: TRANSACTION
          LOCK_STATUS: PENDING
               SOURCE: 
      OWNER_THREAD_ID: 34
       OWNER_EVENT_ID: 21
            THREAD_ID: 34
                 NAME: thread/sql/one_connection
                 TYPE: FOREGROUND
       PROCESSLIST_ID: 8
     PROCESSLIST_USER: root
     PROCESSLIST_HOST: localhost
       PROCESSLIST_DB: bisal
  PROCESSLIST_COMMAND: Query
     PROCESSLIST_TIME: 5
    PROCESSLIST_STATE: Waiting for table metadata lock
     PROCESSLIST_INFO: alter table t add c varchar(1)
     PARENT_THREAD_ID: 1
                 ROLE: NULL
         INSTRUMENTED: YES
              HISTORY: YES
      CONNECTION_TYPE: Socket
         THREAD_OS_ID: 6836
场景5 执行SELECT

场景3和4的前提下,会话3执行SELECT,同样出现了hang,

mysql> select * from t;

processlist 显示 SELECT 的状态,Waiting for table metadata lock,

此时检索 metadata_locks 和 threads,SELECT 当前还是持有 SHARED_READ 锁,进程状态是 Waiting for table metadata lock ,

场景6 提交会话1

执行commit或者rollback,提交会话1的事务,此时会话2的DDL,

alter table t add c varchar(1);

会话3的查询,

mysql> select * from t;

都可以执行了,processlist 没有任何的等待,而且 metadata_locks 和 threads 关联检索都是空的了,

从以上的6个场景,我们能得到一些表象信息,

(1) 即使普通的SELECT查询操作,都是要持有锁的,类型是SHARED_READ。

(2) 如果当前有未提交的活动事务,不允许执行alter table这种DDL。

(3) 如果当前DDL是hang,其他会话哪怕只是查询SELECT,都会hang。

如下就是MDL相关的锁模式,以及对应的SQL语句,

锁模式对应SQL
MDL_INTENTION_EXCLUSIVEGLOBAL对象、SCHEMA对象操作会加此锁
MDL_SHAREDFLUSH TABLES with READ LOCK
MDL_SHARED_HIGH_PRIO仅对 MyISAM 存储引擎有效
MDL_SHARED_READSELECT查询
MDL_SHARED_WRITEDML语句
MDL_SHARED_WRITE_LOW_PRIO仅对MyISAM存储引擎有效
MDL_SHARED_UPGRADABLEALTER TABLE
MDL_SHARED_READ_ONLYLOCK xxx READ
MDL_SHARED_NO_WRITEFLUSH TABLES xxx,yyy,zzz READ
MDL_SHARED_NO_READ_WRITEFLUSH TABLE xxx WRITE
MDL_EXCLUSIVEALTER TABLE xxx PARTITION BY …

MySQL 是 Server-Engine 架构,MDL锁是在 Server 层实现的表级锁,适用于所有存储引擎。MDL的读锁和写锁的阻塞关系如下,

(1) 读锁和写锁之间相互阻塞,即同一个表上的DML和DDL之间互相阻塞。这就是上面提到的表象1,以及场景4。

(2) 写锁和写锁之间互相阻塞,即两个session不能对表同时做表定义变更,需要串行操作。这个很容易理解。

(3) 读锁和读锁之间不会产生阻塞。就是说增删改查不会因为metadata lock产生阻塞,可以并发执行,如果不是这样,数据库就是串行操作了。

之所以需要MDL锁,就是因为事务执行的时候,不能发生表结构的改变,否则就会导致同一个事务中,出现混乱的现象,如果当前有事务持有MDL读锁,DDL就不能申请MDL写锁,保护元数据。慢查询、业务高峰期的频繁请求,都可能会让DDL申请不到MDL锁,进而出现等待。

可能有朋友会问,日常操作中会碰到针对行的操作存在互相等待的现象,例如UPDATE、DELETE相同行,这种其实是innodb行锁引起的DML之间的锁等待,和metadata lock无关。其实,行锁分类和metadata lock是很像的,他也分为读锁和写锁,或者叫共享锁和排他锁,读写锁之间阻塞关系也一致。但是二者最重要的区别,MDL是表锁,不是行锁,行锁中的读写操作对应到metadata lock都属于读锁。

因此我们常说的普通查询不加锁,其实指的是不加 innodb 的行锁,但实际上是需要持有 metadata lock 锁的。

如果出现 metadata lock 锁等待,对应的会话需要等待的时间,是受 lock_wait_timeout 参数控制的,默认值是 31536000 ,换算一下,是1年,因此,很少一直等待MDL锁超时的,而是要找到MDL产生的源头,提交、回滚,或者直接 kill 掉。降低 lock_wait_timeout 的值,只能让等待 metadata lock 的会话更快超时,并未从根上解决问题,还是得针对具体的场景,找到合适的方案,

mysql> show variables like 'lock_wait_timeout';
+-------------------+----------+
| Variable_name     | Value    |
+-------------------+----------+
| lock_wait_timeout | 31536000 |
+-------------------+----------+
1 row in set (0.31 sec)

为了找到 metadata lock 的源头,可以关联 performance_schema 的 metadata_locks 、threads 和 events_statements_history ,梳理出关系。例如针对上述的场景4,执行SQL ,

SELECT
    locked_schema,
    locked_table,
    locked_type,
    waiting_processlist_id,
    waiting_age,
    waiting_query,
    waiting_state,
    blocking_processlist_id,
    blocking_age,
    substring_index(sql_text,"transaction_begin;" ,-1) AS blocking_query,
    sql_kill_blocking_connection
FROM
    (
        SELECT
            b.OWNER_THREAD_ID AS granted_thread_id,
            a.OBJECT_SCHEMA AS locked_schema,
            a.OBJECT_NAME AS locked_table,
            "Metadata Lock" AS locked_type,
            c.PROCESSLIST_ID AS waiting_processlist_id,
            c.PROCESSLIST_TIME AS waiting_age,
            c.PROCESSLIST_INFO AS waiting_query,
            c.PROCESSLIST_STATE AS waiting_state,
            d.PROCESSLIST_ID AS blocking_processlist_id,
            d.PROCESSLIST_TIME AS blocking_age,
            d.PROCESSLIST_INFO AS blocking_query,
            concat('KILL ', d.PROCESSLIST_ID) AS sql_kill_blocking_connection
        FROM
            performance_schema.metadata_locks a
        JOIN performance_schema.metadata_locks b ON a.OBJECT_SCHEMA = b.OBJECT_SCHEMA
        AND a.OBJECT_NAME = b.OBJECT_NAME
        AND a.lock_status = 'PENDING'
        AND b.lock_status = 'GRANTED'
        AND a.OWNER_THREAD_ID <> b.OWNER_THREAD_ID
        AND a.lock_type = 'EXCLUSIVE'
        JOIN performance_schema.threads c ON a.OWNER_THREAD_ID = c.THREAD_ID
        JOIN performance_schema.threads d ON b.OWNER_THREAD_ID = d.THREAD_ID
    ) t1,
    (
        SELECT
            thread_id,
            group_concat(   CASE WHEN EVENT_NAME = 'statement/sql/begin' 
                                                         THEN "transaction_begin" 
                                                         ELSE sql_text 
                                                         END 
                                                         ORDER BY event_id SEPARATOR ";" ) AS sql_text
        FROM
           performance_schema.events_statements_history
        GROUP BY thread_id
    ) t2
WHERE
      t1.granted_thread_id = t2.thread_id \G

可以得到非常具体的锁等待关系,而且给出了快速解锁的指令,

*************************** 1. row ***************************
               locked_schema: bisal
                locked_table: t
                 locked_type: Metadata Lock
      waiting_processlist_id: 8
                 waiting_age: 168
               waiting_query: alter table t add c varchar(1)
               waiting_state: Waiting for table metadata lock
     blocking_processlist_id: 7
                blocking_age: 172
              blocking_query: insert into t values(3)
sql_kill_blocking_connection: KILL 7
1 row in set, 1 warning (0.01 sec)

我们在系统设计的时候,还是要注意,规范使用事务,合理控制事务的粒度,避免出现大事务,另外,如果通过图形化工具操作数据库,避免开启事务,但忘了关的情况,这些都可能造成MDL锁等待的出现,进而影响业务。

MySQL 元数据锁及问题排查(Metadata Locks MDL) "元数据"是用来描述数据对象定义的,而元数据锁(Metadata Lock MDL)即是加在这些定义上。通常我们认为非锁定一致性读(简单select)是不加锁的,这个是基于表内数据层面,其依然会对表的元数据加锁,保证读取数据期间表结构不会变更。 阅读详情

相关推荐

深入了解 MySQL 中的 Metadata Lock(MDL)

Metadata Lock(MDL)是一种用于保护数据库对象(如表)在进行结构性操作时的一致性的锁机制。它保证在进行涉及表结构的操作(如修改表结构、删除表等)时,表的结构不会被其他并发操作修改或访问。Metadata Lock(MDL)在 MySQL 中扮演着至关重要的角色,确保在进行表结构操作时数据的一致性和完整性。通过了解 MDL 的工作机制、如何查看当前的 MDL 锁以及如何解决常见问题,你可以更好地管理 MySQL 数据库中的并发操作和性能优化。

abzz的博客 1775

MySQL(十二)MDL锁介绍

。

weixin_43189971的博客 6272

MySQL 深潜 - MDL 锁的实现与获取机制

简介:本文将介绍在 MDL 系统中常用的数据结构及含义,然后从实现角度讨论 MDL 的获取机制与死锁检测,最后分享在实践中如何监控 MDL 状态。 作者 | 泊歌 来源 | 阿里技术公众号 一 背景 为了满足数据库在并发请求下的事务隔离性和一致性要求,同时针对 MySQL 插件式多种存储引擎都能发挥作用,MySQL 在 Server 层实现了 Metadata Locking(MDL)机制。达到的效果比如可以在事务访问数据库的某种资源时,限制其他并发事务删除该资源。这是一种逻辑意义上的锁,与操作系

阿里云云栖号 1232

MySQL 元数据锁(MDL)

MySQL 元数据锁(MDL)

Leon_Jinhai_Sun的博客 5001

ThingsBoard 3.1.1版本在window本地运行之TB-Gateway服务搭建(三)

TB-gateway服务是TB不可或缺的部分,很多的协议都需要TB-gateway来做分类处理,今天我们就来做TB-Gateway服务搭建。

晚点遇见你,余生都是你! 2471

EV1527 vs HS1527:固定码芯片的STM32解码避坑指南

本文深入解析EV1527与HS1527固定码芯片的技术差异,提供基于STM32的完整解码方案与稳定性优化策略。通过硬件接口配置、状态机实现及示波器诊断,解决工业遥控、安防报警等场景中的解码难题,特别针对时序差异和干扰问题给出实用解决方案。

o0p1q2r3的博客 329

【华为云技术分享】华为云MySQL新增MDL锁视图特性,快速定位元数据锁问题

MDL锁(Metadata Lock),即元数据锁。元数据指的是描述数据的数据,对数据及信息资源的描述性信息,在数据库中元数据即数据字典信息,包括db,table,function,procedure,trigger,event等。 MySQL从 5.5版本开始引入MDL锁,MDL锁主要为了保证元数据的一致性(主要是保证DDL操作与DML操作之间的一致性),用于处理不同线程操作同一元数据对象的同...

华为云官方博客 3907

微信小程序 - 最新详细实现 “餐厅食堂外卖点餐“ 全屏左右联动菜单列表功能界面,附带搜索框、购物车功能、商品加减计算金额、折扣等,左侧商品分类,右侧列表数据,仿美团饿了么外卖点餐页面,饭店扫码点餐!

微信小程序,vue2,vue3,左右联动菜单,商品分类页面,点餐界面,美团外卖点餐,左右布局界面,饿了么点餐页面,左分类右列表,小程序实现左侧菜单,外卖点餐联动,锚点,点击左侧大类后侧列表跟着变跟着刷新,菜单左右联动效果,左菜单右边列表数据,uniapp,左侧菜单,右侧列表双向联动效果,右侧商品滑动时,右侧列表双向联动效果,侧边菜单和右边滚动条,电商项目,购物车,商品加减计算,外卖选餐页面带购物车计算,自动计算金额,微信小程序外卖点餐界面源码,店铺页面滑动左右联动,点餐类小程序界面,堂食,扫码点餐,餐饮行业

🏆 前端领域优质创作者 5157

最全为什么阿里不推荐使用MySQL分区表?,java中级面试题库weixin

提前多熟悉阿里往年的面试题肯定是对面试有很大的帮助的,但是作为技术性职业,手里有实打实的技术才是你面对面试官最有用的利器,这是从内在散发出来的自信。备战阿里时我花的最多的时间就是在学习技术上,占了我所有学习计划中的百分之70,这是一些我学习期间觉得还是很不错的一些学习笔记我为什么要写这篇文章呢,其实我觉得学习是不能停下脚步的,在网络上和大家一起分享,一起讨论,不单单可以遇到更多一样的人,还可以扩大自己的眼界,学习到更多的技术,我还会在csdn、博客、掘金等网站上分享技术,这也是一种学习的方法。

2401_84688721的博客 974

MATLAB 与 STK 互联导出导弹轨迹及速度数据(csv导出)

本文介绍了如何通过 MATLAB 脚本连接 STK 提取导弹三维轨迹数据,并以 CSV 格式导出,包含以下关键内容:自动连接 STK 场景;获取所有导弹对象;提取 J2000 坐标系下的位置和速度;加入任务优先级与状态;导出为标准 CSV 文件;

weixin_52370774的博客 778

NXP(恩智浦)—TJA1043TK CAN收发器芯片详解

本文章主要讲解NXP(恩智浦)—TJA1043TK CAN收发器的相关知识。

零零刷的博客 2201

如何迅速并识别处理MDL锁阻塞问题

TaurusDB推出MDL锁视图功能,帮助用户迅速识别并处理MDL锁阻塞问题,从而有效减少对业务的负面影响,提升数据库管理效率。

华为云官方博客 1958

巡检类机器人电池容量计算方法论(原理+算法+真实案例)

摘要:本文系统阐述了巡检机器人电池容量的计算方法,重点解析了;能量平衡;核心原理和三种主流算法。通过光伏电站履带式巡检机器人的真实案例,详细演示了从工况拆解、功耗采集到容量计算的完整流程。文章指出:室内轻载场景可采用静态平均功耗法,户外常规工况推荐动态负载积分法,而复杂环境需采用融合估算算法。特别强调需考虑温度修正(冬季容量衰减20%)、冗余系数(1.2-1.5)和放电深度(磷酸铁锂DoD取80%)等关键参数。

start_up_go的博客 241

MySQL mdl导入_技术分享 | 深入理解 MySQL MDL Lock

作者:高鹏(网名八怪)文章末尾有他著作的《深入理解 MySQL 主从原理 32 讲》,深入透彻理解 MySQL 主从,GTID 相关技术知识。本文来源:转载自公众号-mysql code tracer*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。本文基于源码版本 5.7.14水平有限,有误请谅解。笔者已经将加好 MDL 获取过程和释放过程的版本放到了github 如...

weixin_42524013的博客 277

10|Git Diff 与增量代码识别:本次到底改了哪些代码?

本文介绍 Git Diff 和增量代码识别,帮助你理解精准测试如何先找到本次真正变化的代码。测试开发工程师。Java 后端开发工程师。质量平台 / DevOps 平台建设者。想了解精准测试落地方法的技术负责人。

专注 AI 精准测试平台实战落地,分享从代码 Diff 到回归决策的完整工程闭环。主张“先建数据链路,再上 AI 智能”,让测试从“靠经验”走向“基于风险”。 159

基于STM32+OneNet设计的物联网智慧路灯(100)

本次设计的智能路灯采用STM32芯片和OneNet物联网平台进行连接,开发出支持太阳能充电锂电池供电、GPS定位上传位置信息、手动/自动控制路灯开关、环境光照调节、红外传感器检测周围人员、空气质量监测等多项功能。同时,当路灯发生异常情况时,系统可以自动发送邮件或短信到指定邮箱或电话。

7724

技术分享 | 深入理解 MySQL MDL Lock

作者:高鹏(网名八怪) 文章末尾有他著作的《深入理解 MySQL 主从原理 32 讲》,深入透彻理解 MySQL 主从,GTID 相关技术知识。 本文来源:转载自公众号-mysql code tracer *爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。 本文基于源码版本 5.7.14 水平有限,有误请谅解。 笔者已经将加好 MDL 获取过程和释放过程的版本...

ActionTech的博客 573

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

MDL锁导致的几个常见的 MySQL 问题分析

如何完整处理一个故障,聊聊我的思路。 技术人人都可以磨炼,但处理问题的思路和角度各有不同,希望这篇文章可以抛砖引玉。 一、常见问题 1、 SQLException:Lockwaittimeoutexceeded;tryrestartingtransaction,pleaserollback! 常见原因: 磁盘空间满,事务无法提交成功。(磁盘满是一个很危险的操作,会引起binlog写坏) 更新事务未正常提交而产生排他锁,...

m0_38048955的博客 816

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

记一次mysql执行DDL导致锁表

背景 线上某数据库意外发现缺少索引,并且该表的数据量很少,只有几万条记录而已,因此很随意地尝试给该表添加索引。原本预期该表的记录很少,添加索引的耗时应该很短,结果却直接导致该表被锁,所有该表的增删改查操作全部阻塞,继而影响到了线上业务。 发现锁表后,执行show processlist发现大量线程阻塞,状态显示Waiting for table metadata lock。通过命令终止了DDL线程,该表恢复正常。mysql从5.6版本起支持Online DDL,理论上执行DDL语句不会阻塞诸如INSERT、

祈雨v的博客 6059

mysql lock scope_技术分享 | 深入理解 MySQL MDL Lock

作者:高鹏(网名八怪) 文章末尾有他著作的《深入理解 MySQL 主从原理 32 讲》,深入透彻理解 MySQL 主从,GTID 相关技术知识。 本文来源:转载自公众号-mysql code tracer *爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。本文基于源码版本 5.7.14水平有限,有误请谅解。笔者已经将加好 MDL 获取过程和释放过程的版本放到了githu...

weixin_42237487的博客 311

MDL锁导致mysql夯住_MySQL MetaData Lock 案例分享

前言:今天开发童鞋遇到一个奇怪的问题,在测试环境里面执行drop database dbname发现一直夯住不动,等了很久也没有执行,于是问题就到我这里了一、什么是MetaData Lock?MetaData Lock即元数据锁,在数据库中元数据即数据字典信息包括db,table,function,procedure,trigger,event等。metadata lock主要为了保证元数据的一致...

weixin_39599372的博客 152

【Mysql分享】之锁篇

mysql锁篇,了解mysql中各种锁情况

JASON_CHEN 849
上一篇: 故障分析 | bgsave 导致 redis 定期卡顿案例一则
下一篇: 故障分析 | 是谁偷走了我的 IO
爱可生开源社区
博客等级 码龄8年 1936粉丝 1004原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值