在我的生产错误日志中,我偶尔会看到:
SQLSTATE[HY000]:一般错误:1205 超过锁等待超时;试一试 重新启动事务
我知道哪个查询在那个时刻试图访问数据库,但是是否有一种方法可以找出哪个查询在那个精确的时刻拥有锁?
在我的生产错误日志中,我偶尔会看到:
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;它显示截断的查询以及连接统计信息。