MySQL 5.7と8.0でロック状態を確認する(sys.innodb_lock_waitsビュー)

MySQL 5.1+InnoDB Plugin 1.0以降でのロック状態確認方法としては、こちらの記事が有名です。

利用しているのがMySQL 5.6以前だったり、MySQL 5.7を利用していても複数バージョンが混在している環境では同一のクエリで確認できるメリットがありますので、今でもこれを使われている方が多いのではないかと思います(MySQL Casual Advent Calendar 2017の20日目でも、@soudai1025さんがビューの作成を勧められていました)。

一方、MySQL 5.7では、sysスキーマにロック状態確認ができるビューとしてsys.innodb_lock_waitsが標準で用意されていますので、今回はこちらを取り上げます。

また、MySQL 8.0では、ビューから参照されているテーブルが一部置き換えられていますので、こちらも後で取り上げます。

※本当は「MySQL 8.0(8.0.1)でこう変わった」というのをメインで取り上げようと思ったのですが(MySQL 5.7の話はすでにたくさん取り上げられているので)、MySQL 5.7からの差分がわからないといけないので取り上げ方を変えました。

MySQL 5.7でのロック状態確認方法

MySQL 5.7では、あるトランザクションのロックが他のトランザクションのロック獲得を待たせている場合、sys.innodb_lock_waitsビューで確認することができます。

検証用テーブルの作成

検証用に以下のテーブルとレコードを用意します。

検証用テーブル
mysql> SHOW CREATE TABLE lock_test.lock_test\G
*************************** 1. row ***************************
       Table: lock_test
