首页 > 其他 > 详细

应用-MDL锁定位

时间:2021-04-12 18:25:14      阅读:32      评论:0      收藏:0      [点我收藏+]

  在执行语句时,我们可能经常会遇到阻塞等待MDL锁的情况。例如:使用show processlist语句查看线程信息时可能会发现State字段值为"Waiting for table metadata lock"。那么,当遇到这种情况时,应该如何排查是谁持有了MDL锁没有释放呢?下面我们尝试进行MDL锁的等待场景模拟(MDL锁记录对应的instruments为wait/lock/metadata/sql/mdl,默认没有启用;对应的consumers为performance_schema.metadata_locks),在setup_consumers中只受全局配置项global_instrumentation控制,默认开启)。

会话一:
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
 
mysql> update sbtest1 set pad=yyy where id = 1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

 

会话二:
mysql> use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
 
Database changed
mysql> alter table sbtest1 add index i_c(c); #被阻塞

 

查看processlist信息,可以看到update语句正在等待DML锁(Waiting for table metadata lock)。
mysql> show processlist;
+------+------+---------------------+--------------------+---------+------+---------------------------------+--------------------------------------+
| Id   | User | Host                | db                 | Command | Time | State                           | Info                                 |
+------+------+---------------------+--------------------+---------+------+---------------------------------+--------------------------------------+
| 1029 | root | localhost           | test               | Sleep   |  342 |                                 | NULL                                 |
| 1030 | root | localhost           | performance_schema | Query   |    0 | starting                        | show processlist                     |
| 1031 | root | localhost           | test               | Query   |  201 | Waiting for table metadata lock | alter table sbtest1 add index i_c(c) |
| 1032 | root | 218.72.68.237:62091 | performance_schema | Sleep   |  197 |                                 | NULL                                 |
+------+------+---------------------+--------------------+---------+------+---------------------------------+--------------------------------------+
4 rows in set (0.00 sec)

 

在MySQL 5.7版本之前,我们不能从数据库层面很直观地查询谁持有MDL锁信息(如果使用GDB之类的工具来查看,则需要具有一定的C语言基础)。现在,可以通过查询performance_schema.metadata_locks表得知MDL锁信息。
use performance_schema;
select p.THREAD_ID,
       l.ID as processlist_id,
       p.event_name,
       p.TIMER_START,
       round(p.TIMER_WAIT / 1000 / 1000 / 1000 /1000,2) as "TIMER_WAIT(s)",
       p.CURRENT_SCHEMA,
       p.SQL_TEXT,
       l.host,
       l.DB,
       l.STATE,
       ml.LOCK_TYPE,
       ml.LOCK_DURATION,
       ml.LOCK_STATUS,
       ml.OWNER_EVENT_ID
from events_statements_current p
         inner join metadata_locks ml
         inner join information_schema.PROCESSLIST l
         on ml.OWNER_THREAD_ID = p.THREAD_ID and sys.ps_thread_id(l.id) = ml.OWNER_THREAD_ID
        and ml.OWNER_THREAD_ID != sys.ps_thread_id(connection_id());
 
