
Ich habe einen MySQL Server der recht gut ausgelastet ist und hauptsächlich MyISAM Tabellen beherbergt. Der Server lief mit 8GB RAM und die Summe der MyISAM Keys überschreitet langsam die 20GB Grenze. Deshalb wollte ich ihn auf 24GB RAM aufrüsten. Das Hardware Update lief problemlos und bereits 2 Stunden nach der Mail an Hetzner lief der Server wieder und jetzt mit 24GB Arbeitsspeicher. Als nächstes passte ich also die MySQL System Variable key_buffer/key_buffer_size an um vom neuen RAM zu profitieren. Leider nutze der MySQL Server den neuen RAM nicht aus und der key_buffer bliebt bei ca. 4GB stehen. Ich dachte mir das es hier wohl ein eingebautes Limit vom MySQL Server gibt, aber hatte gerade keine Zeit mich darum zu kümmern und da man RAM ja nicht gern verschwendet, wollte ich ihn anderen Anwendungen zur Verfügung stellen. Ich setze ihn also auf 6GB und startete den MySQL Server neu. Eine Stunde später ging dann gar nichts mehr. Der MySQL Server stürzte ab und nahm dabei eine Vielzahl an Tabellen mit sich. Im Errorlog erschienen sehr seltsame Fehler, die mir gänzlich unbekannt waren.
Einige Tabellen waren so groß das die Reparatur Probleme machte und kurz nachdem alles wieder lief stürzte der Server wieder ab und alles begann von vorn. Ich habe dann den Arbeitsspeicher getestet, das Filesystem/die Platten überprüft, versucht Backups einzuspielen die alle das gleiche Problem hatten und und und… Bis ich dann einen Ausweichserver einrichten wollte auf dem plötzlich alles ohne Probleme lief. Trotzdem hat es noch eine Weile gedauert bis ich wieder zurück zum Anfang gekommen bin und die System Variable angefasst habe… Problematisch war das es ohne Probleme für 3 Tage lief als ich dem Server noch 19GB zugewiesen hatte und damit nicht an ein Problem an dieser Stelle gedacht habe.
Fazit
Debian Lenny installiert aktuell MySQL 5.0.51. Diese MySQL Version hat ein Limit von 4GB für die key_buffer Größe. Setzt man die Variable trotzdem höher stürzt der MySQL Server ab, zerstört Tabellen und behindert einen bei der Reparatur dieser mit myisamchk. Das alles wäre zu vermeiden gewesen wenn ich mal ins Manual geguckt hätte. Dort steht nämlich ganz genau das erst ab 5.0.52 mehr als 4GB auf 64Bit Systemen erlaubt sind. Was lernt man daraus? Wenn man an System Variablen rum schraubt, immer ins Manual gucken. Veränderungen an einem laufenden System genau dokumentieren und wenn nötig zu einem früheren, funktionierenden Stand zurück kehren.
Wie kann man den key_buffer nun doch auf über 4GB setzen?
Ein Update auf Squeeze hilft, da dort die Version 5.1.49 enthalten ist. Eine andere Lösung ist einen lenny-backport zu benutzen, ein eigenes MySQL Paket oder ein dotdeb.org Paket. Mit einer neueren MySQL Version kann man dann auch einen größeren key_buffer einsetzen.