我注意到我有异常大量的mysqld
进程,这些进程具有各种 mysql 查询;我已经重新启动mysqld
,所有这些进程都在 10 秒内恢复。
我知道进程是使用 php 生成的;但不知道如何跟踪。如何做到这一点?
答案1
除非您正在运行多个数据库实例,否则您应该只运行一个 mysqld 进程。
答案2
从 CLI 客户端或 phpmyadmin 或您最喜欢的 mysql 工具运行下一个查询:
SELECT `USER`,
`HOST`,
`DB`,
`COMMAND`,
`TIME`,
`STATE`,
LEFT(`INFO`, 51200) AS `Info`
FROM `information_schema`.`PROCESSLIST`;
然后你会看到谁锁定了你的数据库。当然,我确信你的数据库中至少有一个索引被破坏了,必须重建。你必须运行数据库分析/修复来修复你的问题:
REPAIR TABLE database.table;
答案3
lsof
为了回答我自己的问题,这是我发现的;它在很大程度上取决于您的环境,并且涉及和的使用strace
。
您需要找到请求的进程 ID(使用lsof
或netstat
Linux 中的任何其他网络工具)。找到后,您需要父进程 ID,您可以通过 获取ps
。然后,您需要使用以下命令跟踪该 PPID:strace -f -tt -T -s 10000 -p <PPID> -o ~/out.strace
。
另一种方法更高级,涉及使用/proc/
。您还必须使用获取连接的 PPID lsof
。然后您将执行ls -la /proc/<ppid>/fd/
并 grep socket:[*number*]
。然后您将对lsof
所有数字s 然后是strace
所有来自这些的 pid数字秒。