嗨,我有一个MySQL数据库,它有1000万行和很多触发器。php客户端连接到mysql并每秒插入数百行。
当客户端运行了几个小时后,我终止了客户机,使用mytop,我看到事务仍然在锁定,甚至是新的事务。在它“赶上”之前,它会持续几个小时。
现在作为一个DBA,我如何查看这个“回溯日志”?它列出的变量是什么?什么my.cnf参数可以控制它?为什么会发生这种事?我以为
发布于 2011-02-15 00:23:46
这里有一个很随便的解释..。
MySQL的工作方式如下:
您向它发送一个查询,该查询的结果集大于其缓冲区,因此它在磁盘上创建一个临时表来保存数据。这是一个昂贵的过程,因为它通常是从同一个磁盘读取、交换和写入磁盘,除非有目的地进行不同的配置。尽管如此,性能坦克。所以你现在在想“我必须做点什么,对吧?”因此,您将终止PHP进程。现在的问题是:“您的查询进程是被杀死了,还是正在运行,还是现在正在释放空间?”要了解您的进程处于何种状态,您需要以根用户或具有进程特权的用户的身份运行该状态:
SELECT TIME,STATE,ID,HOST,DB,INFO
FROM INFORMATION_SCHEMA.PROCESSLIST
WHERE INFO IS NOT NULL
ORDER BY TIME DESC LIMIT 3\G这将给您三个运行时间最长的进程。只是增加限度来揭示更多。如果您真的想要结束这个违规的进程,请查看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;这不会简单地杀死所有与该ID发生的事情,但至少您将确信,它肯定设置为“释放项”或等效状态。
发布于 2011-02-13 11:12:36
您确定终止客户端会扼杀正在运行插入的PHP进程吗?如果它对每个调用使用一个“新”连接,并且依赖某种类型的连接池来提高效率,那么当您杀死当前正在使用的连接时,它可能只是洗牌到池中的下一个可用连接上。
https://dba.stackexchange.com/questions/1193
复制相似问题