MySQL 5.1+InnoDB Plugin 1.0以降でのロック状態確認方法としては、こちらの記事が有名です。
- MySQL InnoDBにおけるロック競合の解析手順(SH2の日記/SH2さん)
利用しているのがMySQL 5.6以前だったり、MySQL 5.7を利用していても複数バージョンが混在している環境では同一のクエリで確認できるメリットがありますので、今でもこれを使われている方が多いのではないかと思います(MySQL Casual Advent Calendar 2017の20日目でも、@soudai1025さんがビューの作成を勧められていました)。
- なぜあなたは SHOW ENGINE INNODB STATUS を読まないのか(そーだいなるらくがき帳/そーだいさん)
一方、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
ビューで確認することができます。
- 26.4.3.9 The innodb_lock_waits and x$innodb_lock_waits Views(MySQL 5.7 Reference Manual)
検証用テーブルの作成
検証用に以下のテーブルとレコードを用意します。
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
してみます。
$ 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_LOCKS
・information_schema.INNODB_LOCK_WAITS
の2つのテーブルがdeprecatedになり、次バージョン(8.0)で廃止されることを伝えるものです。
一応、それぞれのテーブルも確認してみます。
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)
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
します。
$ 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;
ロック獲得で待たされます。
再度、ロック状態確認
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_LOCKS
・information_schema.INNODB_LOCK_WAITS
テーブルも確認してみます。
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)
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つのテーブルが廃止されて別のテーブルに置き換わっているので、表示される内容が若干変わっています。
- 27.4.3.9 The innodb_lock_waits and x$innodb_lock_waits Views(MySQL 8.0 Reference Manual)
- 26.11.12.1 The data_locks Table(MySQL 8.0 Reference Manual)
- 26.11.12.2 The data_lock_waits Table(MySQL 8.0 Reference Manual)
※対象バージョンはMySQL 8.0.1以降です。
以降、先ほどと同じ流れで検証を勧めます(検証用テーブルは共通)。
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では表示されなかった)インテンション排他ロック(テーブル排他ロック)も表示されています。
- 14.2.3 InnoDB のロックモード(MySQL 5.6 リファレンスマニュアル)
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;
※ロック獲得待ち。
再度、ロック状態確認
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_locks
・performance_schema.data_lock_waits
テーブルも確認してみます。
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
ビューのところで触れたとおりパーティション名とサブパーティション名が追加されています。
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_locks
・performance_schema.data_lock_waits
テーブル等にあるENGINE_LOCK_ID
・XXX_ENGINE_LOCK_ID
カラムのフォーマットが 8.0.13 で変更されたようですが、本題には関係がないので詳細は省略します。
おわりに
MySQL 8.0ではinformation_schema.INNODB_LOCKS
・information_schema.INNODB_LOCK_WAITS
の2つのテーブルが廃止されてperformance_schema.data_locks
・performance_schema.data_lock_waits
に置き換えられたので、先のSH2さんの記事に示されたクエリを使っている場合は、内容を書き換える必要があります。
※各テーブルのカラム対応関係の情報はこちらです。
- 25.32.14 The INFORMATION_SCHEMA INNODB_LOCKS Table(MySQL 8.0 Reference Manual)
- 25.32.15 The INFORMATION_SCHEMA INNODB_LOCK_WAITS Table(MySQL 8.0 Reference Manual)
因みに、MySQL 5.7・8.0のsys.innodb_lock_waits
ビューの定義は、以下の通りです。
MySQL 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` 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)
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)