Der einfachste Weg, um mysql herunterzufahren, ist das Ausführen
mysqladmin -uroot -p -h127.0.0.1 --protocol=tcp shutdown
Hier ist warum:
Die mysql-Service-Datei ( /etc/init.d/mysql) setzt das Vorhandensein der Socket-Datei voraus. Historisch gesehen verschwindet die Socket-Datei manchmal aus unerklärlichen Gründen. Dies behindert einen Standard service mysql stopbeim Arbeiten.
Es ist nicht genug zu sagen
mysqladmin -uroot -p -h127.0.0.1 shutdown
weil mysqld einen Benutzer dahingehend weiterleitet root@127.0.0.1, root@localhostob TCP / IP nicht explizit aktiviert ist. Standardmäßig mysqld den Weg des geringsten Widerstands wählen und eine Verbindung root@127.0.0.1zu root@localhostüber die Socket - Datei. Wenn jedoch keine Socket-Datei vorhanden ist, root@localhostwird keine Verbindung hergestellt.
Sogar in der MySQL-Dokumentation zu mysqladmin heißt es:
Wenn Sie mysqladmin shutdown ausführen, wenn Sie eine Verbindung zu einem lokalen Server mithilfe einer Unix-Socket-Datei herstellen, wartet mysqladmin, bis die Prozess-ID-Datei des Servers entfernt wurde, um sicherzustellen, dass der Server ordnungsgemäß gestoppt wurde.
Aus diesem Grund muss TCP / IP unbedingt aktiviert werden:
mysqladmin -uroot -p -h127.0.0.1 --protocol=tcp shutdown
Zurück am 30. September 2011 habe ich meine eigene Version von mysqld_multicalled geschrieben mysqlservice(siehe meinen Beitrag: Mehrere Instanzen auf demselben Host ausführen ). Es dient als virtuelle Engine zum Herstellen einer Verbindung zu mysqld über verschiedene Ports. Sie müssen nur Ihre eigenen my.cnfParameter mitbringen . In diesem Skript stelle ich Shutdowns wie folgt aus:
stop() {
${ECHO} -n $"Stopping ${PROGNAME}"
${MYSQLD_STOP}
ATTEMPTS=0
STOPPING_MYSQLD=1
MINUTES_TO_TRY=10
(( TICKS_TO_TRY = MINUTES_TO_TRY*240 ))
while [ ${STOPPING_MYSQLD} -eq 1 ]
do
${ECHO} -n "."
${SLEEP} 0.25
MYSQLD_HAS_BEEN_SHUTDOWN=`${TAIL} ${MYSQL_ERROR_LOG} | ${GREP} -c "Shutdown complete$"`
(( ATTEMPTS++ ))
if [ ${ATTEMPTS} -eq ${TICKS_TO_TRY} ] ; then STOPPING_MYSQLD=0 ; fi
if [ ${MYSQLD_HAS_BEEN_SHUTDOWN} -eq 1 ] ; then STOPPING_MYSQLD=2 ; fi
done
${ECHO}
if [ ${STOPPING_MYSQLD} -eq 2 ]
then
${ECHO} "Stopped ${PROGNAME}"
else
${TAIL} -30 ${MYSQL_ERROR_LOG}
fi
}
Aber was ist ${MYSQLD_STOP}?
MYSQL_CONN="-uroot -p<rootpassword> -P${MYSQLD_PORT} -h127.0.0.1 --protocol=tcp"
MYSQLD_STOP="${MYSQLADMIN} ${MYSQL_CONN} shutdown"
Bitte beachte, dass ich 127.0.0.1einen expliziten Port verwende. Auf diese Weise verlasse ich mich nicht auf eine Socket-Datei.
Ich habe immer mysqladmin --protocol=tcp shtudownals die richtige Alternative zum Herunterfahren von MySQL verwendet, wenn es service mysql stophängt. Tun kill -9auf mysqldund mysqld_safesollte die letzte der letzten der letzten Resorts. (Ja, das habe ich zuletzt dreimal gesagt).
Oft hat mysqld mysql.sock ohne Vorwarnung gelöscht. Dieses Problem hatten im Laufe der Jahre auch andere Menschen:
EPILOG
Das Geheimnis ist wie gesagt: Mit mysqladmin über TCP / IP ( --protocol=tcp) mit mysql verbinden und ausgeben shutdown. Dies hat zu arbeiten , weil das Herunterfahren Privileg in ist mysql.userfür den ausschließlichen Zweck der authentifizierten Abschaltungen. Dies hat meinen Arbeitstag ein paar Mal gespart, als ich in der Lage war, einen Remote-Shutdown von meinem Windows-Computer aus durchzuführen, wenn mysqld auf einem Linux-Server heruntergefahren wurde.
UPDATE 06.03.2013 22:48 EST
Wenn Sie sich Sorgen darüber machen, was während des Herunterfahrens vor sich geht, können Sie die Herunterfahrzeit und die Art und Weise, in der die Daten auf die Festplatte geschrieben werden, ändern, insbesondere, wenn sich viele InnoDB-Daten im Pufferpool befinden
VORSCHLAG # 1
Wenn Sie viele schmutzige Seiten haben, können Sie den Wert für innodb_max_dirty_pages_pct auf 0 senken :
SET GLOBAL innodb_max_dirty_pages_pct = 0;
Stellen Sie dies ca. 15-30 Minuten vor dem Herunterfahren ein. Dadurch erhält mysqld die geringstmögliche Menge an schmutzigen Seiten, die auf die Festplatte geschrieben werden können.
VORSCHLAG # 2
Standardmäßig ist innodb_fast_shutdown 1. Für diese Option gibt es drei Werte
- 0: InnoDB führt vor dem Herunterfahren ein langsames Herunterfahren, eine vollständige Bereinigung und einen Einfügepuffer durch.
- 1: InnoDB überspringt diese Vorgänge beim Herunterfahren. Dieser Vorgang wird als schnelles Herunterfahren bezeichnet.
- 2: InnoDB löscht seine Protokolle und fährt kalt herunter, als ob MySQL abgestürzt wäre. Es gehen keine festgeschriebenen Transaktionen verloren, aber die Wiederherstellung nach einem Absturz führt dazu, dass der nächste Start länger dauert.
Die Dokumentation sagt weiter folgendes:
Das langsame Herunterfahren kann Minuten oder sogar Stunden in extremen Fällen dauern, in denen noch erhebliche Datenmengen gepuffert sind. Verwenden Sie die Slow-Shutdown-Technik, bevor Sie ein Upgrade oder Downgrade zwischen Hauptversionen von MySQL durchführen, damit alle Datendateien vollständig vorbereitet sind, falls der Upgrade-Prozess das Dateiformat aktualisiert.
Verwenden Sie innodb_fast_shutdown = 2 in Notfallsituationen oder zur Fehlerbehebung, um das absolut schnellste Herunterfahren zu erhalten, wenn das Risiko besteht, dass Daten beschädigt werden.
Die Standardeinstellungen für innodb_max_dirty_pages_pct und innodb_fast_shutdown sollten in den meisten Fällen in Ordnung sein.
tmpwatchsie zusammen mit/tmpallen anderen Elementen gelöscht wird, deren Zeitpunkt älter als der konfigurierte Schwellenwert ist.