如何解决MySQL`ERROR 1205(HY000):超出了锁定等待超时;尝试重新开始交易`

时间:2018-11-29 23:49:09

标签: mysql locking

我似乎无法从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 个答案:

答案 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次查询的历史记录,从而找到罪魁祸首。