MySQL如何查看元数据锁阻塞在哪里

MySQL如何查看元数据锁阻塞在哪里

操作步骤:

1、session 1 执行:

   start transaction;
   select *from t1;

2、session 2 在第1步执行完后执行:

  drop table t1;

此时session 2的drop语句被阻塞。那么怎么分析查看元数据锁呢?

方法:

1)执行show processlist;,可以看到drop语句在等待元数据锁

mysql> show processlist;
+----+-------------+-----------+------+---------+---------+-----------------------------------------------------------------------------+------------------+
| Id | User    | Host   | db  | Command | Time  | State                                    | Info       |
+----+-------------+-----------+------+---------+---------+-----------------------------------------------------------------------------+------------------+
| 5 | system user |      | NULL | Connect | 1050234 | Waiting for master to send event                      | NULL       |
| 6 | system user |      | NULL | Connect | 983193 | Slave has read all relay log; waiting for the slave I/O thread to update it | NULL       |
| 8 | root    | localhost | yzs | Sleep  |   93 |                                       | NULL       |
| 9 | root    | localhost | yzs | Query  |    3 | Waiting for table metadata lock                       | drop table t1  |
| 10 | root    | localhost | NULL | Query  |    0 | init                                    | show processlist |
+----+-------------+-----------+------+---------+---------+-----------------------------------------------------------------------------+------------------+
5 rows in set (0.00 sec)

2)可以看到当前正在运行的事务的线程是trx_mysql_thread_id:8,那么这个线程在干什么呢?

mysql> select *from information_schema.innodb_trx\G
*************************** 1. row ***************************
          trx_id: 17683
         trx_state: RUNNING
        trx_started: 2017-10-18 05:32:46
   trx_requested_lock_id: NULL
     trx_wait_started: NULL
        trx_weight: 0
    trx_mysql_thread_id: 8
         trx_query: NULL
    trx_operation_state: NULL
     trx_tables_in_use: 0
     trx_tables_locked: 0
     trx_lock_structs: 0
   trx_lock_memory_bytes: 320
      trx_rows_locked: 0
     trx_rows_modified: 0
  trx_concurrency_tickets: 0
    trx_isolation_level: REPEATABLE READ
     trx_unique_checks: 1
  trx_foreign_key_checks: 1
trx_last_foreign_key_error: NULL
 trx_adaptive_hash_latched: 0
 trx_adaptive_hash_timeout: 10000
     trx_is_read_only: 0
trx_autocommit_non_locking: 0
1 row in set (0.03 sec)

3)可以看到这个线程执行的是select语句,如果执行show engine innodb status;可以看到该事务处于sleep状态,也就是说这个事务语句执行完了,但是没有提交。

执行kill 8,将该事务的线程杀掉就可以了。或者检查业务的SQL语句,检查下是否有未提交的SQL语句。

mysql> select *from performance_schema.events_statements_current\G
*************************** 1. row ***************************
       THREAD_ID: 27
        EVENT_ID: 15
      END_EVENT_ID: 15
       EVENT_NAME: statement/sql/select
         SOURCE: mysqld.cc:962
      TIMER_START: 1050544992900922000
       TIMER_END: 1050544993740836000
       TIMER_WAIT: 839914000
       LOCK_TIME: 196000000
        SQL_TEXT: select *from t1
         DIGEST: 1aa32397c8ec37230aed78ef16126571
      DIGEST_TEXT: SELECT * FROM `t1`
     CURRENT_SCHEMA: yzs
      OBJECT_TYPE: NULL
     OBJECT_SCHEMA: NULL
      OBJECT_NAME: NULL
 OBJECT_INSTANCE_BEGIN: NULL
      MYSQL_ERRNO: 0
   RETURNED_SQLSTATE: NULL
      MESSAGE_TEXT: NULL
         ERRORS: 0
        WARNINGS: 0
     ROWS_AFFECTED: 0
       ROWS_SENT: 10
     ROWS_EXAMINED: 10
