MySQL: "锁等待超时"

12

我正在尝试从一个MySQL 5.0.45数据库中删除多行记录:

delete from bundle_inclusions;

客户端工作一段时间后返回错误:

Lock wait timeout exceeded; try restarting transaction

有可能存在一些未提交的事务锁定了这个表,但我需要让这个进程优先于任何这样的锁。在 MySQL 中如何打破锁定?

4个回答

27

我同意Erik的看法,TRUNCATE TABLE是最好的方式。但如果由于某种原因你不能使用它(例如,如果你不想真正删除表中的每一行),可以尝试以下选项:

  • 分批次删除行(例如,DELETE FROM bundle_inclusions WHERE id BETWEEN ? and ?)
  • 如果这是一个MyISAM表(实际上,在InnoDB下也可能起作用),在DELETE之前尝试发出LOCK TABLE命令。这应该能保证你拥有独占式访问权。
  • 如果这是一个InnoDB表,则在超时后使用SHOW INNODB STATUS命令。这应该能帮助你了解锁定获取失败的原因。
  • 如果你拥有SUPER权限,可以尝试使用SHOW PROCESSLIST ALL来查看哪些其他连接(如果有)正在使用该表,然后使用KILL来摆脱与之竞争的进程。

我相信还有许多其他可能性;希望其中之一能够帮到你。


6

Linux: 在mysql配置文件 (/etc/my.cnf 或 /etc/mysql/my.cnf) 中,插入/编辑以下行

innodb_lock_wait_timeout = 50

将值增加到足够大的程度(以秒为单位),重新启动数据库,进行更改。然后撤销更改并再次重启。


3

我曾经遇到过相同的问题,一笔没有结束的失控交易。我重启了mysqld进程。你不需要截断表格。这会导致来自该失控交易的数据丢失。


2
猜测:截断表 bundle_inclusions

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