我似乎无法提取从MySQL任何有用的信息,以帮助我调试这个错误:ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction。你能帮我找一些吗?
再生产:
一个进程做这样的事情:
start transaction;
update cfgNodes set name="foobar" where ID=29;
Run Code Online (Sandbox Code Playgroud)
只是坐在那里(不承诺,不回滚)。这显然是罪魁祸首 - 由于长时间运行的事务而占用锁的过程 - 我试图找到的罪犯。
另一个进程尝试:
-- The next line just prevents you from having to wait 50 seconds
set innodb_lock_wait_timeout=1;
update cfgNodes set name="foobar" where ID=29;
Run Code Online (Sandbox Code Playgroud)
这第二个过程得到ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction(之后innodb_lock_wait_timeout,默认 50 秒)
我如何找到有关罪犯的任何信息?
标准推荐的来源没有什么帮助:
INFORMATION_SCHEMA.INNODB_TRX显示了交易,但没有太多可以帮助我找到它的信息。只有 1 个表被锁定(在这个伪造的小示例中),即trx_mysql_thread_id4093。
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)
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
瞧 - 我们现在可以看到剩余每笔交易的最后 10 次查询的历史记录,使我们能够找到罪魁祸首。