首页 >数据库 >mysql教程 >如何解决 MySQL 的'超过锁定等待超时”错误?

如何解决 MySQL 的'超过锁定等待超时”错误?

Susan Sarandon
Susan Sarandon原创
2025-01-03 14:42:41988浏览

How to Troubleshoot MySQL's

如何调试 MySQL 上超过锁等待超时的情况?

当查询尝试访问数据库并遇到锁时,可能会导致超过锁等待超时MySQL 错误日志中的错误。虽然您可能知道哪个查询正在尝试访问数据库,但无法立即确定哪个查询在该确切时刻具有锁定。

找到罪魁祸首的关键是错误语句中提到的“交易”。这表明该查询正在尝试修改一个或多个 InnoDB 表中的至少一行。

既然您已经识别了该查询,下一步就是运行 SHOW ENGINE INNODB STATUSG 命令来查看受影响的表。此命令将为您提供有关查询中涉及的锁和互斥锁的详细信息。

例如,考虑 SHOW ENGINE INNODB STATUSG 命令的以下输出:

mysql> show engine innodb status\G
...
Per second averages calculated from the last 4 seconds
----------
SEMAPHORES
----------
...
14 lock struct(s), heap size 3024, 8 row lock(s), undo log entries 1
...
---------------
LATEST FOREIGN KEY ERROR
---------------
...
DELETE FROM file WHERE file_id in ('6dbafa39-7f00-0001-51f2-412a450be5cc' )
...

在此输出中,我们可以看到有8个行锁,说明正在对文件表中的8行进行写操作。输出中提供的 DELETE 语句确认正在尝试删除操作。

要解决此问题,您可以增加 innodb_lock_wait_timeout 值,该值定义事务在计时之前可以等待锁定的最长时间出去。此设置的默认值为 50 秒。您可以将此值调整为更高的数字,例如 120 秒,以便为事务提供更多时间来完成。

要永久设置 innodb_lock_wait_timeout 值,请将以下行添加到 /etc/my.cnf 文件中:

[mysqld]
innodb_lock_wait_timeout=120

重新启动 MySQL 以应用更改。或者,您可以使用以下命令临时修改当前会话的 innodb_lock_wait_timeout 值:

SET GLOBAL innodb_lock_wait_timeout = 120;

这将允许您运行查询而不会遇到锁定等待超时超出错误。

以上是如何解决 MySQL 的'超过锁定等待超时”错误?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn