iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >【Mysql】metadata lock锁
  • 405
分享到

【Mysql】metadata lock锁

2024-04-02 19:04:59 405人浏览 薄情痞子
摘要

原文地址:Http://blog.itpub.net/26250550/viewspace-1071987/ metadata lock的超时时间是lock_wait_timeout,并不是innodb_l

原文地址:Http://blog.itpub.net/26250550/viewspace-1071987/
metadata lock的超时时间是lock_wait_timeout,并不是innodb_lock_wait_timeout

Mysql 5.5.3版本中引入了Metadata lock: DDL语句打破了事务的隔离级别
    在5.5.3版本之前,mysql事务对于表结构元数据(Metadata)的定是语句(statement)粒度的, 即语句执行完成后,不管事务是否可以完成,其表结构就可以被其他会话更新掉!
    引入Metadata lock后,表结构元数据(Metadata)的锁定变成了事务(transaction)粒度的,即只有事务结束时才会释放Metadata lock。

    现象:
        显式开启事务后start transaction; 该事务内的query语句(包含select)会占用相关表的metadata lock(profile:Opening tables阶段)
        导致DDL语句被阻塞,因为获取不到表的metadata lock

Mysql 5.6.6版本后 优化
    metadata lock不阻塞DDL语句,但原有session再访问此表时会返回Error信息“Table definition has changed, please retry transaction”