CREATED_TMP_DISK_TABLES: 0
   CREATED_TMP_TABLES: 0
    SELECT_FULL_JOIN: 0
 SELECT_FULL_RANGE_JOIN: 0
      SELECT_RANGE: 0
   SELECT_RANGE_CHECK: 0
      SELECT_SCAN: 1
   SORT_MERGE_PASSES: 0
       SORT_RANGE: 0
       SORT_ROWS: 0
       SORT_SCAN: 0
     NO_INDEX_USED: 1
   NO_GOOD_INDEX_USED: 0
    NESTING_EVENT_ID: NULL
   NESTING_EVENT_TYPE: NULL

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • MySQL数据类型中DECIMAL的用法实例详解

    MySQL数据类型中DECIMAL的用法实例详解 在MySQL数据类型中,例如INT,FLOAT,DOUBLE,CHAR,DECIMAL等,它们都有各自的作用,下面我们就主要来介绍一下MySQL数据类型中的DECIMAL类型的作用和用法. 一般赋予浮点列的值被四舍五入到这个列所指定的十进制数.如果在一个FLOAT(8, 1)的列中存储1. 2 3 4 5 6,则结果为1. 2.如果将相同的值存入FLOAT(8, 4) 的列中,则结果为1. 2 3 4 6. 这表示应该定义具有足够位数的浮点列以便

  • MySQL启用SSD存储的实例详解

    MySQL启用SSD存储的实例详解 有时OS读写慢会降低MySQL服务器的性能,尤其是OS与MySQL使用同一磁盘时.故最好是让MySQL使用单独的磁盘,能使用SSD更好.要做到这一点,需要把SSD新磁盘挂载到服务器上,假定新磁盘在/dev/sdb. 1.准备新磁盘: # fdisk /dev/sdb 按下"n"将创建一个新分区:按下"p"将创建新的主分区.接着设置分区号(从1-4),再选择分区的尺寸,按下回车键. 如果不想使用整个磁盘作为一个分区,那么还需要继续创

  • MySQL 清除表空间碎片的实例详解

    MySQL 清除表空间碎片的实例详解 碎片产生的原因 (1)表的存储会出现碎片化,每当删除了一行内容,该段空间就会变为空白.被留空,而在一段时间内的大量删除操作,会使这种留空的空间变得比存储列表内容所使用的空间更大: (2)当执行插入操作时,MySQL会尝试使用空白空间,但如果某个空白空间一直没有被大小合适的数据占用,仍然无法将其彻底占用,就形成了碎片: (3)当MySQL对数据进行扫描时,它扫描的对象实际是列表的容量需求上限,也就是数据被写入的区域中处于峰值位置的部分: 例如: 一个表有1万行

  • MySQL分区字段列有必要再单独建索引吗?

    前言 大家都知道对于分区字段必须是主键的一部分,那么建了复合主键之后,是否需要对分许字段再单独添加一个索引呢?有没有效果?来验证一下,下面话不多说了,来一起看看详细的介绍吧. 1.新建表effect_new(以创建时间按月分区) CREATE TABLE `effect_new` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `type` tinyint(4) NOT NULL DEFAULT '0', `timezone` varchar(10) DEF

  • JDBC连接mysql处理中文时乱码解决办法详解

    JDBC连接mysql处理中文时乱码解决办法详解 近日,整合的项目需要跟一个比较老版本的mysql服务器连接,使用navicat查看,发现此mysql服务器貌似没有设置默认编码,而且从操作此mysql的部分php文件看,应该是使用的gb2312的编码,但是,直接使用jdbc操作,从库中读取出来的中文全都是乱码. 一开始,使用类似entity.setDepartName(new String(rs.getString("hg").getBytes("gbk"), &q

  • docker连接spring boot和mysql容器方法介绍

    在之前使用docker部署运行了Spring Boot的小例子,但是没有使用数据库.在这一篇中,介绍docker如何启动mysql容器,以及如何将Spring Boot容器与mysql容器连接起来运行. docker基本命令 首先熟悉一下在操作过程中常用的docker基本命令: docker images:列出所有docker镜像 docker ps:列出所有运行中的容器,-a参数可以列出所有容器,包括停止的 docker stop container_id:停止容器 docker start

  • MySQL操作之JSON数据类型操作详解

    上一篇文章我们介绍了mysql数据存储过程参数实例详解,今天我们看看MySQL操作之JSON数据类型的相关内容. 概述 mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点.但mysql毕竟是关系型数据库,在处理json这种非结构化的数据时,还是比较别扭的. 创建一个JSON字段的表 首先先创建一个表,这个表包含一个json格式的字段: CREATE TABLE table_name ( id INT NOT NULL

  • MySQL如何查看元数据锁阻塞在哪里

    MySQL如何查看元数据锁阻塞在哪里 操作步骤: 1.session 1 执行: start transaction; select *from t1; 2.session 2 在第1步执行完后执行: drop table t1; 此时session 2的drop语句被阻塞.那么怎么分析查看元数据锁呢? 方法: 1)执行show processlist;,可以看到drop语句在等待元数据锁 mysql> show processlist; +----+-------------+--------

  • 详细分析mysql MDL元数据锁

    前言: 当你在MySQL中执行一条SQL时,语句并没有在你预期的时间内执行完成,这时候我们通常会登陆到MySQL数据库上查看是不是出了什么问题,通常会使用的一个命令就是 show processlist,看看有哪些session,这些session在做什么事情.当你看到 waiting for table metadata lock 时,那就是遇到MDL元数据锁了.本篇文章将会介绍MDL锁的产生与排查过程. 1.什么是MDL锁 MDL全称为metadata lock,即元数据锁.MDL锁主要作用

  • 一文搞懂MySQL元数据锁(MDL)

    目录 一.什么是metadata lock 二.MDL和行锁有什么区别 三.MDL为什么会造成系统崩溃 四.MDL的生命周期有多长 五.如何快速找到阻塞源头 六.本文开始的案例最终如何解决 小结 某日,路上收到用户咨询,为了清除空间,想删除某200多G大表数据,且已经确认此表不再有业务访问,于是执行了一条命令‘delete from bigtable’,但好长时间也没删完,经过咨询后,获知drop table删除表速度快,而且能彻底释放空间,于是又在另外一个session中执行了‘drop ta

  • MySQL锁阻塞的深入分析

    日常维护中,经常会碰到线程被阻塞,导致数据库响应非常慢,下面就看看如何获取是哪个线程导致了阻塞的. 1. 环境说明 RHEL 6.4 x86_64 + MySQL 5.6.19 事务隔离级别:RR 2. 测试过程 3. 查看锁阻塞线程信息 这里用几中方法进行分析: 3.1  使用show processlist查看 MySQL [(none)]> show processlist; +----+------+-----------+------+---------+------+--------

  • MySQL 中定位 DDL 被阻塞的问题及解决方案

    DDL 被阻塞了,如何找到阻塞它的 SQL? 经常碰到开发.测试童鞋会问,线下开发.测试环境,执行了一个DDL,发现很久都没有执行完,是不是被阻塞了?要怎么解决? 包括在群里,也经常会碰到类似问题:DDL 被阻塞了,如何找到阻塞它的 SQL ? 实际上,如何解决 DDL 被阻塞的问题,是 MySQL 中一个共性且高频的问题. 下面,就这个问题,给一个清晰明了.拿来即用的解决方案: 怎么判断一个DDL是不是被阻塞了 ?当DDL被阻塞时,怎么找出阻塞它的会话 ? 怎么判断一个 DDL是不是被阻塞了?

  • MySQL数据库表被锁、解锁以及删除事务详解

    目录 背景 故障追踪 解决方案 第一步:查看表使用 第二步:查看进程 第三步:查看当前运行的所有事务 第四步:查看当前出现的锁 第五步:查询锁等待的对应关系 第六步:kill掉事务 MySQL的锁 MySQL锁表场景 Waiting for table metadata lock 场景一:长事务运行,阻塞DDL,继而阻塞所有同表的后续操作. 场景二:为提交事务,阻塞DDL,继而阻塞所有同表的后续操作. 场景三:显式事务失败操作获得锁,未释放 小结 总结 背景 在程序员的职业生涯中,总会遇到数据库

  • MySQL学习之MySQL基本架构与锁

    目录 MySql架构 MySQL锁 锁的分类 按粒度分 按功能分 锁的演示 表锁 行锁 意向锁 MySql架构 SQL Layer Connection Pool : 连接池,用于接收连接请求和管理连接. ManagementService&Utilities 管理服务组件和工具组件,主要提供了一些备份,安全,主从,集群,等功能. SQL Interface:主要提供了SQL语句接口.包括SQL解析器,优化器,缓存等.将我们输入的SQL语句,解析成节点树,然后传递给存储引擎执行. Storage

  • mysql共享锁与排他锁用法实例分析

    本文实例讲述了mysql共享锁与排他锁用法.分享给大家供大家参考,具体如下: mysql锁机制分为表级锁和行级锁,本文就和大家分享一下我对mysql中行级锁中的共享锁与排他锁进行分享交流. 共享锁又称为读锁,简称S锁,顾名思义,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改. 排他锁又称为写锁,简称X锁,顾名思义,排他锁就是不能与其他所并存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁,包括共享锁和排他锁,但是获取排他锁的事务是可以对数据

  • 简单了解 MySQL 中相关的锁

    本文主要是带大家快速了解 InnoDB 中锁相关的知识 基础概念解析和RocketMQ详细的源码解析 http://xiazai.jb51.net/202105/yuanma/RocketMQ_jb51.rar 为什么需要加锁 首先,为什么要加锁?我想我不用多说了,想象接下来的场景你就能 GET 了. 你在商场的卫生间上厕所,此时你一定会做的操作是啥?锁门.如果不锁门,上厕所上着上着,啪一下门就被打开了,可能大概也许似乎貌似有那么一丁点的不太合适. 数据也是一样,在并发的场景下,如果不对数据加锁

  • MySQL隔离级别和锁机制的深入讲解

    目录 简述: 1. 事务的四大特性 2.多事务并发带来的问题 3.事务的隔离级别 4.演示不同隔离级别出现的问题 读未提交 读已提交 可重复读 串行化 5.锁机制 间隙锁 临建锁 排他锁 总结 简述: 我们的MySQL一般会并发的执行多个事务,多个事务可能会并发的对同一条或者同一批数据进行crud操作;可能就会导致我们平常所说的脏读.不可重复读.幻读这些问题. 这些问题的本质都是MySQL多事务并发问题,为了解决多事务并发问题,MySQL设计了锁机制.MVCC多版本并发控制隔离机制.以及事务隔离

随机推荐