+-----------+----------------+---------------------------+---------------------+---------------+----------------+-------------------------------------------+-----------+------+---------------------------------+---------------------+---------------+-------------+----------------+
| THREAD_ID | processlist_id | event_name                | TIMER_START         | TIMER_WAIT(s) | CURRENT_SCHEMA | SQL_TEXT                                  | host      | DB   | STATE                           | LOCK_TYPE           | LOCK_DURATION | LOCK_STATUS | OWNER_EVENT_ID |
+-----------+----------------+---------------------------+---------------------+---------------+----------------+-------------------------------------------+-----------+------+---------------------------------+---------------------+---------------+-------------+----------------+
|      1054 |           1029 | statement/sql/update      | 1503222543526366000 |          0.00 | test           | update sbtest1 set pad=yyy where id = 1 | localhost | test |                                 | SHARED_WRITE        | TRANSACTION   | GRANTED     |           1221 |
|      1056 |           1031 | statement/sql/alter_table | 1503364065280785000 |        226.98 | test           | alter table sbtest1 add index i_c(c)      | localhost | test | Waiting for table metadata lock | INTENTION_EXCLUSIVE | STATEMENT     | GRANTED     |           1169 |
|      1056 |           1031 | statement/sql/alter_table | 1503364065280785000 |        226.98 | test           | alter table sbtest1 add index i_c(c)      | localhost | test | Waiting for table metadata lock | INTENTION_EXCLUSIVE | TRANSACTION   | GRANTED     |           1169 |
|      1056 |           1031 | statement/sql/alter_table | 1503364065280785000 |        226.98 | test           | alter table sbtest1 add index i_c(c)      | localhost | test | Waiting for table metadata lock | SHARED_UPGRADABLE   | TRANSACTION   | GRANTED     |           1171 |
|      1056 |           1031 | statement/sql/alter_table | 1503364065280785000 |        226.98 | test           | alter table sbtest1 add index i_c(c)      | localhost | test | Waiting for table metadata lock | EXCLUSIVE           | TRANSACTION   | PENDING     |           1254 |
+-----------+----------------+---------------------------+---------------------+---------------+----------------+-------------------------------------------+-----------+------+---------------------------------+---------------------+---------------+-------------+----------------+
5 rows in set (0.00 sec)

 

再次在1029会话执行查询,然后再通过脚本定位如下:
+-----------+----------------+---------------------------+---------------------+---------------+----------------+--------------------------------------+-----------+------+---------------------------------+---------------------+---------------+-------------+----------------+
| THREAD_ID | processlist_id | event_name                | TIMER_START         | TIMER_WAIT(s) | CURRENT_SCHEMA | SQL_TEXT                             | host      | DB   | STATE                           | LOCK_TYPE           | LOCK_DURATION | LOCK_STATUS | OWNER_EVENT_ID |
+-----------+----------------+---------------------------+---------------------+---------------+----------------+--------------------------------------+-----------+------+---------------------------------+---------------------+---------------+-------------+----------------+
|      1054 |           1029 | statement/sql/select      | 1503956228259601000 |          0.01 | test           | select * from sbtest1                | localhost | test |                                 | SHARED_WRITE        | TRANSACTION   | GRANTED     |           1221 |
|      1056 |           1031 | statement/sql/alter_table | 1503364065280785000 |        598.18 | test           | alter table sbtest1 add index i_c(c) | localhost | test | Waiting for table metadata lock | INTENTION_EXCLUSIVE | STATEMENT     | GRANTED     |           1169 |
|      1056 |           1031 | statement/sql/alter_table | 1503364065280785000 |        598.18 | test           | alter table sbtest1 add index i_c(c) | localhost | test | Waiting for table metadata lock | INTENTION_EXCLUSIVE | TRANSACTION   | GRANTED     |           1169 |
|      1056 |           1031 | statement/sql/alter_table | 1503364065280785000 |        598.18 | test           | alter table sbtest1 add index i_c(c) | localhost | test | Waiting for table metadata lock | SHARED_UPGRADABLE   | TRANSACTION   | GRANTED     |           1171 |
|      1056 |           1031 | statement/sql/alter_table | 1503364065280785000 |        598.18 | test           | alter table sbtest1 add index i_c(c) | localhost | test | Waiting for table metadata lock | EXCLUSIVE           | TRANSACTION   | PENDING     |           1254 |
+-----------+----------------+---------------------------+---------------------+---------------+----------------+--------------------------------------+-----------+------+---------------------------------+---------------------+---------------+-------------+----------------+
5 rows in set (0.00 sec)

 

因为events_statements_current记录的是当前线程执行的最新语句,所以并不能判断确切哪个语句产生的阻塞,所以只能和开发人员交涉,实在不行的话,通过events_statements_history定位。
use performance_schema;
select p.THREAD_ID,
       l.ID as processlist_id,
       p.event_name,
       round(p.TIMER_WAIT / 1000 / 1000 / 1000 /1000,2) as "TIMER_WAIT(s)",
       p.CURRENT_SCHEMA,
       p.SQL_TEXT,
       l.host,
       l.DB,
       l.STATE,
       ml.LOCK_TYPE,
       ml.LOCK_DURATION,
       ml.LOCK_STATUS,
       ml.OWNER_EVENT_ID
