Vor allem wenn ein neuer Server in Betrieb genommen wird, kann es schnell zu einem Error mit dem SQL-Status HY000 kommen. Oft ist das File-Limit viel zu niedrig eingestellt und es kommt zur Ausgabe von Errcode: 24 "Too many open files". Glücklicherweise lässt sich dieses Problem beheben, was hier anhand eines Servers mit Plesk und Debian 8 gezeigt wird.
Zu viele Anfragen für den MySQL-Server!
Wer auf einen neuen Server umzieht, kommt fast nie um diverse Anpassungen herum. Diverse Konfigurationen sind auf Standard-Werte gesetzt, welche oft nicht ausreichen und sogar zum Totalausfall führen können. Dann hilft nur ein Neustart, bis das Spielchen wieder von vorne los geht.
In dieser Beschreibung gehe ich von einem virtuellen Server mit Plesk 17 und dem Linux-System Debian 8 aus. Natürlich aus aktuellem Anlass, weil das folgend geschilderte Problem erst kürzlich hier auf dem Ahadesign-Server aufgetreten ist.
Schon am ersten Tag waren die gehosteten Websites mehrfach nicht mehr erreichbar. Folgende Fehlermeldung wurde ausgegeben:
ERROR: Plesk\Exception\Database: DB query failed: SQLSTATE[HY000]: General error: 23 Out of resources when opening file '/tmp/#sql_23f_0.MAI' (Errcode: 24 "Too many open files"), query was: DESCRIBE `sessions`
Additionally, an exception has occurred while trying to report this error: Zend_Exception
No entry is registered for key 'translate' (Mysql.php:53)
Ganz offensichtlich also ein Datenbank-Problem. Es konnten nicht genügend Dateien bzw. Datenbank-Aufrufe verarbeitet werden. Eine Katastrophe, schließlich will man nicht ständig den Server überwachen und neu starten.
Leider gibt es keine allgemeine Lösung für alle Server und Systeme. Selbst beim gleichen Linux-Derivat können die Unterschiede je nach Versionsnummer sehr groß sein. Die beschriebene Lösung gilt also nur für das bereits genannte System.
Als Erstes wird also Putty oder ein ähnliches Tool für den Shell-Zugriff als Root auf den Server gestartet.
Nachdem die Verbindung steht, wird das Verzeichnis mit cd /etc/security/ gewechselt und dort die Datei limits.conf mit folgendem Inhalt befüllt:
mysql soft nofile 65535
mysql hard nofile 65535
Diese Werte stellen hier bereits das Maximum dar. Man könnte also auch 100000 eintragen. Am Ende wird der maximale Wert dennoch nicht überschritten. Aus Sicherheitsgründen könnte man eher weniger zuweisen.
Im Anschluss wird der Server mit /etc/init.d/apache2 restart neu gestartet.
Dann geht es nach /etc/systemd/system/ wo mit mkdir -p mysql.service.d ein neuer Ordner erzeugt wird. Dann wird in dem neuen Ordner mit touch limits.conf eine neue Datei erzeugt, welche mit folgendem Inhalt befüllt wird:
[Service]
LimitNOFILE=infinity
Schließlich werden noch folgende Befehle ausgeführt:
systemctl daemon-reload
/etc/init.d/mysql restart
Jetzt können die Limits mit folgendem Befehl noch überprüft werden:
cat /proc/$(cat /var/run/mysqld/mysqld.pid)/limits
Damit sollte alles wie gewünscht funktionieren. Diverse Informationen bezüglich Limits werden angezeigt. Darunter auch max open files, jetzt mit 65536 und nicht wie vorher nur 1024.