从脚本中我发送了数千次这样的查询到我的本地数据库:
update some_table set some_column = some_value
我忘了添加where部分,因此同一列被设置为表中所有行的相同值,这已经完成了数千次并且列已被索引,因此相应的索引也可能已更新很多次。
我发现有些事情是错的,因为花了太长时间,所以我杀了剧本。从那时起我甚至重新启动了我的计算机,但是表格中存在一些问题,因为简单查询需要很长时间才能运行,当我尝试删除相关索引时,它会因此消息而失败:
Lock wait timeout exceeded; try restarting transaction
这是一个innodb表,因此粘滞的交易可能是隐含的。如何修复此表并从中删除卡住的事务?
答案 0 :(得分:127)
我遇到了类似的问题,并通过检查正在运行的线程来解决它。 要查看正在运行的线程,请在mysql命令行界面中使用以下命令:
SHOW PROCESSLIST;
如果您无法访问mysql命令行界面,也可以从phpMyAdmin发送 这将显示具有相应ID和执行时间的线程列表,因此您可以杀死执行时间过长的线程。 在phpMyAdmin中,您将有一个使用KILL来停止线程的按钮,如果您使用命令行界面,只需使用KILL命令后跟线程ID,如下例所示:
KILL 115;
这将终止相应线程的连接。
答案 1 :(得分:40)
您可以使用
检查当前正在运行的交易SELECT * FROM `information_schema`.`innodb_trx` ORDER BY `trx_started`
您的交易应该是第一个,因为它是列表中最早的。现在只需取trx_mysql_thread_id
的值并发送KILL
命令:
KILL 1234;
如果您不确定哪个交易是您的,请经常重复第一个查询并查看哪些交易仍然存在。
答案 2 :(得分:31)
当我的数据库大小增加并且我在它上面做了很多交易时,这开始发生在我身上。
事实是,可能有一些方法可以优化您的查询或数据库,但尝试这两个查询来解决修复问题。
运行:
SET GLOBAL innodb_lock_wait_timeout = 5000;
然后这个:
SET innodb_lock_wait_timeout = 5000;
答案 3 :(得分:26)
检查锁的InnoDB状态
SHOW ENGINE InnoDB STATUS;
检查MySQL打开的表格
SHOW OPEN TABLES WHERE In_use > 0;
检查待处理的InnoDB交易
SELECT * FROM `information_schema`.`innodb_trx` ORDER BY `trx_started`;
检查锁定依赖性 - 阻止什么
SELECT * FROM `information_schema`.`innodb_locks`;
在调查上述结果后,您应该能够看到锁定内容的内容。
问题的根本原因可能也在您的代码中 - 如果您使用像Hibernate这样的JPA,请检查相关函数,尤其是注释。
例如,如here所述,滥用以下注释可能会导致数据库中的锁定:
@Transactional(propagation = Propagation.REQUIRES_NEW)
答案 4 :(得分:7)
重启MySQL,它运行正常。
但是要注意,如果这样的查询被卡住了,那么某处就会出现问题:
LIKE %...%
等)正如@syedrakib所说,它有效,但这不是生产的长期解决方案。
注意:重启可能会影响状态不一致的数据。
此外,您可以检查MySQL如何使用EXPLAIN关键字处理您的查询,并查看是否有可能加速查询(索引,复杂测试......)。
答案 5 :(得分:5)
为事务建立连接时,在执行事务之前获取锁定。如果无法获得锁定,那么你会尝试一段时间。如果仍然无法获得锁定,则抛出锁定等待时间超出错误。为什么您无法获得锁定是因为您没有关闭连接。因此,当您尝试第二次锁定时,您将无法获得锁定,因为您之前的连接仍未关闭并持有锁定。
解决方案:关闭连接或setAutoCommit(true)[根据您的设计]释放锁定。
答案 6 :(得分:3)
转到mysql中的进程。
所以可以看到任务仍然有效。
终止特定流程或等到流程完成。
答案 7 :(得分:1)
我在尝试删除某组记录时遇到此问题(使用MS Access 2007与Web服务器上的MySQL连接到ODBC)。通常我会删除MySQL中的某些记录,然后用更新的记录替换(级联删除几个相关记录,这简化了删除单个记录删除的所有相关记录)。
我试图在phpMyAdmin中运行表格中的可用操作(优化,刷新等),但是当我尝试刷新时,我得到了RELOAD错误的需要权限。由于我的数据库位于Web服务器上,因此无法重新启动数据库。从备份中恢复不是一种选择。
我尝试在网络上的cPanel mySQL访问中对这组记录运行删除查询。得到相同的错误消息。
我的解决方案:我使用了Sun(甲骨文)的免费MySQL查询浏览器(我以前安装在我的计算机上)并在那里运行了删除查询。它立即起作用,问题解决了。然后,我可以使用ODBC访问MySQL连接使用Access脚本再次执行该功能。
答案 8 :(得分:0)
我遇到了“更新” - 陈述的同样问题。我的解决方案只是运行phpMyAdmin中可用的操作。我对表进行了优化,刷新和碎片整理(不按此顺序)。无需删除表并从备份中恢复它。 :)
答案 9 :(得分:0)
我有同样的问题。我认为这是SQL的死锁问题。您可以从任务管理器强制关闭SQL进程。如果没有解决问题,只需重新启动计算机即可。您无需删除表并重新加载数据。
答案 10 :(得分:0)
修正了它, 确保查询中没有不匹配的数据类型插入。 我有一个问题,我在“VARCHAR(255)”中尝试“用户浏览器代理数据”并且遇到此锁的问题但是当我将其更改为“TEXT(255)”时它修复了它。 所以很可能是数据类型错误匹配
答案 11 :(得分:0)
在我的情况下,问题是:对事务中的某些行进行了一些更新,并且在提交事务之前,在另一个地方,该事务之外的同一行正在更新。 Ensuring that all the updates to the rows are made within the same transaction resolved my issue
。
答案 12 :(得分:-1)
delete
更改为truncate
解决了我的问题
问题- 查询:
delete from Survey1.sr_survey_generic_details
mycursor.execute(query)
修复- 查询:
truncate table Survey1.sr_survey_generic_details
mycursor.execute(query)
答案 13 :(得分:-116)
我通过删除表并从备份中恢复来解决了这个问题。