如何在MySQL上调试锁等待超时问题?

308

在我的生产错误日志中,我偶尔会看到以下信息:

SQLSTATE[HY000]:一般性错误:1205 锁等待超时;请尝试重新启动事务

我知道哪个查询正在尝试访问数据库,但是否有办法找出那个特定时刻拥有锁的查询呢?


1
我强烈建议每个人尝试一下Eirik的答案。 - kommradHomer
可能是重复的问题:如何克服从表中获取记录锁定失败的问题 - Max Alexander Hanna
@kommradHomer 他的回答在哪里? - Volatil3
@Volatil3更改了他的名字。这是答案https://dev59.com/1m025IYBdhLWcg3wclm-#20521293。 - kommradHomer
12个回答

0
在我的情况下,我只能使用SELECT命令查询数据库,但无法使用UPDATE和DELETE命令。
问题是由于一个卡住的线程。它没有响应,状态为“sleep”。所以,我不得不杀掉它。
1- 找到线程ID:
执行以下选择:SELECT * FROM information_schema.processlist ORDER BY id
2- 对我来说,它返回了两个线程。当前的和卡住的。我使用“kill THREAD_ID”来杀死它。
更多信息请参见此处 https://oracle-base.com/articles/mysql/mysql-killing-threads

-1

激活MySQL general.log(磁盘密集型操作)并使用mysql_analyse_general_log.pl提取长时间运行的事务,例如:

--min-duration=your innodb_lock_wait_timeout value

然后禁用general.log。


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