Edited at

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)

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


2018/12/23 追記:

performance_schema.data_locksperformance_schema.data_lock_waitsテーブル等にあるENGINE_LOCK_IDXXX_ENGINE_LOCK_IDカラムのフォーマットが 8.0.13 で変更されたようですが、本題には関係がないので詳細は省略します。



おわりに

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)