from events_statements_history p
inner join metadata_locks ml
inner join information_schema.PROCESSLIST l
on ml.OWNER_THREAD_ID = p.THREAD_ID
and sys.ps_thread_id(l.id) = ml.OWNER_THREAD_ID
and ml.OWNER_THREAD_ID != sys.ps_thread_id(connection_id());
+-----------+----------------+--------------------------+---------------+----------------+-------------------------------------------+-----------+------+---------------------------------+---------------------+---------------+-------------+----------------+
| THREAD_ID | processlist_id | event_name               | TIMER_WAIT(s) | CURRENT_SCHEMA | SQL_TEXT                                  | host      | DB   | STATE                           | LOCK_TYPE           | LOCK_DURATION | LOCK_STATUS | OWNER_EVENT_ID |
+-----------+----------------+--------------------------+---------------+----------------+-------------------------------------------+-----------+------+---------------------------------+---------------------+---------------+-------------+----------------+
|      1054 |           1029 | statement/sql/begin      |          0.00 | test           | begin                                     | localhost | test |                                 | SHARED_WRITE        | TRANSACTION   | GRANTED     |           1221 |
|      1054 |           1029 | statement/sql/update     |          0.00 | test           | update sbtest1 set pad=yyy where id = 1 | localhost | test |                                 | SHARED_WRITE        | TRANSACTION   | GRANTED     |           1221 |
|      1054 |           1029 | statement/sql/select     |          0.01 | test           | select * from sbtest1                     | localhost | test |                                 | SHARED_WRITE        | TRANSACTION   | GRANTED     |           1221 |
|      1054 |           1029 | statement/com/Field List |          0.00 | test           | NULL                                      | localhost | test |                                 | SHARED_WRITE        | TRANSACTION   | GRANTED     |           1221 |
|      1054 |           1029 | statement/com/Field List |          0.00 | test           | NULL                                      | localhost | test |                                 | SHARED_WRITE        | TRANSACTION   | GRANTED     |           1221 |
|      1054 |           1029 | statement/com/Field List |          0.00 | test           | NULL                                      | localhost | test |                                 | SHARED_WRITE        | TRANSACTION   | GRANTED     |           1221 |
|      1054 |           1029 | statement/com/Field List |          0.00 | test           | NULL                                      | localhost | test |                                 | SHARED_WRITE        | TRANSACTION   | GRANTED     |           1221 |
|      1054 |           1029 | statement/com/Field List |          0.00 | test           | NULL                                      | localhost | test |                                 | SHARED_WRITE        | TRANSACTION   | GRANTED     |           1221 |
|      1054 |           1029 | statement/com/Field List |          0.00 | test           | NULL                                      | localhost | test |                                 | SHARED_WRITE        | TRANSACTION   | GRANTED     |           1221 |
|      1054 |           1029 | statement/com/Field List |          0.00 | test           | NULL                                      | localhost | test |                                 | SHARED_WRITE        | TRANSACTION   | GRANTED     |           1221 |
|      1056 |           1031 | statement/com/Field List |          0.00 | test           | NULL                                      | localhost | test | Waiting for table metadata lock | INTENTION_EXCLUSIVE | STATEMENT     | GRANTED     |           1169 |
|      1056 |           1031 | statement/com/Field List |          0.00 | test           | NULL                                      | localhost | test | Waiting for table metadata lock | INTENTION_EXCLUSIVE | TRANSACTION   | GRANTED     |           1169 |
|      1056 |           1031 | statement/com/Field List |          0.00 | test           | NULL                                      | localhost | test | Waiting for table metadata lock | SHARED_UPGRADABLE   | TRANSACTION   | GRANTED     |           1171 |
|      1056 |           1031 | statement/com/Field List |          0.00 | test           | NULL                                      | localhost | test | Waiting for table metadata lock | EXCLUSIVE           | TRANSACTION   | PENDING     |           1254 |
|      1056 |           1031 | statement/com/Field List |          0.00 | test           | NULL                                      | localhost | test | Waiting for table metadata lock | INTENTION_EXCLUSIVE | STATEMENT     | GRANTED     |           1169 |
|      1056 |           1031 | statement/com/Field List |          0.00 | test           | NULL                                      | localhost | test | Waiting for table metadata lock | INTENTION_EXCLUSIVE | TRANSACTION   | GRANTED     |           1169 |
|      1056 |           1031 | statement/com/Field List |          0.00 | test           | NULL                                      | localhost | test | Waiting for table metadata lock | SHARED_UPGRADABLE   | TRANSACTION   | GRANTED     |           1171 |
|      1056 |           1031 | statement/com/Field List |          0.00 | test           | NULL                                      | localhost | test | Waiting for table metadata lock | EXCLUSIVE           | TRANSACTION   | PENDING     |           1254 |
|      1056 |           1031 | statement/com/Field List |          0.00 | test           | NULL                                      | localhost | test | Waiting for table metadata lock | INTENTION_EXCLUSIVE | STATEMENT     | GRANTED     |           1169 |
|      1056 |           1031 | statement/com/Field List |          0.00 | test           | NULL                                      | localhost | test | Waiting for table metadata lock | INTENTION_EXCLUSIVE | TRANSACTION   | GRANTED     |           1169 |
|      1056 |           1031 | statement/com/Field List |          0.00 | test           | NULL                                      | localhost | test | Waiting for table metadata lock | SHARED_UPGRADABLE   | TRANSACTION   | GRANTED     |           1171 |
|      1056 |           1031 | statement/com/Field List |          0.00 | test           | NULL                                      | localhost | test | Waiting for table metadata lock | EXCLUSIVE           | TRANSACTION   | PENDING     |           1254 |
|      1056 |           1031 | statement/com/Field List |          0.00 | test           | NULL                                      | localhost | test | Waiting for table metadata lock | INTENTION_EXCLUSIVE | STATEMENT     | GRANTED     |           1169 |
|      1056 |           1031 | statement/com/Field List |          0.00 | test           | NULL                                      | localhost | test | Waiting for table metadata lock | INTENTION_EXCLUSIVE | TRANSACTION   | GRANTED     |           1169 |
|      1056 |           1031 | statement/com/Field List |          0.00 | test           | NULL                                      | localhost | test | Waiting for table metadata lock | SHARED_UPGRADABLE   | TRANSACTION   | GRANTED     |           1171 |
|      1056 |           1031 | statement/com/Field List |          0.00 | test           | NULL                                      | localhost | test | Waiting for table metadata lock | EXCLUSIVE           | TRANSACTION   | PENDING     |           1254 |
|      1056 |           1031 | statement/com/Field List |          0.00 | test           | NULL                                      | localhost | test | Waiting for table metadata lock | INTENTION_EXCLUSIVE | STATEMENT     | GRANTED     |           1169 |
|      1056 |           1031 | statement/com/Field List |          0.00 | test           | NULL                                      | localhost | test | Waiting for table metadata lock | INTENTION_EXCLUSIVE | TRANSACTION   | GRANTED     |           1169 |
|      1056 |           1031 | statement/com/Field List |          0.00 | test           | NULL                                      | localhost | test | Waiting for table metadata lock | SHARED_UPGRADABLE   | TRANSACTION   | GRANTED     |           1171 |
|      1056 |           1031 | statement/com/Field List |          0.00 | test           | NULL                                      | localhost | test | Waiting for table metadata lock | EXCLUSIVE           | TRANSACTION   | PENDING     |           1254 |
|      1056 |           1031 | statement/com/Field List |          0.00 | test           | NULL                                      | localhost | test | Waiting for table metadata lock | INTENTION_EXCLUSIVE | STATEMENT     | GRANTED     |           1169 |
|      1056 |           1031 | statement/com/Field List |          0.00 | test           | NULL                                      | localhost | test | Waiting for table metadata lock | INTENTION_EXCLUSIVE | TRANSACTION   | GRANTED     |           1169 |
|      1056 |           1031 | statement/com/Field List |          0.00 | test           | NULL                                      | localhost | test | Waiting for table metadata lock | SHARED_UPGRADABLE   | TRANSACTION   | GRANTED     |           1171 |
|      1056 |           1031 | statement/com/Field List |          0.00 | test           | NULL                                      | localhost | test | Waiting for table metadata lock | EXCLUSIVE           | TRANSACTION   | PENDING     |           1254 |
|      1056 |           1031 | statement/com/Field List |          0.00 | test           | NULL                                      | localhost | test | Waiting for table metadata lock | INTENTION_EXCLUSIVE | STATEMENT     | GRANTED     |           1169 |
|      1056 |           1031 | statement/com/Field List |          0.00 | test           | NULL                                      | localhost | test | Waiting for table metadata lock | INTENTION_EXCLUSIVE | TRANSACTION   | GRANTED     |           1169 |
|      1056 |           1031 | statement/com/Field List |          0.00 | test           | NULL                                      | localhost | test | Waiting for table metadata lock | SHARED_UPGRADABLE   | TRANSACTION   | GRANTED     |           1171 |
|      1056 |           1031 | statement/com/Field List |          0.00 | test           | NULL                                      | localhost | test | Waiting for table metadata lock | EXCLUSIVE           | TRANSACTION   | PENDING     |           1254 |
|      1056 |           1031 | statement/com/Field List |          0.00 | test           | NULL                                      | localhost | test | Waiting for table metadata lock | INTENTION_EXCLUSIVE | STATEMENT     | GRANTED     |           1169 |
|      1056 |           1031 | statement/com/Field List |          0.00 | test           | NULL                                      | localhost | test | Waiting for table metadata lock | INTENTION_EXCLUSIVE | TRANSACTION   | GRANTED     |           1169 |
|      1056 |           1031 | statement/com/Field List |          0.00 | test           | NULL                                      | localhost | test | Waiting for table metadata lock | SHARED_UPGRADABLE   | TRANSACTION   | GRANTED     |           1171 |
|      1056 |           1031 | statement/com/Field List |          0.00 | test           | NULL                                      | localhost | test | Waiting for table metadata lock | EXCLUSIVE           | TRANSACTION   | PENDING     |           1254 |
|      1056 |           1031 | statement/com/Field List |          0.00 | test           | NULL                                      | localhost | test | Waiting for table metadata lock | INTENTION_EXCLUSIVE | STATEMENT     | GRANTED     |           1169 |
|      1056 |           1031 | statement/com/Field List |          0.00 | test           | NULL                                      | localhost | test | Waiting for table metadata lock | INTENTION_EXCLUSIVE | TRANSACTION   | GRANTED     |           1169 |
|      1056 |           1031 | statement/com/Field List |          0.00 | test           | NULL                                      | localhost | test | Waiting for table metadata lock | SHARED_UPGRADABLE   | TRANSACTION   | GRANTED     |           1171 |
|      1056 |           1031 | statement/com/Field List |          0.00 | test           | NULL                                      | localhost | test | Waiting for table metadata lock | EXCLUSIVE           | TRANSACTION   | PENDING     |           1254 |
|      1056 |           1031 | statement/com/Field List |          0.00 | test           | NULL                                      | localhost | test | Waiting for table metadata lock | INTENTION_EXCLUSIVE | STATEMENT     | GRANTED     |           1169 |
|      1056 |           1031 | statement/com/Field List |          0.00 | test           | NULL                                      | localhost | test | Waiting for table metadata lock | INTENTION_EXCLUSIVE | TRANSACTION   | GRANTED     |           1169 |
|      1056 |           1031 | statement/com/Field List |          0.00 | test           | NULL                                      | localhost | test | Waiting for table metadata lock | SHARED_UPGRADABLE   | TRANSACTION   | GRANTED     |           1171 |
|      1056 |           1031 | statement/com/Field List |          0.00 | test           | NULL                                      | localhost | test | Waiting for table metadata lock | EXCLUSIVE           | TRANSACTION   | PENDING     |           1254 |
+-----------+----------------+--------------------------+---------------+----------------+-------------------------------------------+-----------+------+---------------------------------+---------------------+---------------+-------------+----------------+
50 rows in set (0.02 sec)

应用-MDL锁定位

原文:https://www.cnblogs.com/yeleifeng/p/14648828.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!