MySQL 中存在大量 NULL 进程

MySQL 中存在大量 NULL 进程

从上周开始,我的网站无缘无故地开始大幅变慢。我登录 MySQL 并运行 show processlist,结果如下:

mysql> show full processlist;
+------+------+-----------+---------+---------+------+-------+------------------+
| Id   | User | Host      | db      | Command | Time | State | Info             |
+------+------+-----------+---------+---------+------+-------+------------------+
| 2047 | web  | localhost | myDB    | Sleep   |   81 |       | NULL             |
| 2049 | web  | localhost | myDB    | Sleep   |   81 |       | NULL             |
| 2050 | web  | localhost | myDB    | Sleep   |   81 |       | NULL             |
| 2052 | web  | localhost | myDB    | Sleep   |   81 |       | NULL             |
| 2053 | web  | localhost | myDB    | Sleep   |   81 |       | NULL             |
| 2054 | web  | localhost | myDB    | Sleep   |   81 |       | NULL             |
| 2055 | web  | localhost | myDB    | Sleep   |   81 |       | NULL             |
...
| 2066 | web  | localhost | myDB    | Sleep   |   80 |       | NULL             |
| 2067 | web  | localhost | myDB    | Sleep   |   80 |       | NULL             |
| 2178 | web  | localhost | myDB    | Sleep   |   76 |       | NULL             |
+------+------+-----------+---------+---------+------+-------+------------------+
131 rows in set (0.00 sec)

当我重启 MySQL 时,没有任何进程,这是意料之中的。当我刷新我的网站并快速检查进程时,我可以看到一些查询在片刻后消失了。一切都很完美,但过了一段时间,我又突然得到了很多如上所示的进程。这当然会冻结我的网站。

它们似乎在一段时间后消失,但在值之前wait_timeout,然后在一段时间后以不同的 ID 再次出现。

有人知道这可能是什么原因造成的吗?

我的服务器规格:
CentOS 5
MySQL 版本:5.1.33-log 源分布
RAM 8GB

my.cnf 的一部分

[mysqld]
default-character-set   = utf8
character_set_server    = utf8
default-collation       = utf8_unicode_ci
collation_server        = utf8_unicode_ci
ft_min_word_len         = 3
port                    = 5689
socket                  = /tmp/mysql.sock
skip-locking
skip-name-resolve
key_buffer_size         = 256M
group_concat_max_len    = 2048
max_allowed_packet      = 10M
table_cache             = 512
table_definition_cache  = 512
sort_buffer_size        = 10M
net_buffer_length       = 8K
read_buffer_size        = 40M
read_rnd_buffer_size    = 10M
myisam_sort_buffer_size = 8M
long_query_time         = 1
net_read_timeout        = 30
net_write_timeout       = 60
log_slow_queries        = /var/log/slowqueries
query_cache_type        = 1
query_cache_limit       = 5MB
query_cache_size        = 134217728
max_heap_table_size     = 24MB
tmp_table_size          = 24MB
expire_logs_days        = 99
max_connections         = 500
init-connect            = 'SET NAMES latin1'
thread_cache_size       = 4
wait_timeout            = 600

我希望这能帮助你们中的一个人给我指明正确的方向。我没有主意了。

编辑整个事情似乎与那些 MySQL 错误有关:
http://bugs.mysql.com/bug.php?id=8945
http://bugs.mysql.com/bug.php?id=6070
不幸的是,问题还没有解决 :(

答案1

检查 mysql 服务器的值。您在 mysql 中使用默认用户吗?我还想看看两件事:

  1. 确保只有特定服务器才能连接到 mysql 数据库。如果您有从 % 连接的用户,请确保您有一个好的密码(并且有充分的理由)。

  2. 确保没有人向您的应用程序发送超出您运行应用程序的代码要求的查询。有人甚至可能在未访问您的网站的情况下将数据注入您的数据库。

通过密切关注 netstat 来跟踪您的活动连接一段时间。wait_timeout 表示某人/某物已查询您的服务器。密切跟踪将帮助您发现他们是谁。一旦您这样做,如果您需要快速阻止他​​们而不进行重大更改,请使用 iptables。

最后一件事...短暂启用 mysql 日志记录。你的服务器将受到打击您将清楚地看到 mysql 发生的情况。

编辑 my.cnf 文件并添加(或更新)以下内容:

log             = /var/log/mysql/mysql.log

编辑:我提出了上述建议,因为信息字段中的 NULL 值表示没有执行任何语句。

相关内容