Grade eben wollte ich unsere Webserver auf einen externen MySQL Datenbank-Server umstellen und musste feststellen das irgendetwas nicht funktioniert. Ein vorab Test zeigte eindeutig das die auf den Webservern gelagerten Scripte tadellos mit dem externen Datenbankserver zusammenarbeiten. Beim Live-schalten dann aber der Schock! Nix geht, kein Zugriff auf den Datenbankserver. Wüst in den configs gesucht und festgestellt das die Verbindungsdaten stimmen, ebenso läuft auch MySQL auf dem DB-Server. Ganz verschwommen konnte ich mich an etwas wie “max connections” im zusammenhang mit MySQL erinnern… und tatsächlich, Server war auf 100 Verbindungen maximal eingestellt, die natürlich sofort beim umschalten überschritten wurden.
Folgendes um das Problem mit “Too many connections” zu beheben:
um den Fehler auf die schnelle zu beheben ohne den Server oder den MySQL Service neustarten zu müssen greifen wir
via SSH auf den server zu:
ssh root@212.145.166.78
Passwort für root eingeben:
root@212.145.166.78’s password:
max_connection bei mysqld ist so konzipiert das es +1 erlaubt, soll heissen die maximal erlaubten Verbindungen und noch eine mehr, diese aber nur für einen Benutzer mit “Superrechten”, z.B. root.
als root mit MySQL verbinden:
mysql -u root -p
Passwort eingeben:
Enter password:
Nun sind wir mit MySQL verbunden und sehen eine Willkommensmeldung:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1773
Server version: 5.0.45 Source distribution
Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the buffer.
mysql>
wir suchen die Tabelle die die maximalen Verbindungen bestimmt:
SHOW VARIABLES LIKE ‘max_connections’;
und bekommen diese Ausgabe:
+————————–+———+
| Variable_name | Value |
+————————–+———+
| max_connections | 100 |
+————————–+———+
1 row in set (0.00 sec)
ok, hier liegt der Hund begraben, 100 Verbindungen maximal.
maximal Verbindungen hochsetzen:
SET GLOBAL max_connections=1000;
damit ist der Wert hochgesetzt.
Befehl zur Ausgabe nochmal ausführen:
SHOW VARIABLES LIKE ‘max_connections’;
und sehen jetzt:
+————————–+———+
| Variable_name | Value |
+————————–+———+
| max_connections | 1000 |
+————————–+———+
1 row in set (0.00 sec)
also hat das schonmal funktioniert.
Wir trennen uns von MySQL:
exit
Um aber sicherzustellen das bei einem reboot des Servers oder neustarten des MySQL Service der max_connections Wert auch wieder bei 1000 liegt sollte man die “my.cnf” bearbeiten. Normal unter “/etc/my.cnf” aber
wir suchen die my.cnf
locate my.cnf
und finden sie tatsächlich unter “/etc/my.cnf”
Also rufen wir sie mit vim auf um den entsprechenden Eintrag zu machen.
my.cnf editieren
vi /etc/my.cnf
Was dort jetzt drin steht kann je nach Installation variieren, sicher ist aber das wir
unterhalb von:
[mysqld]
folgendes eintragen:
max_connections=1000
das sollte dann in etwa so aussehen:
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
max_connections=1000
…
…
Somit ist der Wert der zulässigen und gleichzeitigen Verbindungen auf 1000 hoch gesetzt. Temporär und auch für den nächsten Start.
Beachten sollte man noch evtl. das die Verbindungen die MySQL maximal unterstützen kann, von der Qualität der Thread-Bibliothek auf einer gegebenen Plattform abhängen. Linux oder Solaris müssten 500 bis 1.000 gleichzeitige Verbindungen dulden können, je nachdem, wie viel Arbeitsspeicher Sie haben und was Ihre Clients tun. Statische Linux-Binaries von MySQL AB können bis zu 4.000 Verbindungen unterstützen.