Ich möchte mysql genau wie httpd, bei dem Threads vor dem Neustart bereitgestellt werden, ordnungsgemäß neu starten. Ich möchte keine Anfragen brechen.
Jede "angeforderte" Sequenz zum Herunterfahren in MySQL (kurz von kill -9
) ist ein wenig sinnvoll , da laufende Transaktionen (auf Transaktionstabellen) zurückgesetzt werden. Es gibt jedoch einige Möglichkeiten, einen Neustart so sauber wie möglich zu gestalten.
Hinweis: Wenn Sie den Server für ein Upgrade herunterfahren, verwenden Sie diesen Prozess nicht. Befolgen Sie stattdessen den in dieser Antwort beschriebenen Vorgang .
Wenn Sie ansonsten nur einen ansonsten fehlerfreien Server neu starten, um eine schreibgeschützte globale Variable oder ähnliches zu ändern, finden Sie hier einen sinnvollen Pfad:
Aktivieren innodb_fast_shutdown
Sie zunächst , falls dies noch nicht geschehen ist. Dies hängt nicht direkt mit dem ordnungsgemäßen Herunterfahren zusammen, sollte jedoch den Server schneller zurückbringen.
mysql> SHOW VARIABLES LIKE 'innodb_fast_shutdown';
+----------------------+-------+
| Variable_name | Value |
+----------------------+-------+
| innodb_fast_shutdown | 0 |
+----------------------+-------+
1 row in set (0.00 sec)
mysql> SET GLOBAL innodb_fast_shutdown = 1;
Query OK, 0 rows affected (0.01 sec)
Weisen Sie als Nächstes den Server an, alle offenen Tabellen zu schließen, sobald keine aktuell ausgeführten Abfragen auf sie verweisen. Dieser Schritt hat auch nichts mit dem ordnungsgemäßen Herunterfahren zu tun, aber er beschleunigt den nachfolgenden Schritt:
mysql> FLUSH LOCAL TABLES;
Query OK, 0 rows affected (41.12 sec)
Die FLUSH TABLES
Anweisung (mit dem optionalen LOCAL
Schlüsselwort, das ein unnötiges, aber ansonsten harmloses Löschen von Slaves verhindert) wird blockiert und Ihre Eingabeaufforderung wird erst zurückgegeben, wenn alle Tabellen geschlossen werden können. Sobald jede Tabelle "geleert" (geschlossen) wurde und eine Abfrage anschließend auf die Tabelle verweist, wird sie automatisch wieder geöffnet, aber das ist in Ordnung. Was wir mit diesem Schritt erreichen, ist weniger Arbeit für den letzten Schritt:
mysql> FLUSH TABLES WITH READ LOCK;
Query OK, 0 rows affected (13.74 sec)
mysql>
Diese Anweisung löscht alle Tabellen (daher der Vorteil, dass ein Teil davon mit dem vorherigen Schritt weniger störend aus dem Weg geräumt wird) und ruft eine globale (serverweite) Nur-Lese-Sperre für sie ab.
Sie können keine globale Lesesperre haben, bis alle aktuell ausgeführten "Schreib" -Abfragen (dh so ziemlich alles außer SELECT
) abgeschlossen sind. Durch das Ausstellen der Sperranforderung werden vorhandene Abfragen beendet, neue können jedoch nicht gestartet werden.
Ihre Eingabeaufforderung wird erst zurückgegeben, wenn Sie diese globale Sperre aktiviert haben. Daher kann jede Abfrage, die zum Zeitpunkt der Anforderung der Sperre ausgeführt wird, beendet werden, und Sie wissen, dass sie beendet ist, da Sie die Eingabeaufforderung zurückerhalten. Alle nachfolgenden Abfragen, die versuchen, irgendetwas in eine Tabelle zu schreiben, bleiben einfach stehen, ändern keine Daten und warten auf unbestimmte Zeit auf die Sperre, bis ...
UNLOCK TABLES;
)Widerstehen Sie der Versuchung, dies zu beenden.
mysql>
Diese Eingabeaufforderung für die inaktive Konsole enthält die globale Sperre für Sie. Verliere das, verliere das Schloss.
Starten Sie MySQL von einem anderen Konsolenfenster aus wie gewohnt neu, entweder mit Initskripten (z. B. Ihrer lokalen Variante von service mysql.server restart
) oder mysqladmin shutdown
gefolgt von einem manuellen Neustart.
innodb_fast_shutdown = 1
wirklich sicher, dass MySQL schneller startet? In den Dokumenten sieht es so aus, als würde dies die Abschaltgeschwindigkeit verbessern (auf Kosten der Startgeschwindigkeit?).Kurz gesagt, einige der Best Practices, die vor dem Herunterfahren von MySQL beachtet werden sollten, sind:
mysql> STOP SLAVE;
.mysql> SET GLOBAL innodb_max_dirty_pages_pct = 0;
.mysql> SHOW PROCESSLIST;
, töten Sie siemysql> kill thread_id;
oder warten Sie, bis sie beendet sind.mysql> SET GLOBAL innodb_buffer_pool_dump_at_shutdown = ON;
und laden Sie ihn beim Start erneut,# vi /etc/my.cnf innodb_buffer_pool_load_at_startup = ON
um den Pufferpool aufzuwärmen.Nachdem Sie die vorherigen Punkte bestätigt haben, können Sie MySQL sicher neu starten
shell$ service mysql restart
Weitere Details finden Sie in meinem Beitrag. Überprüfen Sie diese, bevor Sie MySQL beenden!
quelle