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 stop
beim 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@localhost
ob TCP / IP nicht explizit aktiviert ist. Standardmäßig mysqld den Weg des geringsten Widerstands wählen und eine Verbindung root@127.0.0.1
zu root@localhost
über die Socket - Datei. Wenn jedoch keine Socket-Datei vorhanden ist, root@localhost
wird 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_multi
called 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.cnf
Parameter 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.1
einen expliziten Port verwende. Auf diese Weise verlasse ich mich nicht auf eine Socket-Datei.
Ich habe immer mysqladmin --protocol=tcp shtudown
als die richtige Alternative zum Herunterfahren von MySQL verwendet, wenn es service mysql stop
hängt. Tun kill -9
auf mysqld
und mysqld_safe
sollte 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.user
fü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.
tmpwatch
sie zusammen mit/tmp
allen anderen Elementen gelöscht wird, deren Zeitpunkt älter als der konfigurierte Schwellenwert ist.