如何解决MySQL“ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction”问题

6

我似乎无法从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秒)之后)。

我该如何查找关于罪犯的任何信息?

1个回答

9
标准推荐的来源帮助不大: 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个查询历史记录,以便找到罪魁祸首。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接