标准推荐的来源帮助不大:
INFORMATION_SCHEMA.INNODB_TRX
显示了事务信息,但无法帮助我找到它。只知道有1个表被锁定(在这个虚假的小例子中),并且
trx_mysql_thread_id
是 4093。
mysql> select * from INFORMATION_SCHEMA.INNODB_TRX\G
*************************** 1. row ***************************
trx_id: 280907
trx_state: RUNNING
trx_started: 2018-11-30 00:35:06
trx_requested_lock_id: NULL
trx_wait_started: NULL
trx_weight: 3
trx_mysql_thread_id: 4093
trx_query: NULL
trx_operation_state: NULL
trx_tables_in_use: 0
trx_tables_locked: 1
trx_lock_structs: 2
trx_lock_memory_bytes: 1136
trx_rows_locked: 1
trx_rows_modified: 1
trx_concurrency_tickets: 0
trx_isolation_level: REPEATABLE READ
trx_unique_checks: 1
trx_foreign_key_checks: 1
trx_last_foreign_key_error: NULL
trx_adaptive_hash_latched: 0
trx_adaptive_hash_timeout: 0
trx_is_read_only: 0
trx_autocommit_non_locking: 0
1 row in set (0.00 sec)
INFORMATION_SCHEMA.INNODB_LOCKS
为空,这是合理的,鉴于文档,因为只有一个事务,目前没有任何等待锁。而且INNODB_LOCKS
已经过时了。
SHOW ENGINE INNODB STATUS
是无用的:根本没有提到cfgNodes
SHOW FULL PROCESSLIST
为空,因为罪犯现在实际上并没有运行查询。
但是现在还记得之前的trx_mysql_thread_id
吗?我们可以用它来查看在该事务中执行的查询:
mysql> SELECT SQL_TEXT
-> FROM performance_schema.events_statements_history ESH,
-> performance_schema.threads T
-> WHERE ESH.THREAD_ID = T.THREAD_ID
-> AND ESH.SQL_TEXT IS NOT NULL
-> AND T.PROCESSLIST_ID = 4093
-> ORDER BY ESH.EVENT_ID LIMIT 10;
+
| SQL_TEXT |
+
| select @@version_comment limit 1 |
| start transaction |
| update cfgNodes set name="foobar" where ID=29 |
+
3 rows in set (0.00 sec)
现在我们可以查看剩余事务的最后10个查询历史记录,以便找到罪魁祸首。