Starte mysql automatisch neu, wenn es stirbt


15

Ich habe einen Rackspace-Server, den ich gemietet habe, um meine persönlichen Projekte auszuführen. Da ich billig bin, hat es 256 MB RAM und kann ehrlich gesagt nicht viel verarbeiten. Von Zeit zu Zeit, wenn der Datenverkehr stark ansteigt, beschließt der Server, Prozesse zu beenden, und es scheint, dass mysqld ein beliebtes Programm zum Beenden ist. Ich versuche, meine Site zu besuchen, und erhalte die Meldung, dass beim Herstellen der Datenbankverbindung ein Fehler aufgetreten ist. Eine Überprüfung der Protokolle zeigt, dass mysqld aufgrund von Speichermangel getötet wurde.

Da ich immer noch so arm bin wie gestern und den RAM meiner Rackspace-VM nicht aktualisieren möchte, kann ich dann sagen, dass mysqld automatisch neu gestartet werden soll, wenn es abstirbt?

Ich habe den Gedanken, so etwas wie Crontab zu verwenden, aber leider weiß ich auch nicht genau, was ich dort tun soll. Ich schätze, ich bin ein Produkt der Generation "Linux on your desktop", da ich die meisten Aufgaben auf meinem Desktop und Laptop ausführen kann (auf denen Linux fast ausschließlich ausgeführt wird), aber immer noch nicht über ausreichende Serveradministrationsfähigkeiten für Linux verfügen.

Auf dem Server wird CentOS 6.3 ausgeführt


welche Distribution? Ich denke, Emporkömmling würde dies auf Ubuntu tun
Journeyman Geek

Hoppla. Ich habe vergessen, dieses Detail zu erwähnen: CentOS
Los Frijoles

eh. Vielleicht möchten Sie auch die Version aufnehmen
Journeyman Geek

Nicht von der Frage abzulenken, aber vielleicht wäre eine langfristige Lösung, stattdessen die Bedingung zu vermeiden :) Wenn Sie nur ein einfaches, nicht verwaltetes VPS für Ihre persönlichen Projekte wünschen, können Sie möglicherweise einen guten Preis für eine größere Kiste ziehen Ein Anbieter, der sich auf Low-End-Produkte spezialisiert hat. Das habe ich mit großer Zufriedenheit getan. Es gibt viele Orte, an denen Sie solche VPS-Anbieter finden können, z. B. lowendtalk.com.
John Chadwick

Antworten:


16

Dies ist keine saubere Lösung. Es ist offensichtlich besser, das Problem zunächst zu vermeiden. Wie auch immer, ich bin mir nicht sicher, wie CentOS Dienste verwaltet, aber ich denke, es nutzt service. In diesem Fall können Sie überprüfen, ob der mysqlDienst mit ausgeführt wird

/sbin/service mysql status

Dieser Befehl wird erfolgreich beendet, wenn er ausgeführt mysqlwird, und gibt einen Nicht-0-Beendigungsstatus zurück, wenn dies nicht der Fall ist. Sie können den Dienst daher starten, wenn er nicht mit diesem Befehl ausgeführt wird:

/sbin/service mysql status || service mysql start

Sie können diese Zeile hinzufügen /etc/crontab, um den Befehl jede Minute zu starten:

* * * * * /sbin/service mysql status || service mysql start


6

Das ist etwas störend.

mysqld wird immer von mysqld_safe neu gestartet, da sich im unteren Bereich eine Endlosschleife befindetmysqld_safe, um nach abnormalen Herunterfahren zu suchen . Wenn der Fehler zu schwerwiegend ist, kann nicht einmalbei nachfolgenden Versuchenmysqld_safenicht neumysqldgestartet werden.

In dieser Situation mysqld_safeist es möglicherweise keine gute Idee, mysqldden Start zu erzwingen , wenn mysqld_safedies ohnehin abgelehnt wird.

Sie müssen das Fehlerprotokoll in my.cnf finden, in dem es sich befindet

[mysqld]
log-error=log-filename

oder

[mysqld_safe]
log-error=log-filename

Lesen Sie die Textdatei (wahrscheinlich durch Ausführen tail -30 log-filename) und suchen Sie die Quelle der mysqld-Verarbeitung, die heruntergefahren wurde.


Interessant ... in meinem Log steht, dass mysqld neu gestartet wurde, aber dann, ungefähr 1-2 Stunden später, wird angezeigt, dass der Prozess beendet wurde. Danach ist die nächste Aufzeichnung mein manueller Start. Vielleicht habe ich mysqld_safe falsch konfiguriert?
Los Frijoles

3

In einem Brute-Force-Versuch, die Dinge auf einem VPS mit geringem Arbeitsspeicher am Laufen zu halten, habe ich eine Modifikation von terdoms Antwort verwendet , um MySQL zu überprüfen und neu zu starten.

/sbin/service mysqld status || service mysqld restart

Ich brauchte zu ändern , mysqlum mysqldes an die Arbeit zu machen. Ohne würde ich den Fehler " ERROR! MySQL is running but PID file could not be found" bekommen.

Leitet auf meinem CentOS 7.2-System auf /sbin/serviceum /bin/systemctl status, sodass der folgende Befehl schneller ausgeführt werden kann.

/bin/systemctl status  mysqld.service || /bin/systemctl start  mysqld.service

Am Ende habe ich die folgende Zeile zur Root-Crontab des Systems hinzugefügt. Es überprüft jede Minute, ob MySQL ausgeführt wird, und leitet stdout auf null um. Beim Starten des Dienstes wird nichts ausgegeben, es sei denn, ein Fehler tritt auf. Sie müssen die Nullumleitung nicht beim letzten Befehl hinzufügen.

* * * * * /bin/systemctl status mysqld.service > /dev/null || /bin/systemctl start  mysqld.service

Die doppelte Pipe ||bedeutet ORund führt den zweiten Befehl aus, wenn der erste Befehl fehlschlägt. (Gibt einen Exit-Code größer als Null zurück.)

Es ist so, als würde man sagen: "Führe den ersten Befehl aus oder , wenn der erste Befehl aus irgendeinem Grund fehlschlägt, führe den zweiten Befehl aus."

Dies unterscheidet sich vom doppelten kaufmännischen Und-Zeichen, &&das wie das Sprichwort lautet: "Führen Sie den ersten Befehl aus, und führen Sie den zweiten Befehl nur aus, wenn der erste Befehl erfolgreich war."


1

Folgendes kommt von jonnyreeves.co.uk :


Und der Täter ist PHP-FPM! Ein kurzer Blick auf Google ergab, dass ein anderer Wordpress-Kunde an ähnlichen Symptomen leidet. der rat war, die php-fpm pool konfiguration (/etc/php-fpm.d/www.conf) und die pm konfiguration anzupassen. Die Hauptänderung bestand darin, von pm = dynamiczu pm = ondemandmit einem pm.max_childrenWert von 5(basierend auf der Beobachtung von ~ 5% Speicherbelegung pro Worker) zu wechseln . Nach dem Ändern der Konfiguration habe ich alle Dienste neu gestartet und die Speichernutzung überprüft.

service php-fpm restart
service nginx restart
service mariadb restart

Nach dem Neustart war die Speichernutzung erheblich geringer.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.