【问题标题】:mysql process keeps alive - why?mysql进程保持活动状态 - 为什么?
【发布时间】:2018-05-02 23:10:49
【问题描述】:

我遇到了 mysql 进程保持活动状态的问题。

显示进程列表; 返回进程列表。存在几个小时的进程 - 根据进程 ID、主机(端口)。

看起来进程执行查询(SELECT)而不是休眠,再次执行查询 - 并且它再次发生。 PROCESSLIST 中显示的“时间”会在每次睡眠后不断重置。

如何让Mysql自动杀掉这样的进程?我想这样的进程在 PHP 脚本超时后仍然存在(它还执行 CURL 任务)。

[编辑 - 回答 cmets]

查询: SELECT COUNT(*) FROM keywords WHERE updated < '2018-05-03 00:00:00' AND status = '0' AND active = '1;

列:更新的 (DATETIME)、状态 (INT) 和活动的 (BOOL) 是 INDEXED。

“关键字”表中有大约 12 万条记录。

我的 PHP 脚本正在通过 PDO 连接到 MySQL。

我还设置了以下变量:

interactive_timeout = 180 wait_timeout = 180

【问题讨论】:

  • 你可以杀死他们 stackoverflow.com/questions/20048017/… 或者你可以修复它们.. 你的电话
  • 我每天都在杀死这些进程......我应该修复什么?查询(我的意思是列)已正确编入索引。我还应该尝试做什么?
  • 这里可能有一些有用的信息:stackoverflow.com/questions/2407732/…
  • 查询内容是什么?什么是数据库结构?查询的概况是什么?你真的没有提供足够的信息来猜测解决方案。
  • 是否使用持久连接连接到您的数据库?

标签: php mysql pdo process


【解决方案1】:

您所描述的行为仅适用于persistent connections。持久连接允许 PHP 在凭据匹配时重新使用以前的数据库连接。虽然有downsides,但持久连接不一定是坏事,也没有必要手动杀死它们。

如果要禁用持久连接,则必须在代码中找到初始化数据库连接的位置。它应该看起来像这样:

<?php
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass, array(
    PDO::ATTR_PERSISTENT => true
));
?>

找到它后,删除 PDO::ATTR_PERSISTENT 选项或将其设置为 false:

<?php
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass, array(
    PDO::ATTR_PERSISTENT => false
));
?>

禁用持久连接后,数据库会话将无法在 PHP 脚本退出后继续存在。如docs所述:

连接在该 PDO 对象的生命周期内保持活动。到 关闭连接,您需要销毁对象,确保 对它的所有剩余引用都将被删除——你可以通过分配 保存对象的变量为 NULL。如果你不这样做 明确地,PHP 将自动关闭连接,当您 脚本结束

【讨论】:

  • 感谢您的回答。我尝试添加禁用持久连接的选项,但没有任何结果。持久查询仍然出现“吃掉”所有可用的 CPU。其实和添加选项前的情况相比并没有什么变化。
猜你喜欢
  • 1970-01-01
  • 2012-03-09
  • 1970-01-01
  • 2022-01-10
  • 1970-01-01
  • 2019-05-13
  • 1970-01-01
  • 2018-12-26
相关资源
最近更新 更多