Create Table: CREATE TABLE `lock_test` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `val1` int(11) NOT NULL,
  `val2` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_val1` (`val1`),
  KEY `idx_val2` (`val2`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

mysql> SELECT * FROM lock_test.lock_test;
+----+------+------+
| id | val1 | val2 |
+----+------+------+
|  1 |    1 |    6 |
|  2 |    3 |    2 |
|  3 |    6 |    3 |
|  4 |    4 |    1 |
|  5 |    5 |    6 |
|  6 |    2 |    1 |
|  7 |    3 |    3 |
|  8 |    7 |    2 |
|  9 |    8 |    4 |
+----+------+------+
9 rows in set (0.00 sec)

1つ目トランザクションでUPDATE

1つ目のセッションでトランザクションを開始し、主キー指定でUPDATEしてみます。

1つ目トランザクションでUPDATE
$ mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.20 MySQL Community Server (GPL)

Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> SET autocommit=0;
Query OK, 0 rows affected (0.00 sec)

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

mysql> UPDATE lock_test.lock_test SET val1=9 WHERE id=6;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

ロック状態確認

ここで一度ロック状態を確認してみます。

ロック状態確認
mysql> SELECT * FROM sys.innodb_lock_waits\G
Empty set, 3 warnings (0.00 sec)

何も表示されません。

WARNINGが3つ出ていますが、これはこのビューから参照しているinformation_schema.INNODB_LOCKSinformation_schema.INNODB_LOCK_WAITSの2つのテーブルがdeprecatedになり、次バージョン(8.0)で廃止されることを伝えるものです。

一応、それぞれのテーブルも確認してみます。

information_schema.INNODB_LOCKS
mysql> SELECT * FROM information_schema.INNODB_LOCKS\G
Empty set, 1 warning (0.00 sec)

mysql> SHOW WARNINGS\G
*************************** 1. row ***************************
  Level: Warning
   Code: 1681
Message: 'INFORMATION_SCHEMA.INNODB_LOCKS' is deprecated and will be removed in a future release.
1 row in set (0.00 sec)
information_schema.INNODB_LOCK_WAITS
mysql> SELECT * FROM information_schema.INNODB_LOCK_WAITS\G
Empty set, 1 warning (0.00 sec)

mysql> SHOW WARNINGS\G
*************************** 1. row ***************************
  Level: Warning
   Code: 1681
Message: 'INFORMATION_SCHEMA.INNODB_LOCK_WAITS' is deprecated and will be removed in a future release.
1 row in set (0.00 sec)

2つ目トランザクションでUPDATE

1つ目のセッションでトランザクションをCOMMITする前に、2つ目のセッションでトランザクションを開始し、同じレコードをUPDATEします。

2つ目トランザクションでUPDATE
$ mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.7.20 MySQL Community Server (GPL)

Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> SET autocommit=0;
Query OK, 0 rows affected (0.00 sec)

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

mysql> UPDATE lock_test.lock_test SET val1=6 WHERE id=6;

ロック獲得で待たされます。

再度、ロック状態確認

ロック状態確認その2
mysql> SELECT * FROM  sys.innodb_lock_waits\G
*************************** 1. row ***************************
                wait_started: 2018-01-07 13:09:32
                    wait_age: 00:00:02
               wait_age_secs: 2
                locked_table: `lock_test`.`lock_test`
                locked_index: PRIMARY
                 locked_type: RECORD
              waiting_trx_id: 92210
         waiting_trx_started: 2018-01-07 13:07:49
             waiting_trx_age: 00:01:45
     waiting_trx_rows_locked: 2
   waiting_trx_rows_modified: 0
                 waiting_pid: 6
               waiting_query: UPDATE lock_test.lock_test SET val1=6 WHERE id=6
             waiting_lock_id: 92210:112:3:7
           waiting_lock_mode: X
             blocking_trx_id: 92209
                blocking_pid: 4
              blocking_query: NULL
            blocking_lock_id: 92209:112:3:7
          blocking_lock_mode: X
        blocking_trx_started: 2018-01-07 13:04:45
            blocking_trx_age: 00:04:49
    blocking_trx_rows_locked: 1
  blocking_trx_rows_modified: 1
     sql_kill_blocking_query: KILL QUERY 4
sql_kill_blocking_connection: KILL 4
1 row in set, 3 warnings (0.00 sec)

今度は情報が表示されました。

blocking_pid: 4のセッション(1つ目)のトランザクションが、blocking_lock_mode: X(排他ロック)で、waiting_pid: 6のセッション(2つ目)のトランザクションをwait_age_secs: 2秒間待たせているのが分かります。
sql_kill_blocking_query: KILL QUERY 4(クエリ/コマンド単位で待たせている側の処理をKILLするコマンド)とsql_kill_blocking_connection: KILL 4(同・セッション単位でKILL)が表示されているのが面白いです。

一応、ビューから参照しているinformation_schema.INNODB_LOCKSinformation_schema.INNODB_LOCK_WAITSテーブルも確認してみます。

information_schema.INNODB_LOCKSその2
mysql> SELECT * FROM information_schema.INNODB_LOCKS\G
*************************** 1. row ***************************
    lock_id: 92210:112:3:7
lock_trx_id: 92210
  lock_mode: X
  lock_type: RECORD
 lock_table: `lock_test`.`lock_test`
 lock_index: PRIMARY
 lock_space: 112
  lock_page: 3
   lock_rec: 7
  lock_data: 6
*************************** 2. row ***************************
    lock_id: 92209:112:3:7
lock_trx_id: 92209
  lock_mode: X
  lock_type: RECORD
 lock_table: `lock_test`.`lock_test`
 lock_index: PRIMARY
 lock_space: 112
  lock_page: 3
   lock_rec: 7
  lock_data: 6
2 rows in set, 1 warning (0.00 sec)
information_schema.INNODB_LOCK_WAITSその2
mysql> SELECT * FROM information_schema.INNODB_LOCK_WAITS\G
*************************** 1. row ***************************
requesting_trx_id: 92210
requested_lock_id: 92210:112:3:7
  blocking_trx_id: 92209
 blocking_lock_id: 92209:112:3:7
1 row in set, 1 warning (0.00 sec)

この場合は、information_schema.INNODB_LOCKSテーブルに、待たせている側の92209:112:3:7だけでなく、待っている側のlock_id: 92210:112:3:7も表示されています。

MySQL 8.0でのロック状態確認方法

基本的にはMySQL 5.7と同じですが、前述の通り、ビューで参照している2つのテーブルが廃止されて別のテーブルに置き換わっているので、表示される内容が若干変わっています。

※対象バージョンはMySQL 8.0.1以降です。

以降、先ほどと同じ流れで検証を勧めます(検証用テーブルは共通)。

1つ目トランザクションでUPDATE

1つ目トランザクションでUPDATE
$ mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.3-rc-log MySQL Community Server (GPL)

Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> SET autocommit=0;
Query OK, 0 rows affected (0.00 sec)

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

mysql> UPDATE lock_test.lock_test SET val1=9 WHERE id=6;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

ロック状態確認

ロック状態確認
mysql> SELECT * FROM sys.innodb_lock_waits\G
Empty set (0.00 sec)

mysql> SELECT * FROM performance_schema.data_locks\G
*************************** 1. row ***************************
               ENGINE: INNODB
       ENGINE_LOCK_ID: 275292:113
ENGINE_TRANSACTION_ID: 275292
            THREAD_ID: 36
             EVENT_ID: 7
        OBJECT_SCHEMA: lock_test
          OBJECT_NAME: lock_test
       PARTITION_NAME: NULL
    SUBPARTITION_NAME: NULL
           INDEX_NAME: NULL
OBJECT_INSTANCE_BEGIN: 139983990072856
            LOCK_TYPE: TABLE
            LOCK_MODE: IX
          LOCK_STATUS: GRANTED
            LOCK_DATA: NULL
*************************** 2. row ***************************
               ENGINE: INNODB
       ENGINE_LOCK_ID: 275292:47:4:7
ENGINE_TRANSACTION_ID: 275292
            THREAD_ID: 36
             EVENT_ID: 7
        OBJECT_SCHEMA: lock_test
          OBJECT_NAME: lock_test
       PARTITION_NAME: NULL
    SUBPARTITION_NAME: NULL
           INDEX_NAME: PRIMARY
OBJECT_INSTANCE_BEGIN: 139983990069816
            LOCK_TYPE: RECORD
            LOCK_MODE: X
          LOCK_STATUS: GRANTED
            LOCK_DATA: 6
2 rows in set (0.00 sec)

mysql> SELECT * FROM performance_schema.data_lock_waits\G
Empty set (0.00 sec)

sys.innodb_lock_waitsビューに表示されない点は同じですが、information_schema.INNODB_LOCKSテーブルから置き換えられたperformance_schema.data_locksテーブルには、獲得を待たせていない/待っていないロックも表示されるようになったため、この段階で1つ目のセッションのトランザクションで獲得したロックの情報が表示されています。

※その関係で、(他を待たせていないので5.7では表示されなかった)インテンション排他ロック(テーブル排他ロック)も表示されています。

2つ目トランザクションでUPDATE

2つ目トランザクションでUPDATE
$ mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.0.3-rc-log MySQL Community Server (GPL)

Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> SET autocommit=0;
Query OK, 0 rows affected (0.00 sec)

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

mysql> UPDATE lock_test.lock_test SET val1=6 WHERE id=6;

※ロック獲得待ち。

再度、ロック状態確認

ロック状態確認その2
mysql> SELECT * FROM sys.innodb_lock_waits\G
*************************** 1. row ***************************
                wait_started: 2018-01-07 14:36:43
                    wait_age: 00:00:05
               wait_age_secs: 5
                locked_table: `lock_test`.`lock_test`
         locked_table_schema: lock_test
           locked_table_name: lock_test
      locked_table_partition: NULL
   locked_table_subpartition: NULL
                locked_index: PRIMARY
                 locked_type: RECORD
              waiting_trx_id: 275293
         waiting_trx_started: 2018-01-07 14:36:43
             waiting_trx_age: 00:00:05
     waiting_trx_rows_locked: 1
   waiting_trx_rows_modified: 0
                 waiting_pid: 9
               waiting_query: UPDATE lock_test.lock_test SET val1=6 WHERE id=6
             waiting_lock_id: 275293:47:4:7
           waiting_lock_mode: X
             blocking_trx_id: 275292
                blocking_pid: 8
              blocking_query: NULL
            blocking_lock_id: 275292:47:4:7
          blocking_lock_mode: X
        blocking_trx_started: 2018-01-07 14:30:56
            blocking_trx_age: 00:05:52
    blocking_trx_rows_locked: 1
  blocking_trx_rows_modified: 1
     sql_kill_blocking_query: KILL QUERY 8
sql_kill_blocking_connection: KILL 8
1 row in set (0.01 sec)

今回の例では関係ありませんが、locked_table_partition:(パーティション名)・locked_table_subpartition:(サブパーティション名)も表示されるようになりました。
locked_table:は「DB名.テーブル名」形式のままですが(互換のため?)、locked_table_name:も追加されています。

一応、ビューから参照しているperformance_schema.data_locksperformance_schema.data_lock_waitsテーブルも確認してみます。

performance_schema.data_locks
mysql> SELECT * FROM performance_schema.data_locks\G
*************************** 1. row ***************************
               ENGINE: INNODB
       ENGINE_LOCK_ID: 275293:113
ENGINE_TRANSACTION_ID: 275293
            THREAD_ID: 37
             EVENT_ID: 6
        OBJECT_SCHEMA: lock_test
          OBJECT_NAME: lock_test
       PARTITION_NAME: NULL
    SUBPARTITION_NAME: NULL
           INDEX_NAME: NULL
OBJECT_INSTANCE_BEGIN: 139983990078808
            LOCK_TYPE: TABLE
            LOCK_MODE: IX
          LOCK_STATUS: GRANTED
            LOCK_DATA: NULL
*************************** 2. row ***************************
               ENGINE: INNODB
       ENGINE_LOCK_ID: 275293:47:4:7
ENGINE_TRANSACTION_ID: 275293
            THREAD_ID: 37
             EVENT_ID: 6
        OBJECT_SCHEMA: lock_test
          OBJECT_NAME: lock_test
       PARTITION_NAME: NULL
    SUBPARTITION_NAME: NULL
           INDEX_NAME: PRIMARY
OBJECT_INSTANCE_BEGIN: 139983990075880
            LOCK_TYPE: RECORD
            LOCK_MODE: X
          LOCK_STATUS: WAITING
            LOCK_DATA: 6
*************************** 3. row ***************************
               ENGINE: INNODB
       ENGINE_LOCK_ID: 275292:113
ENGINE_TRANSACTION_ID: 275292
            THREAD_ID: 36
             EVENT_ID: 7
        OBJECT_SCHEMA: lock_test
          OBJECT_NAME: lock_test
       PARTITION_NAME: NULL
    SUBPARTITION_NAME: NULL
           INDEX_NAME: NULL
OBJECT_INSTANCE_BEGIN: 139983990072856
            LOCK_TYPE: TABLE
            LOCK_MODE: IX
          LOCK_STATUS: GRANTED
            LOCK_DATA: NULL
*************************** 4. row ***************************
               ENGINE: INNODB
       ENGINE_LOCK_ID: 275292:47:4:7
ENGINE_TRANSACTION_ID: 275292
            THREAD_ID: 36
             EVENT_ID: 7
        OBJECT_SCHEMA: lock_test
          OBJECT_NAME: lock_test
       PARTITION_NAME: NULL
    SUBPARTITION_NAME: NULL
           INDEX_NAME: PRIMARY
OBJECT_INSTANCE_BEGIN: 139983990069816
            LOCK_TYPE: RECORD
            LOCK_MODE: X
          LOCK_STATUS: GRANTED
            LOCK_DATA: 6
4 rows in set (0.00 sec)

information_schema.INNODB_LOCKSと比較すると、lock_space:lock_page:lock_rec:相当の情報がなくなっていますが、sys.innodb_lock_waitsビューのところで触れたとおりパーティション名とサブパーティション名が追加されています。

performance_schema.data_lock_waits
mysql> SELECT * FROM performance_schema.data_lock_waits\G
*************************** 1. row ***************************
                          ENGINE: INNODB
       REQUESTING_ENGINE_LOCK_ID: 275293:47:4:7
REQUESTING_ENGINE_TRANSACTION_ID: 275293
            REQUESTING_THREAD_ID: 37
             REQUESTING_EVENT_ID: 6
REQUESTING_OBJECT_INSTANCE_BEGIN: 139983990075880
         BLOCKING_ENGINE_LOCK_ID: 275292:47:4:7
  BLOCKING_ENGINE_TRANSACTION_ID: 275292
              BLOCKING_THREAD_ID: 36
               BLOCKING_EVENT_ID: 7
  BLOCKING_OBJECT_INSTANCE_BEGIN: 139983990069816
1 row in set (0.00 sec)

こちらは情報がかなり増えています。

おわりに

MySQL 8.0ではinformation_schema.INNODB_LOCKSinformation_schema.INNODB_LOCK_WAITSの2つのテーブルが廃止されてperformance_schema.data_locksperformance_schema.data_lock_waitsに置き換えられたので、先のSH2さんの記事に示されたクエリを使っている場合は、内容を書き換える必要があります。

※各テーブルのカラム対応関係の情報はこちらです。

因みに、MySQL 5.7・8.0のsys.innodb_lock_waitsビューの定義は、以下の通りです。
MySQL 8.0で記述が変わり、少し複雑化していますね。

※いずれも改行を加えています。

sys.innodb_lock_waitsビュー定義(5.7)
mysql> SHOW CREATE VIEW sys.innodb_lock_waits\G
*************************** 1. row ***************************
                View: innodb_lock_waits
         Create View: CREATE
 ALGORITHM=TEMPTABLE
 DEFINER=`mysql.sys`@`localhost`
 SQL SECURITY INVOKER
 VIEW `innodb_lock_waits` AS
 select
  `r`.`trx_wait_started` AS `wait_started`,
  timediff(now(),`r`.`trx_wait_started`) AS `wait_age`,
  timestampdiff(SECOND,`r`.`trx_wait_started`,now()) AS `wait_age_secs`,
  `rl`.`lock_table` AS `locked_table`,
  `rl`.`lock_index` AS `locked_index`,
  `rl`.`lock_type` AS `locked_type`,
  `r`.`trx_id` AS `waiting_trx_id`,
  `r`.`trx_started` AS `waiting_trx_started`,
  timediff(now(),`r`.`trx_started`) AS `waiting_trx_age`,
  `r`.`trx_rows_locked` AS `waiting_trx_rows_locked`,
  `r`.`trx_rows_modified` AS `waiting_trx_rows_modified`,
  `r`.`trx_mysql_thread_id` AS `waiting_pid`,
  `sys`.`format_statement`(`r`.`trx_query`) AS `waiting_query`,
  `rl`.`lock_id` AS `waiting_lock_id`,
  `rl`.`lock_mode` AS `waiting_lock_mode`,
  `b`.`trx_id` AS `blocking_trx_id`,
  `b`.`trx_mysql_thread_id` AS `blocking_pid`,
  `sys`.`format_statement`(`b`.`trx_query`) AS `blocking_query`,
  `bl`.`lock_id` AS `blocking_lock_id`,
  `bl`.`lock_mode` AS `blocking_lock_mode`,
  `b`.`trx_started` AS `blocking_trx_started`,
  timediff(now(),`b`.`trx_started`) AS `blocking_trx_age`,
  `b`.`trx_rows_locked` AS `blocking_trx_rows_locked`,
  `b`.`trx_rows_modified` AS `blocking_trx_rows_modified`,
  concat('KILL QUERY ',`b`.`trx_mysql_thread_id`) AS `sql_kill_blocking_query`,
  concat('KILL ',`b`.`trx_mysql_thread_id`) AS `sql_kill_blocking_connection`
 from
 ((((`information_schema`.`innodb_lock_waits` `w`
  join `information_schema`.`innodb_trx` `b`
   on((`b`.`trx_id` = `w`.`blocking_trx_id`)))
  join `information_schema`.`innodb_trx` `r`
   on((`r`.`trx_id` = `w`.`requesting_trx_id`)))
  join `information_schema`.`innodb_locks` `bl`
   on((`bl`.`lock_id` = `w`.`blocking_lock_id`)))
  join `information_schema`.`innodb_locks` `rl`
   on((`rl`.`lock_id` = `w`.`requested_lock_id`)))
 order by `r`.`trx_wait_started` 
character_set_client: utf8
collation_connection: utf8_general_ci
1 row in set (0.00 sec)
sys.innodb_lock_waitsビュー定義(8.0)
mysql> SHOW CREATE VIEW sys.innodb_lock_waits\G
*************************** 1. row ***************************
                View: innodb_lock_waits
         Create View: CREATE
 ALGORITHM=TEMPTABLE
 DEFINER=`mysql.sys`@`localhost`
 SQL SECURITY INVOKER
 VIEW `innodb_lock_waits`
 (`wait_started`,
  `wait_age`,
  `wait_age_secs`,
  `locked_table`,
  `locked_table_schema`,
  `locked_table_name`,
  `locked_table_partition`,
  `locked_table_subpartition`,
  `locked_index`,
  `locked_type`,
  `waiting_trx_id`,
  `waiting_trx_started`,
  `waiting_trx_age`,
  `waiting_trx_rows_locked`,
  `waiting_trx_rows_modified`,
  `waiting_pid`,
  `waiting_query`,
  `waiting_lock_id`,
  `waiting_lock_mode`,
  `blocking_trx_id`,
  `blocking_pid`,
  `blocking_query`,
  `blocking_lock_id`,
  `blocking_lock_mode`,
  `blocking_trx_started`,
  `blocking_trx_age`,
  `blocking_trx_rows_locked`,
  `blocking_trx_rows_modified`,
  `sql_kill_blocking_query`,
  `sql_kill_blocking_connection`) AS
 select
  `r`.`trx_wait_started` AS `wait_started`,
  timediff(now(),`r`.`trx_wait_started`) AS `wait_age`,
  timestampdiff(SECOND,`r`.`trx_wait_started`,now()) AS `wait_age_secs`,
  concat(`sys`.`quote_identifier`(`rl`.`OBJECT_SCHEMA`),'.',`sys`.`quote_identifier`(`rl`.`OBJECT_NAME`)) AS `locked_table`,
  `rl`.`OBJECT_SCHEMA` AS `locked_table_schema`,
  `rl`.`OBJECT_NAME` AS `locked_table_name`,
  `rl`.`PARTITION_NAME` AS `locked_table_partition`,
  `rl`.`SUBPARTITION_NAME` AS `locked_table_subpartition`,
  `rl`.`INDEX_NAME` AS `locked_index`,
  `rl`.`LOCK_TYPE` AS `locked_type`,
  `r`.`trx_id` AS `waiting_trx_id`,
  `r`.`trx_started` AS `waiting_trx_started`,
  timediff(now(),`r`.`trx_started`) AS `waiting_trx_age`,
  `r`.`trx_rows_locked` AS `waiting_trx_rows_locked`,
  `r`.`trx_rows_modified` AS `waiting_trx_rows_modified`,
  `r`.`trx_mysql_thread_id` AS `waiting_pid`,
  `sys`.`format_statement`(`r`.`trx_query`) AS `waiting_query`,
  `rl`.`ENGINE_LOCK_ID` AS `waiting_lock_id`,
  `rl`.`LOCK_MODE` AS `waiting_lock_mode`,
  `b`.`trx_id` AS `blocking_trx_id`,
  `b`.`trx_mysql_thread_id` AS `blocking_pid`,
  `sys`.`format_statement`(`b`.`trx_query`) AS `blocking_query`,
  `bl`.`ENGINE_LOCK_ID` AS `blocking_lock_id`,
  `bl`.`LOCK_MODE` AS `blocking_lock_mode`,
  `b`.`trx_started` AS `blocking_trx_started`,
  timediff(now(),`b`.`trx_started`) AS `blocking_trx_age`,
  `b`.`trx_rows_locked` AS `blocking_trx_rows_locked`,
  `b`.`trx_rows_modified` AS `blocking_trx_rows_modified`,
  concat('KILL QUERY ',`b`.`trx_mysql_thread_id`) AS `sql_kill_blocking_query`,
  concat('KILL ',`b`.`trx_mysql_thread_id`) AS `sql_kill_blocking_connection`
 from
 ((((`performance_schema`.`data_lock_waits` `w`
  join `information_schema`.`INNODB_TRX` `b`
   on((`b`.`trx_id` = cast(`w`.`BLOCKING_ENGINE_TRANSACTION_ID` as char charset utf8))))
  join `information_schema`.`INNODB_TRX` `r`
   on((`r`.`trx_id` = cast(`w`.`REQUESTING_ENGINE_TRANSACTION_ID` as char charset utf8))))
  join `performance_schema`.`data_locks` `bl`
   on((`bl`.`ENGINE_LOCK_ID` = `w`.`BLOCKING_ENGINE_LOCK_ID`)))
  join `performance_schema`.`data_locks` `rl`
   on((`rl`.`ENGINE_LOCK_ID` = `w`.`REQUESTING_ENGINE_LOCK_ID`)))
 order by `r`.`trx_wait_started`
character_set_client: utf8
collation_connection: utf8_general_ci
1 row in set (0.00 sec)

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.