首页 > 数据库 >MySQL 5.7中如何定位DDL操作的阻塞问题

MySQL 5.7中如何定位DDL操作的阻塞问题

时间:2022-12-23 10:13:21浏览次数:45  
标签:5.7 lock DDL id MySQL PROCESSLIST NULL ID schema

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

mysql> select * from t1; 
+----+------+------+------+-------+ 
| id | name | age  | num  | num01 | 
+----+------+------+------+-------+ 
|  1 | uu   | NULL | NULL |  NULL | 
|  2 | uu   | NULL | NULL |  NULL | 
|  3 | uu   | NULL | NULL |  NULL | 
|  4 | uu   | NULL | NULL |  NULL | 
|  5 | uu   | NULL | NULL |  NULL | 
|  6 | uu   | NULL | NULL |  NULL | 
+----+------+------+------+-------+ 
6 rows in set (0.00 sec) 

mysql> update test01.t1 set age=12 where id=1; 
Query OK, 1 row affected (0.00 sec) 
Rows matched: 1  Changed: 1  Warnings: 0 

mysql> alter table test01.t1 add c1 int; 
Query OK, 0 rows affected (0.14 sec) 
Records: 0  Duplicates: 0  Warnings: 0 

mysql> select  object_type , object_schema , object_name , lock_type , lock_duration , lock_status , owner_thread_id  from  performance_schema . metadata_locks; 
+-------------+--------------------+----------------+-------------+---------------+-------------+-----------------+ 
| object_type | object_schema      | object_name    | lock_type   | lock_duration | lock_status | owner_thread_id | 
+-------------+--------------------+----------------+-------------+---------------+-------------+-----------------+ 
| TABLE       | performance_schema | metadata_locks | SHARED_READ | TRANSACTION   | GRANTED     |              27 | 
| TABLE       | performance_schema | metadata_locks | SHARED_READ | TRANSACTION   | PENDING     |              29 | 
+-------------+--------------------+----------------+-------------+---------------+-------------+-----------------+ 
1 row in set (0.00 sec) 

这里,重点关注lock_status,"PENDING"代表线程在等待MDL,而"GRANTED"则代表线程持有MDL 

3、如何找出引起阻塞的会话 
结合owner_thread_id,可以可到,是29号线程在等待27号线程的MDL,此时,可kill掉52号线程。 
但需要注意的是,owner_thread_id给出的只是线程ID,并不是show processlist中的ID。如果要查找线程对应的processlist id,需查询performance_schema.threads表。 

mysql> select * from performance_schema.threads where thread_id in(27,29)\G; 
*************************** 1. row *************************** 
          THREAD_ID: 27 
               NAME: thread/sql/one_connection 
               TYPE: FOREGROUND 
     PROCESSLIST_ID: 21 
   PROCESSLIST_USER: root 
   PROCESSLIST_HOST: localhost 
     PROCESSLIST_DB: test01 
PROCESSLIST_COMMAND: Sleep 
   PROCESSLIST_TIME: 901 
  PROCESSLIST_STATE: NULL 
   PROCESSLIST_INFO: select  object_type , object_schema , object_name , lock_type , lock_duration , lock_status , owner_thread_id  from  performance_schema . metadata_locks 
   PARENT_THREAD_ID: 1 
               ROLE: NULL 
       INSTRUMENTED: YES 
            HISTORY: YES 
    CONNECTION_TYPE: Socket 
       THREAD_OS_ID: 2066 
1 row in set (0.00 sec) 
*************************** 1. row *************************** 
          THREAD_ID: 29 
               NAME: thread/sql/one_connection 
               TYPE: FOREGROUND 
     PROCESSLIST_ID: 12 
   PROCESSLIST_USER: root 
   PROCESSLIST_HOST: localhost 
     PROCESSLIST_DB: test01 
PROCESSLIST_COMMAND: Query 
   PROCESSLIST_TIME: 901 
  PROCESSLIST_STATE: Waiting for table metadata lock 
   PROCESSLIST_INFO:  alter table test01.t1 add c1 int; 
   PARENT_THREAD_ID: 1 
               ROLE: NULL 
       INSTRUMENTED: YES 
            HISTORY: YES 
    CONNECTION_TYPE: Socket 
       THREAD_OS_ID: 2066 
1 row in set (0.00 sec) 

将这两张表结合,借鉴sys.schema_table_lock_waits的输出,实际上我们也可以直观地呈现MDL的等待关系。 
 mysql> select *  from sys.schema_table_lock_waits\G; 

标签:5.7,lock,DDL,id,MySQL,PROCESSLIST,NULL,ID,schema
From: https://www.cnblogs.com/harda/p/17000096.html

相关文章

  • fiddler
     ......
  • Fiddler一直提示The system proxy was changed,click to reenable fiddler capture
    解决办法:进入到Fiddler-->Rules-->CustomizeRules1.在main()方法上方添加:staticfunctionDoReattach(o:Object,ea:EventArgs){ScheduledTasks.ScheduleWork("......
  • mysql自带的压力测试工具mysqlslap
    mysql自带的压力测试工具mysqlslap,详情如下: 重要参数: --concurrency代表并发数量,多个可以用逗号隔开,当然你也可以用自己的分隔符隔开,这个时候要用到--delimiter开关。 -......
  • MySQL的一些常用命令
    mysql创建用户:createuser‘用户名’@‘%’identifiedby'密码';   #'%'表示所有地址都可以访问flushprivileges;   #刷新权限grantallon......
  • mysql 导出/导入数据库
    --Mysql--导出函数、存储过程---------------------mysqldump-uroot-paawwqqaa-ntd-Rshujuku>prorandfunc.sql--Mysql--导出表结构、数据---------------------......
  • 各厂使用的MySQL团队开发规范,太详细了,建议收藏!
    关注公众号:IT老哥,每天读一篇干货技术文章,一年后你会发现一个不一样的自己数据库对象命名规范数据库对象数据库对象全局命名规范数据库命名规范表命名规范......
  • MySQL锁机制
    1.表级锁&行级锁数据库中的锁通常分为两种:表级锁:对整张表加锁。开销小,加锁快,不会出现死锁。但是锁的粒度大,发生锁冲突的概率高,并发度低。行级锁:对某行记录加锁。开销大......
  • MySQL日志
    1.错误日志错误日志是MySQL中最重要的日志之一,它记录了当mysqld启动和停止时,以及服务器在运行过程中发生任何严重错误时的相关信息。当数据库出现任何故障导致无法正......
  • Springboot+Mybatis+MySql下,mysql使用json类型字段存取的处理
    转载:Springboot+Mybatis+MySql下,mysql使用json类型字段存取的处理背景:1、mysql5.7开始支持json类型字段;2、mybatis暂不支持json类型字段的处理,需要自己做处理项目......
  • mysql操作源码
    packagecom.mysql;importjava.sql.*;publicclassMysqlTest{staticfinalStringdriver="com.mysql.cj.jdbc.Driver";staticfinalStringDB="jdbc:mysql://......