修复“Lock wait timeout exceeded; try restarting transaction”问题,解决Mysql表格“卡住”的情况?

164

我从一个脚本中向我的本地数据库发送了成千上万次类似于这样的查询:

update some_table set some_column = some_value

我忘记添加where条件,所以同一列的所有行都被设置为相同的值,并且这样做了成千上万次,该列已经创建索引,因此相应的索引可能也被更新了很多次。

我注意到有些问题,因为它花费的时间太长,所以我终止了脚本。即使我重新启动计算机,但某些内容仍然存在于表中,因为简单查询需要很长时间才能运行,当我尝试删除相关索引时,会出现以下消息:

Lock wait timeout exceeded; try restarting transaction

这是一个InnoDB表,所以事务卡住可能是隐式的。我该如何修复这个表并将卡住的事务从中移除?


3
SHOW FULL PROCESSLIST 的输出是什么? - Wolph
1
相关问题:如何调试锁等待超时? - Amir Ali Akbari
我有同样的问题,只不过我的所有数据都备份在XML文件中。这些解决方案对我都不起作用(它们往往假定系统正在运行,而不是重新启动),所以我想我必须等待通过“load xml local infile”恢复数百万条记录。[叹气] - ndm13
有趣的是,你的问题得到了 45 个赞,但你的答案却有 -48 个踩 :) - John Demetriou
类似问题的绝佳答案已在http://dba.stackexchange.com/questions/100984/mysql-lock-wait-timeout-exceeded-try-restarting-transaction中列出。 - Matt
显示剩余4条评论
15个回答

1

我曾经遇到过同样的问题。我认为这是SQL死锁问题。你可以在任务管理器中强制关闭SQL进程。如果这样还没有解决问题,那就重启电脑。你不需要删除表格并重新加载数据。


它解决了问题。但这不能成为LIVE生产服务器的解决方案......我们如何输出此死锁处理?或者我们如何避免发生这种死锁? - Rakib
重新启动 Apache 及其服务(或者至少是 MySQL),无需重新启动。 - Amjo

0

通过将delete更改为truncate,解决了我的问题。

问题-查询:

delete from Survey1.sr_survey_generic_details
mycursor.execute(query)

修复-查询:

truncate table Survey1.sr_survey_generic_details
mycursor.execute(query)

0

这种情况发生在我从多个平台访问数据库时,例如从dbeaver和控制面板。某个时刻,dbeaver卡住了,因此其他面板无法处理额外的信息。解决方案是重新启动所有访问数据库的接入点。关闭它们并重新启动。


-3

问题已解决。

请确保您在查询中没有插入不匹配的数据类型。 我曾经遇到过这样的问题,我试图将“用户浏览器代理数据”存储在 VARCHAR(255) 中,但是出现了锁定问题。然而,当我将其更改为 TEXT(255) 时,问题得到了解决。

因此,很可能是数据类型不匹配导致的问题。


-215
我通过删除表并从备份中恢复解决了这个问题。

12
我得出的结论是,这笔卡住的交易在他等待答复期间已经在后台完成了,因此当他收到答复时,其他任何操作都无法进行。 - Joshua
为什么这是被接受的答案? - this
@这是因为这是OP解决问题的方式。 - A-Tech
@Starship-OnStrike并没有真正回答问题。 - user16217248
那为什么它没有被标记为不是答案呢?@user16217248 - Starship - On Strike
@Starship-OnStrike 因为它有点像答案,但又不完全是。 - user16217248

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