我似乎无法从MySQL提取任何有用的信息来帮助调试此错误:ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
。你能帮我找到一些吗?
复制:
一个进程执行以下操作:
start transaction;
update cfgNodes set name="foobar" where ID=29;
,然后坐在那里(不提交,不回滚)。显然,这是罪魁祸首-由于长时间运行的事务而导致锁死的过程-我想找到的罪犯。
另一个过程尝试:
-- 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;
第二个过程得到ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
(在innodb_lock_wait_timeout
之后,默认为50秒)
我如何找到有关肇事者的任何信息?
答案 0 :(得分:2)
推荐的标准来源几乎没有帮助:
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
为空,这对于documentation来说是有意义的,因为只有一个事务,并且当前没有人等待任何锁。无论如何,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)
Voila-现在,我们可以查看剩余交易中每笔交易最近10次查询的历史记录,从而找到罪魁祸首。