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

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

我知道哪个查询在那个时刻试图访问数据库,但是是否有一种方法可以找出哪个查询在那个精确的时刻拥有锁?


当前回答

在我的例子中,我只能使用SELECT命令查询数据库,而不能使用UPDATE和DELETE命令。

这个问题是由于一根线卡住了。它没有响应,状态为“sleep”。所以,我必须杀了它。

1-查找线程ID:

select * FROM information_schemaprocesslist ORDER BY id

2-对我来说,它返回了两个线程。现在的那个和卡住的那个。我使用“kill THREAD_ID”来杀死它。

更多信息请看这里 https://oracle-base.com/articles/mysql/mysql-killing-threads

其他回答

看看pt-deadlock-logger实用程序的手册页:

brew install percona-toolkit
pt-deadlock-logger --ask-pass server_name

它从上面提到的引擎innodb状态中提取信息 它可以用来创建一个守护进程,每30秒运行一次。

从上面Rolando的回答推断,是这些阻碍了你的查询:

---TRANSACTION 0 620783788, not started, process no 29956, OS thread id 1196472640
MySQL thread id 5341773, query id 189708353 10.64.89.143 viget

如果你需要执行你的查询,不能等待其他人运行,使用MySQL线程id杀死他们:

kill 5341773 <replace with your thread id>

(从mysql内部,而不是shell,显然)

你必须找到线程id从:

show engine innodb status\G

命令,并找出哪个是阻塞数据库的程序。

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

——min-duration=你的innodb_lock_wait_timeout值

然后禁用general.log。

在我的例子中,我只能使用SELECT命令查询数据库,而不能使用UPDATE和DELETE命令。

这个问题是由于一根线卡住了。它没有响应,状态为“sleep”。所以,我必须杀了它。

1-查找线程ID:

select * FROM information_schemaprocesslist ORDER BY id

2-对我来说,它返回了两个线程。现在的那个和卡住的那个。我使用“kill THREAD_ID”来杀死它。

更多信息请看这里 https://oracle-base.com/articles/mysql/mysql-killing-threads

你可以使用:

show full processlist

它将列出MySQL中的所有连接和连接的当前状态以及正在执行的查询。还有一个更短的变种show processlist;它显示截断的查询以及连接统计信息。