案列

  1. session1
  2. mysql> start transaction;
    Query OK, 0 rows affected (0.00 sec)


    mysql> select * from test1 where id=1;    
    +------+------+
    | id   | name |
    +------+------+
    |    1 | 1    |
    +------+------+
    1 row in set (0.00 sec)


  3. session2

    1. mysql> set profiling=on;
    2. Query OK, 0 rows affected (0.00 sec)

    3. mysql> alter table test1 add column c2 int;
    4. ---堵塞

    5. mysql> show full processlist;
      +----+------+-----------+------+---------+------+---------------------------------+-------------------------------------+
      | Id | User | Host      | db   | Command | Time | State                           | Info                                |
      +----+------+-----------+------+---------+------+---------------------------------+-------------------------------------+
      |  4 | root | localhost | test | Sleep   |   10 |                                 | NULL                                |
      |  5 | root | localhost | test | Query   |    6 | Waiting for table metadata lock | alter table test1 add column c2 int |  
      |  6 | root | localhost | NULL | Query   |    0 | NULL                            | show full processlist               |
      +----+------+-----------+------+---------+------+---------------------------------+-------------------------------------+

      我们可以看到ALTER TABLE会应Metadata lock而阻塞。一旦Session 1中的事务提交或者回滚,即释放了table1表的Metadata lock,Session2的操作立即可以执行
    6. ctrl+c掉后我们查看profile执行计划


    7. mysql> show profile for query 6;
      +----------------------+----------+
      | Status               | Duration |
      +----------------------+----------+
      | starting             | 0.000045 |
      | checking permissions | 0.000005 |
      | checking permissions | 0.000005 |
      | init                 | 0.000007 |
      | Opening tables       | 0.000061 |
      | System lock          | 0.000008 |
      | setup                | 0.000018 |
      | creating table       | 0.002776 |
      | After create         | 0.000063 |
      | copy to tmp table    | 0.000312 |
      | rename result table  | 1.459601 |   
      | query end            | 0.000031 |
      | closing tables       | 0.000285 |
      | freeing items        | 0.002271 |
      | cleaning up          | 0.000073 |
      +----------------------+----------+
      15 rows in set (0.00 sec)

      可以看到,卡住的那一步是在rename result table,MySQL后台将ALTER保存变成连续操作“创建临时新表->插入老表的数据->临时新表取到老表(RENAME)”,即实际的变化老表的操作在RENAME阶段才发生。而这一步即是被阻塞的那一步。所以可以确认,Metadata lock影响到的是要真实修改表结构的动作。(回想:和pt-osc那节,一个select未执行完,alter 修改表结构产生metadata lock一个道理)

      基于此,我们可以验证ALTER TABLE,RENAME TABLE,DROP TABLE都会被Metadata lock影响,验证步骤与上类似,省略。

      值得注意的是,创建一个已存在的表也会被Metadata lock影响。如果在一个事务中用到了表A的Metadata lock(如SELECT了该表)且事务未完成,那么创建同名的表也会被卡住。所参考的文章中提及这一点。有兴趣可参看:讨论页  ,这里不作讨论。

      metadata lock的另一个副作用:如上例中,ALTER TABLE应metadata lock被阻塞后,这导致后续其他事务针对该表的SELECT也会被阻塞!即ALTER TABLE的操作会影响到其他SELECT操作。根据上述示例:

      Session2 mysql> alter table table1 add column c1 int;

      此步一直处于等待状态时,新会话中查询table1。

      Session3 mysql> select * from test1;  #一直等待

      Session4 mysql>show full processlist;
      mysql> show full processlist;
      +----+------+-----------+------+---------+------+---------------------------------+-------------------------------------+
      | Id | User | Host      | db   | Command | Time | State                           | Info                                |
      +----+------+-----------+------+---------+------+---------------------------------+-------------------------------------+
      |  4 | root | localhost | test | Sleep   | 1857 |                                 | NULL                                |
      |  5 | root | localhost | test | Query   |  504 | Waiting for table metadata lock | select * from test1                 |
      |  6 | root | localhost | NULL | Query   |    0 | NULL                            | show full processlist               |
      |  8 | root | localhost | test | Query   |  511 | Waiting for table metadata lock | alter table test1 add column c2 int |
      +----+------+-----------+------+---------+------+---------------------------------+-------------------------------------+

      Session1 mysql> commit; 

      第一个会话提交后,Session2、Session3也成功执行。看看Session3的select在哪个步骤需要等待:

      Session3 mysql> show profile;
      +——————————–+———–+
      | Status                         | Duration  |
      +——————————–+———–+
      | starting                       |  0.000018 |
      | Waiting for query cache lock   |  0.000003 |
      | checking query cache for query |  0.000037 |
      | checking permissions           |  0.000007 |
      | Opening tables                 | 22.502591 |
      | System lock                    |  0.000013 |
      | Waiting for query cache lock   |  0.000024 |
      | init                           |  0.000022 |
      | optimizing                     |  0.000009 |
      | statistics                     |  0.000011 |
      | preparing                      |  0.000015 |
      | executing                      |  0.000003 |
      | Sending data                   |  0.000036 |
      | end                            |  0.000009 |
      | query end                      |  0.000005 |
      | closing tables                 |  0.000006 |
      | freeing items                  |  0.000007 |
      | Waiting for query cache lock   |  0.000003 |
      | freeing items                  |  0.000015 |
      | Waiting for query cache lock   |  0.000002 |
      | freeing items                  |  0.000002 |
      | storing result in query cache  |  0.000004 |
      | logging slow query             |  0.000002 |
      | logging slow query             |  0.000028 |
      | cleaning up                    |  0.000003 |
      +——————————–+———–+

      可以看到SELECT语句首先检查查询缓存,没有命中,然后在Opening tables阶段卡住。

      这引出了另一个特点,基于上述场景,如果后续的SELECT能够在查询缓存中命中,那么不会被ALTER TABLE卡住,因为不需要Opening tables操作。命中缓存SELECT的SHOW PROFILE如下:

      mysql>  show profile;
      +——————————–+———-+
      | Status                         | Duration |
      +——————————–+———-+
      | starting                       | 0.000017 |
      | Waiting for query cache lock   | 0.000004 |
      | checking query cache for query | 0.000006 |
      | checking privileges on cached  | 0.000004 |
      | checking permissions           | 0.000007 |
      | sending cached result to clien | 0.000011 |
      | logging slow query             | 0.000002 |
      | cleaning up                    | 0.000003 |
      +——————————–+———-+
      8 rows in set (0.00 sec)




您可能感兴趣的文档:

--结束END--

本文标题: 【Mysql】metadata lock锁

