我正在运行以下MySQL UPDATE语句:
mysql> update customer set account_import_id = 1;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
我没有使用事务,为什么会得到这个错误?我甚至尝试重新启动我的MySQL服务器,它没有帮助。
该表有406,733行。
我正在运行以下MySQL UPDATE语句:
mysql> update customer set account_import_id = 1;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
我没有使用事务,为什么会得到这个错误?我甚至尝试重新启动我的MySQL服务器,它没有帮助。
该表有406,733行。
当前回答
我们昨天遇到了这个问题,在仔细研究了这里的每一个建议的解决方案,以及其他答案/论坛的其他几个解决方案后,我们最终在意识到实际问题时解决了它。
由于一些糟糕的计划,我们的数据库存储在一个挂载的卷上,该卷也接收我们的常规自动备份。该容量已达到最大容量。
一旦我们清理了一些空间并重新启动,这个错误就被解决了。
注意,我们也手动终止了几个进程:kill <process_id>;所以这仍然是必要的。
总的来说,我们的结论是,令人难以置信的是,我们的日志或警告都没有直接提到磁盘空间不足,但这似乎确实是根本原因。
其他回答
在我的实例中,我正在运行一个异常查询来修复数据。如果你在你的查询中锁定了表,那么你将不必处理锁定超时:
LOCK TABLES `customer` WRITE;
update customer set account_import_id = 1;
UNLOCK TABLES;
这对于正常使用可能不是一个好主意。
更多信息请参见:MySQL 8.0参考手册
我们昨天遇到了这个问题,在仔细研究了这里的每一个建议的解决方案,以及其他答案/论坛的其他几个解决方案后,我们最终在意识到实际问题时解决了它。
由于一些糟糕的计划,我们的数据库存储在一个挂载的卷上,该卷也接收我们的常规自动备份。该容量已达到最大容量。
一旦我们清理了一些空间并重新启动,这个错误就被解决了。
注意,我们也手动终止了几个进程:kill <process_id>;所以这仍然是必要的。
总的来说,我们的结论是,令人难以置信的是,我们的日志或警告都没有直接提到磁盘空间不足,但这似乎确实是根本原因。
您是否可以更新这个表中的任何其他记录,或者这个表是否被大量使用?我想的是,当它试图获得一个锁,它需要更新这条记录时,设置的超时已经超时。你可以延长时间,这可能会有所帮助。
如何强制解锁MySQL中锁定的表:
像这样打破锁可能会导致数据库中的原子性不被强制用于导致锁的sql语句。
这很棘手,正确的解决方案是修复导致锁的应用程序。然而,当美元处于危险之中时,迅速的一脚将使事情再次启动。
1)进入MySQL
mysql -u your_user -p
2)让我们看看锁定的桌子列表
mysql> show open tables where in_use>0;
3)让我们看看当前进程的列表,其中一个正在锁定你的表
mysql> show processlist;
4)终止其中一个进程
mysql> kill <put_process_id_here>;
确保数据库表使用InnoDB存储引擎和READ-COMMITTED事务隔离级别。
你可以通过SELECT @@GLOBAL来检查它。tx_isolation @@tx_isolation;在mysql控制台。
如果没有设置为READ-COMMITTED,则必须设置它。在设置之前,请确保您在mysql中拥有SUPER权限。
你可以从http://dev.mysql.com/doc/refman/5.0/en/set-transaction.html上获得帮助。
通过设置这个,我认为你的问题会得到解决。
您可能还希望检查是否试图同时在两个进程中更新此文件。用户(@tala)在这种情况下遇到了类似的错误消息,可能需要仔细检查…