当 MySQL 日志中遇到“Lock wait timeout returned”错误时,表示事务正在等待用于锁定数据库项。虽然您可能知道哪个查询正在尝试访问数据库,但确定在该精确时刻持有锁的查询可能具有挑战性。
“事务”一词的存在错误消息中表明有问题的查询涉及修改一个或多个 InnoDB 表中的至少一行。由于您有权访问导致错误的查询,因此您可以确定正在访问哪些表,因为它们是潜在的罪魁祸首。
要进一步调查,请运行以下命令命令:
SHOW ENGINE INNODB STATUS\G
这将提供有关锁和互斥锁的信息,包括:
例如,来自客户端的以下输出说明了该问题。
Type: InnoDB Name: Status: ===================================== 110514 19:44:14 INNODB MONITOR OUTPUT ===================================== Per second averages calculated from the last 4 seconds ---------- SEMAPHORES ---------- Mutex spin waits 0, rounds 11487096053, OS waits 7756855 RW-shared spins 722142, OS waits 211221; RW-excl spins 787046, OS waits 39353 ------------------------ LATEST FOREIGN KEY ERROR ------------------------ 110507 21:41:35 Transaction: TRANSACTION 0 606162814, ACTIVE 0 sec, process no 29956, OS thread id 1223895360 updating or deleting, thread declared inside InnoDB 499 mysql tables in use 1, locked 1 14 lock struct(s), heap size 3024, 8 row lock(s), undo log entries 1 MySQL thread id 3686635, query id 124164167 10.64.89.145 viget updating DELETE FROM file WHERE file_id in ('6dbafa39-7f00-0001-51f2-412a450be5cc' ) ...
在此输出中,出现表“文件”成为受影响的表,因为 DELETE 查询正在尝试修改该表中的行。通过分析输出,您可以查明导致锁争用的特定表。
为了避免将来遇到这些错误,请考虑增加锁等待超时通过设置 innodb_lock_wait_timeout 参数来设置 InnoDB 的值。默认值为 50 秒。
要永久增加超时,请将以下行添加到 /etc/my.cnf 文件中:
[mysqld] innodb_lock_wait_timeout=120
或者,您可以临时调整超时在当前会话内:
SET innodb_lock_wait_timeout = 120;
增加超时将为等待事务提供更多时间来获取锁,从而降低可能性超时错误。
以上是如何解决MySQL的'超过锁定等待超时”错误?的详细内容。更多信息请关注PHP中文网其他相关文章!