本文链接: https://www.lsjlt.com/news/46097.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MYSQL METADATA LOCK(MDL LOCK)MDL锁问题的示例分析
    小编给大家分享一下MYSQL METADATA LOCK(MDL LOCK)MDL锁问题的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一...
    99+
    2024-04-02
  • MYSQL METADATA LOCK(MDL LOCK) 理论及加锁类型测试
    目录MYSQL METADATA LOCK(MDL LOCK)学习 理论知识和加锁类型测试 一、初步了解二、基础重要的数据结构(类)和概念1、MDL TYPE2、MDL N...
    99+
    2024-04-02
  • mysql metadata lock元数据锁中锁状态lock_status流转图是什么样的
    mysql metadata lock元数据锁中锁状态lock_status流转图是什么样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。前言...
    99+
    2024-04-02
  • MySQL表结构怎样变更Metadata Lock
    本篇文章为大家展示了MySQL表结构怎样变更Metadata Lock,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。想必玩过mysql的人对Waiting for ...
    99+
    2024-04-02
  • MySQL为什么会出现Waiting for table metadata lock
    小编给大家分享一下MySQL为什么会出现Waiting for table metadata lock,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我...
    99+
    2024-04-02
  • 如何理解mysql innodb lock锁中的record lock
    本篇文章给大家分享的是有关如何理解mysql innodb lock锁中的record lock,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。...
    99+
    2024-04-02
  • 如何进行MySQL metadata锁实验
    这篇文章将为大家详细讲解有关如何进行MySQL metadata锁实验,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。 在对已经存...
    99+
    2024-04-02
  • MySQL中next-lock锁的应用
    这篇文章主要讲解了“MySQL中next-lock锁的应用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL中next-lock锁的应用”吧! ...
    99+
    2024-04-02
  • MySQL出现Waiting for table metadata lock异常如何解决
    这篇文章主要介绍“MySQL出现Waiting for table metadata lock异常如何解决”,在日常操作中,相信很多人在MySQL出现Waiting for tab...
    99+
    2023-07-06
  • Mysql 从库上出现Waiting for table metadata lock 分析
    背景:     业务反馈在主库上做了一个DDL操作,执行时间很快,但是从机上却一直报主从延迟告警。 分析:     1. 在...
    99+
    2024-04-02
  • MySQL出现Waiting for table metadata lock异常的解决方法
    目录1. 出现原因2. 处理方式1. 出现原因 当对某个表执行DDL 语句时,将会自动给此表加上 mdl 元数据write 锁,直到事务提交才会释放。此锁的作用是为了保护 表结构的完整性、元数据的一致性 。 2. 处理方...
    99+
    2023-04-12
    MySQL解决Waiting for table metadata lock异常 MySQL Waiting for table metadata lock异常 MySQL 异常
  • Java中Lock锁详解
      目录  一、Lock锁的基本使用  二、Condition类详解   三、进程的优先级 四、wait/join与sleep的区别:  一、Lock锁的基本使用 在Java中,Lock是一个接口,它提供了比synchronized...
    99+
    2023-09-23
    java intellij-idea windows 开发语言 jvm
  • MySQL添加索引过程中出现waiting for table metadata lock怎么办
    这篇文章主要介绍“MySQL添加索引过程中出现waiting for table metadata lock怎么办”,在日常操作中,相信很多人在MySQL添加索引过程中出现waiting for table...
    99+
    2024-04-02
  • Oracle中锁(lock)的用法
    数据库锁介绍: https://www.jb51.net/article/248863.htm 一、查询oracle锁定的表: 1、锁相关表 SELECT * FROM v$...
    99+
    2024-04-02
  • MySQL中next-key lock加锁范围的示例分析
    这篇文章主要介绍MySQL中next-key lock加锁范围的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!前言某天,突然被问到 MySQL 的 next-key lock,我瞬间的反应就是:这都是啥啥啥?...
    99+
    2023-06-15
  • Mysql事物锁等待超时Lock wait timeout exceeded;怎么办
    小编给大家分享一下Mysql事物锁等待超时Lock wait timeout exceeded;怎么办,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!问题场景问题出现环境:1、在同一事务内先后对...
    99+
    2023-06-29
  • MySQL中查询事物与DDL引发Waiting for table metadata lock的两个阶段是什么
    这篇文章将为大家详细讲解有关MySQL中查询事物与DDL引发Waiting for table metadata lock的两个阶段是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后...
    99+
    2024-04-02
  • 详解Java中的锁Lock和synchronized
    目录一、Lock接口1、Lock接口和synchronized内置锁2、lock接口使用的一般形式3、Lock接口的方法4、相比于synchronized,Lock接口所具备的其他特...
    99+
    2024-04-02
  • Lock wait timeout exceeded - 如何解决MySQL报错:锁等待超时
    摘要:在使用MySQL数据库时,有时会遇到锁等待超时的问题。这个问题通常发生在多个事务同时尝试修改同一行数据时,其中一个事务会等待另一个事务的锁释放。本文将介绍如何解决MySQL报错中的锁等待超时问题,并提供具体的代码示例。一、什么是锁等待...
    99+
    2023-10-21
    MySQL 超时 锁等待
  • MYSQL中一个特殊的MDL LOCK死锁的示例分析
    本篇文章为大家展示了MYSQL中一个特殊的MDL LOCK死锁的示例分析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、问题由来前段开发反馈时间线上数据库老是出现...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作