Viele NULL-Prozesse in MySQL

Viele NULL-Prozesse in MySQL

Seit letzter Woche ist meine Website ohne besonderen Grund drastisch langsamer geworden. Ich habe mich bei MySQL angemeldet und „show processlist“ ausgeführt, was ungefähr Folgendes ergab:

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)

Wenn ich MySQL neu starte, habe ich keine Prozesse, was zu erwarten war. Wenn ich meine Website aktualisiere und die Prozesse schnell überprüfe, sehe ich einige Abfragen, die nach einem Moment verschwinden. Alles ist perfekt, aber dann bekomme ich nach einiger Zeit aus heiterem Himmel wieder viele Prozesse, wie oben gezeigt. Dies friert natürlich meine Website ein.

Sie scheinen nach einiger Zeit, aber vor dem Wert, zu verschwinden wait_timeoutund dann nach einiger Zeit mit anderen IDs wieder aufzutauchen.

Hat jemand eine Ahnung, was die Ursache sein könnte?

Die Spezifikationen meines Servers:
CentOS 5
MySQL-Version: 5.1.33-log Quellverteilung
RAM 8 GB

Teil von 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

Ich hoffe, dass das einem von euch hilft, mich in die richtige Richtung zu weisen. Mir gehen die Ideen aus.

BEARBEITEN Das Ganze scheint für diese MySQL-Fehler relevant zu sein:
http://bugs.mysql.com/bug.php?id=8945
http://bugs.mysql.com/bug.php?id=6070
Leider sind sie nicht gelöst :(

Antwort1

Überprüfen Sie die Werte Ihres MySQL-Servers. Verwenden Sie Standardbenutzer in MySQL? Ich würde mir auch zwei Dinge ansehen:

  1. Stellen Sie sicher, dass nur bestimmte Server eine Verbindung zur MySQL-Datenbank herstellen können. Wenn Sie einen Benutzer haben, der sich von % aus anmeldet, stellen Sie sicher, dass Sie ein gutes Passwort haben (und einen guten Grund dafür).

  2. Stellen Sie sicher, dass niemand Anfragen an Ihre Anwendung sendet, die nicht den Codeanforderungen entsprechen, die Sie zum Ausführen der Anwendung festgelegt haben. Es kann sein, dass jemand Daten in Ihre Datenbank einfügt, ohne Ihre Site überhaupt zu besuchen.

Behalten Sie Ihre aktiven Verbindungen eine Zeit lang im Auge, indem Sie netstat genau beobachten. Das wait_timeout ist ein Hinweis darauf, dass jemand/etwas Ihren Server abgefragt hat. Wenn Sie dies genau im Auge behalten, können Sie herausfinden, wer diese Personen sind. Wenn Sie dies getan haben und sie schnell blockieren müssen, ohne drastische Änderungen vorzunehmen, verwenden Sie iptables.

Eine letzte Sache... aktivieren Sie kurz die MySQL-Protokollierung. Ihr Server wird einen Schlag erleidenAberSie werden genau sehen, was mit MySQL passiert.

Bearbeiten Sie die Datei my.cnf und fügen Sie Folgendes hinzu (oder aktualisieren Sie es):

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

BEARBEITEN: Ich habe die vorhergehenden Vorschläge gemacht, weil der NULL-Wert im Infofeld anzeigt, dass keine Anweisungen ausgeführt werden.

verwandte Informationen