在我杀死我的客户后,MySQL 继续处理查询数小时

ser*_*ail 6 mysql mariadb

嗨,我有一个包含 1000 万行和许多触发器的 MySQL 数据库。一个 php 客户端每秒连接到 mysql 和 INSERT 的数百行。

当客户端运行了几个小时,我终止了客户端,使用 mytop 我看到交易仍在发生,甚至是新的交易。它持续数小时才“赶上”。

现在作为 DBA,我如何查看这个“积压日志”?它被列为什么变量?用什么my.cnf参数来控制呢?为什么会发生这种情况?我以为

ran*_*omx 6

这是一个非常随意的解释......

MySQL 是这样工作的:

您向它发送一个查询,其结果集大于其缓冲区,因此它会在磁盘上创建一个临时表来保存数据。这是一个昂贵的过程,因为它通常是从同一磁盘读取、交换和写入,除非故意进行不同的配置。尽管如此,性能坦克。所以现在你在想“我必须做点什么,对吧?” 所以你杀死了你的 PHP 进程。现在的问题是“您的查询进程是否被终止,或者它正在运行还是正在释放空间?” 要了解您的进程处于什么状态,您需要以 root 或具有 PROCESS 权限的用户身份运行它:

SELECT TIME,STATE,ID,HOST,DB,INFO 
FROM INFORMATION_SCHEMA.PROCESSLIST 
WHERE INFO IS NOT NULL 
ORDER BY TIME DESC LIMIT 3\G
Run Code Online (Sandbox Code Playgroud)

这将为您提供前三个运行时间最长的进程。只需增加限制即可显示更多信息。如果您真的想结束违规过程,请查看 ID 字段并杀死该 #。例如

*************************** 1. row ***************************
 TIME: 0
STATE: executing
   ID: 4
 HOST: localhost
   DB: NULL
 INFO: SELECT TIME,STATE,ID,HOST,DB,INFO FROM INFORMATION_SCHEMA.PROCESSLIST WHERE INFO IS NOT NULL ORDER BY TIME DESC
1 row in set (0.03 sec)

mysql> KILL 4;
Run Code Online (Sandbox Code Playgroud)

这不会简单地消除该 ID 发生的所有事情,但至少您可以放心,它肯定会设置为“免费物品”或等效状态。


Dav*_*ett 5

您确定终止客户端会终止运行 INSERT 的 PHP 进程吗?如果它为每个调用使用“新”连接并依靠某种连接池来提高效率,那么当您杀死当前正在使用的连接时,它可能只是随机切换到池中可用的下一个连接。