Gibt es einen angemessenen oder sicheren Neustart für MySQL wie für Apache httpd?

29

Ich möchte mysql genau wie httpd, bei dem Threads vor dem Neustart bereitgestellt werden, ordnungsgemäß neu starten. Ich möchte keine Anfragen brechen.

giorgio79
quelle

Antworten:

37

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_shutdownSie 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 TABLESAnweisung (mit dem optionalen LOCALSchlü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 ...

  • du änderst deine Meinung über den Neustart und hebst die Sperre manuell auf ( UNLOCK TABLES;)
  • Sie starten den Server neu oder
  • Sie haben den Befehlszeilen-Client versehentlich oder absichtlich von diesem Thread getrennt (tun Sie das also nicht). Lass dieses Fenster in Verbindung und sitze an der mysql-Eingabeaufforderung:

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 shutdowngefolgt von einem manuellen Neustart.

Michael - sqlbot
quelle
Stellt die Verwendung innodb_fast_shutdown = 1wirklich sicher, dass MySQL schneller startet? In den Dokumenten sieht es so aus, als würde dies die Abschaltgeschwindigkeit verbessern (auf Kosten der Startgeschwindigkeit?).
Chris
@Chris die Idee ist, dass es hilft sicherzustellen, dass das gesamte Herunterfahren + Starten so schnell wie möglich ist, aber es ist etwas anekdotisch, da der Umfang der zu erledigenden Arbeit theoretisch der gleiche ist - nur auf die andere Seite der Sequenz verschoben - noch Aus irgendeinem Grund schien es im Allgemeinen immer schneller zu sein, als wenn es beim Herunterfahren zu Ineffizienzen gekommen wäre, die es beim Start nicht gab. Schwer zu sagen.
Michael - sqlbot
2

Kurz gesagt, einige der Best Practices, die vor dem Herunterfahren von MySQL beachtet werden sollten, sind:

  1. Bestätigen Sie die Instanz, die Sie herunterfahren möchten, um ein versehentliches Stoppen einer anderen Instanz zu vermeiden.
  2. Beenden Sie die Replikation, wenn Sie einen Slave herunterfahren möchten mysql> STOP SLAVE;.
  3. Spülen Sie die verschmutzten Seiten im Voraus, um die Ausschaltzeit zu verkürzen mysql> SET GLOBAL innodb_max_dirty_pages_pct = 0;.
  4. Überprüfen Sie die lang laufenden Abfragen mysql> SHOW PROCESSLIST;, töten Sie sie mysql> kill thread_id;oder warten Sie, bis sie beendet sind.
  5. Sichern Sie den Pufferpool beim Herunterfahren 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!

Moll
quelle
Warum wurde das abgelehnt? Ich weiß nicht genug, um zu erkennen, welche Befehle schlecht sind, aber ich möchte es wissen, damit ich sie vermeiden kann.
Jon
Ich weiß nicht, ob eines der oben genannten Befehle schlecht ist. Ich folge den obigen Schritten und so viele Leute tun es. Nur Schritt 4 sollte mit Vorsicht ausgeführt werden. Sie sollten keine Abfrage beenden, bis Sie sicher sind, was Sie tun. Andernfalls warten Sie, bis die langen Abfragen abgeschlossen sind. Probieren Sie es aus und wenn es Ihnen geholfen hat, stimmen Sie es ab, wenn nicht, stimmen Sie ab!
Moll