如何中止 mysql 的问题进程

mysql / sql

遇到了一个 mysql 有意思的问题,记录一下

问题

我有一个 mysql 数据库需要重新导入数据,导入前需要先清空原数据,在执行 truncate 脚本时居然卡住了,按道理来说 truncate 应该会很快执行完毕才对。

分析

通过资源管理器,发现 mysqld 一直在读取数据库中的一张表,这样大概原因我们就清楚了,因为表格一直在读取,truncate 指令拿不到表格的锁,所以 truncate 一直在等待。

这个数据库一段时间前有用户执行过一些查询,但是数据量较大,可能有一些查询执行的时间较长。然后由于某些未知原因,连接断线后依然在执行查询,导致了目前我们存在的问题。

解决

当时由于急着解决问题,采取了一种比较粗暴的方式解决:重启 mysql 服务。事后想想,其实我们可以用更优雅的方式试试看,重启 mysql 服务可以作为最后的兜底手段。

检查 mysql 当前进程

我们可以通过以下命令列出所有正在执行的查询:

show full processlist;

我们可以根据输出的表格,判断是哪个进程目前正在执行上述查询,以及查看进程的用户以及连接地址等信息。确定进程 id 后我们就可以通过以下指令来中止特定的进程了,我们假设需要中止的进程 id 为 9999:

kill 9999;

这样我们就可以有选择的中止异常进程了,因为毕竟重启 mysql 服务会影响所有连接到数据库的服务。

总结

如果我们发现 mysql 有异常,可以试着先确定一下是否是某个进程引起的,如果可以确定,那么不妨只中止异常的进程看看问题是否可以解决,不行的话,我们再采取重启 mysql 服务的方案。