So fahren Sie eine MySQL-Instanz sicher herunter

So fahren Sie eine MySQL-Instanz sicher herunter

In diesem Artikel wird der Vorgang zum Herunterfahren des mysqld-Prozesses analysiert und wie die MySQL-Instanz sicher und reibungslos heruntergefahren wird. Studenten, denen dieser Vorgang nicht ganz klar ist, können ihn zu Rate ziehen.

Abschlussvorgang:

1. Herunterfahren einleiten und SIGTERM-Signal senden

2. Erstellen Sie bei Bedarf einen Shutdown-Thread

Wenn das Herunterfahren vom Client initiiert wird, wird ein dedizierter Herunterfahr-Thread erstellt

Wenn das SIGTERM-Signal zum Herunterfahren direkt empfangen wird, übernimmt der für die Signalverarbeitung zuständige Thread die Herunterfahrarbeiten, oder es wird hierfür ein neuer unabhängiger Thread erstellt.

Wenn kein separater Shutdown-Thread erstellt werden kann (beispielsweise aufgrund von unzureichendem Arbeitsspeicher), gibt MySQL Server eine Warnmeldung ähnlich der folgenden aus:

Fehler: Es kann kein Thread zum Beenden des Servers erstellt werden.

3. MySQL Server antwortet nicht mehr auf neue Verbindungsanfragen

Schließen Sie die TCP/IP-Netzwerküberwachung, schließen Sie Unix Socket und andere Kanäle

4. Schließen Sie die aktuelle Verbindung und Transaktion schrittweise

Inaktive Verbindungen werden sofort beendet;

Verbindungen, die aktuell Transaktionen und SQL-Aktivitäten aufweisen, werden als beendet markiert und ihr Status wird regelmäßig überprüft, sodass sie bei der nächsten Überprüfung geschlossen werden können (siehe KILL-Syntax).

Wenn eine aktive Transaktion vorhanden ist, wird die Transaktion zurückgesetzt. Wenn in der Transaktion nicht transaktionale Tabellen geändert werden, können die geänderten Daten nicht zurückgesetzt werden und möglicherweise nur ein Teil der Änderung abgeschlossen werden.

Wenn es sich im Master / Slave-Replikationsszenario um den Master handelt, ist die Verarbeitung des Replikationsthreads dieselbe wie die des normalen Threads.

Wenn es sich um einen Slave in einem Master/Slave-Replikationsszenario handelt, werden die IO- und SQL-Threads nacheinander geschlossen. Wenn diese beiden Threads derzeit aktiv sind, werden sie ebenfalls als beendet markiert und dann geschlossen.

Auf dem Slave-Server darf der SQL-Thread den aktuellen SQL-Vorgang direkt stoppen (um Replikationsprobleme zu vermeiden) und dann den Thread schließen.

Wenn sich der SQL-Thread in MySQL 5.0.80 und früheren Versionen mitten in der Ausführung einer Transaktion befindet, wird die Transaktion zurückgesetzt. Ab 5.0.81 wird gewartet, bis alle Vorgänge abgeschlossen sind, sofern der Benutzer keinen KILL-Vorgang initiiert.

Wenn der SQL-Thread des Slaves während der Ausführung von Vorgängen an einer nicht transaktionalen Tabelle zwangsweise beendet wird, kann es zu Dateninkonsistenzen zwischen Master und Slave kommen.

5. Der MySQL-Serverprozess schließt alle Threads und alle Speicher-Engines.

Aktualisieren Sie alle Tabellen-Caches und schließen Sie alle offenen Tabellen.

Jede Speicher-Engine ist für ihre eigenen Shutdown-Operationen verantwortlich. Beispielsweise wird MyISAM alle Operationen, die darauf warten, geschrieben zu werden, leeren; InnoDB wird den Pufferpool auf die Festplatte leeren (ab MySQL 5.0.5, wenn innodb_fast_shutdown nicht auf 2 gesetzt ist), die aktuelle LSN im Tablespace aufzeichnen und dann alle internen Threads schließen.

6. MySQL Server-Prozess wird beendet

Über den KILL-Befehl

Ab 5.0 unterstützt KILL die Angabe von zwei Optionen: CONNECTION | QUERY:

KILL CONNECTION ist dasselbe wie das Original. Es stoppt das Zurücksetzen der Transaktion, schließt die Thread-Verbindung und gibt zugehörige Ressourcen frei.
KILL QUERY stoppt nur die aktuell vom Thread übermittelte Operation und lässt den Rest unverändert.
Nach dem Senden der KILL-Operation wird im Thread ein spezielles Kill-Flag gesetzt. Normalerweise dauert es einige Zeit, bis der Thread tatsächlich beendet wird, da das Kill-Flag nur unter bestimmten Umständen aktiviert wird:

1. Beim Ausführen einer SELECT-Abfrage in einer ORDER BY- oder GROUP BY-Schleife wird nach dem Lesen jedes Zeilenblocks das Kill-Flag überprüft. Wenn es gefunden wird, wird die Anweisung beendet.

2. Bei der Ausführung von ALTER TABLE wird das Kill-Flag nach dem Lesen einiger Zeilenblöcke aus der Originaltabelle überprüft. Wenn es gefunden wird, wird die Anweisung beendet und die temporäre Tabelle gelöscht.

3. Beim Ausführen von UPDATE und DELETE wird das Kill-Flag nach dem Lesen einiger Zeilendatensatzblöcke und dem Aktualisieren oder Löschen überprüft. Wenn es gefunden wird, wird die Anweisung beendet und die Transaktion zurückgesetzt. Wenn der Vorgang auf einer nicht transaktionalen Tabelle erfolgt, werden die geänderten Daten nicht zurückgesetzt.

4. Die Funktion GET_LOCK() gibt NULL zurück;

5. Der INSERT DELAY-Thread fügt dem Speicher schnell neue Datensätze hinzu und wird dann beendet.

6. Wenn der aktuelle Thread eine Sperre auf Tabellenebene hält, wird diese freigegeben und beendet.

7. Wenn der Schreibvorgangsaufruf des Threads auf die Freigabe des Speicherplatzes wartet, wird direkt der Fehler „Speicherplatz voll“ ausgegeben und dann die Operation beendet.

8. Wenn die MyISAM-Tabelle beim Ausführen von REPAIR TABLE oder OPTIMIZE TABLE beendet wird, wird die Tabelle beschädigt und unbrauchbar. Sie können die Anweisungen befolgen, um sie erneut zu reparieren.

Einige Vorschläge zum sicheren Herunterfahren von MySQL

Um den mysqld-Dienstprozess sicher herunterzufahren, wird empfohlen, die folgenden Schritte auszuführen:

0. Verwenden Sie ein Konto mit den höchsten Berechtigungen wie SUPER, ALL usw., um eine Verbindung zu MySQL herzustellen. Am besten verwenden Sie einen Unix-Socket.

1. Setzen Sie in den Versionen 5.0 und höher innodb_fast_shutdown = 1, um ein schnelles Herunterfahren von InnoDB zu ermöglichen (ohne vollständige Bereinigung oder Zusammenführung des Insert-Buffer). Setzen Sie dies nicht, wenn Sie ein Upgrade oder Downgrade der MySQL-Version durchführen.

2. Setzen Sie innodb_max_dirty_pages_pct = 0, damit InnoDB alle schmutzigen Seiten auf die Festplatte schreibt;

3. Setzen Sie max_connections und max_user_connections auf 1, was bedeutet, dass außer der aktuellen Verbindung keine neuen Verbindungen erstellt werden dürfen.

4. Schließen Sie alle inaktiven Threads, d. h. Thread-IDs, deren Status „Ruhezustand“ ist und deren Zeit größer als 1 ist.

5. Führen Sie SHOW PROCESSLIST aus, um zu bestätigen, ob aktive Threads vorhanden sind, insbesondere Threads, die Tabellensperren generieren können, wie z. B. SELECT mit großen Datensätzen, UPDATE mit einem großen Bereich oder DDL-Ausführung. Seien Sie besonders vorsichtig;

6. Führen Sie SHOW ENGINE INNODB STATUS aus, um zu bestätigen, dass der Wert für die Länge der Verlaufsliste niedrig ist (normalerweise weniger als 500), was bedeutet, dass nur wenige nicht gelöschte Transaktionen vorhanden sind. Bestätigen Sie außerdem, dass die Werte für Protokollsequenznummer, Protokoll gelöscht bis und Letzter Prüfpunkt bei gleich sind, was bedeutet, dass alle LSNs geprüft wurden.

7. Führen Sie dann den Vorgang FLUSH LOCKAL TABLES aus, um alle Tabellencaches zu aktualisieren und die geöffneten Tabellen zu schließen (die Funktion von LOCAL besteht darin, zu verhindern, dass BINLOG diesen Vorgang aufzeichnet).

8. Wenn es sich um einen SLAVE-Server handelt, schließen Sie am besten zuerst IO_THREAD, warten Sie, bis alle RELAY LOGs angewendet wurden, und schließen Sie dann SQL_THREAD, um zu vermeiden, dass SQL_THREAD bei der Ausführung einer großen Transaktion beendet wird. Warten Sie geduldig, bis alle angewendet wurden. Wenn Sie das Schließen erzwingen müssen, warten Sie am besten, bis die große Transaktion abgeschlossen ist, bevor Sie SQL_THREAD schließen.

9. Führen Sie abschließend mysqladmin shutdown aus.

10. Im Notfall können Sie innodb_fast_shutdown = 1 festlegen und dann direkt mysqladmin shutdown ausführen oder sogar direkt kill oder kill -9 auf Betriebssystemebene aufrufen, um den mysqld-Prozess zu beenden (einige Transaktionen können verloren gehen, wenn innodb_flush_log_at_trx_commit = 0 ist). Wenn der mysqld-Prozess jedoch erneut gestartet wird, wird CRASH RECOVERY ausgeführt, sodass Sie einen Kompromiss eingehen müssen.

Nach all dem Gerede reicht es unter normalen Umständen aus, mysqladmin shutdown auszuführen. Wenn eine Blockierung auftritt, lesen Sie zur Analyse und Lösung den obigen Inhalt, haha:)

Oben finden Sie Einzelheiten zum sicheren Herunterfahren einer MySQL-Instanz. Weitere Informationen zum Herunterfahren einer MySQL-Instanz finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • Es ist Jahresende, ist Ihr MySQL-Passwort sicher?
  • So fahren Sie MySQL sicher herunter
  • Schnelle und sichere Methode zum Umbenennen einer MySQL-Datenbank (3 Arten)
  • So beenden Sie den MySQL-Prozess ordnungsgemäß und sicher
  • Einige Vorschläge zur Gewährleistung der MySQL-Datensicherheit
  • Details zur MySQL-Sicherheitsverwaltung

<<:  Verschönerung der Dualsystem-Boot-Schnittstelle für Win10 + Ubuntu20.04 LTS

>>:  Tiefgreifendes Verständnis des Ereignisausführungsmechanismus von JavaScript

Artikel empfehlen

Einfache Implementierung von Mini-Vue-Rendering

Inhaltsverzeichnis Vorwort Ziel Erster Schritt: S...

So ändern Sie das Terminal in Ubuntu 18 in eine schöne Eingabeaufforderung

Ich habe VMware und Ubuntu neu installiert, aber ...

Mysql Sql-Anweisungsübungen (50 Fragen)

Tabellenname und Felder –1. Studentenliste Studen...

Methode zur Änderung des MySQL-Kontokennworts (Zusammenfassung)

Vorwort: Bei der täglichen Verwendung der Datenba...

Detaillierte Erläuterung der MySQL-Mehrtabellenabfrage

Die Zeit vergeht immer überraschend schnell, ohne...

Detaillierte Erläuterung des Beispiels der Caching-Methode von Vue

Kürzlich wurde die neue Anforderung „Front-End-Ca...

Beispiel, wie nginx dynamische und statische Trennung implementiert

Inhaltsverzeichnis Stellen Sie nginx auf Server1 ...

MySQL-Operationen: Operationen mit JSON-Datentyp

Im vorherigen Artikel haben wir das ausführliche ...

So passen Sie einen EventEmitter in node.js an

Inhaltsverzeichnis Vorwort 1. Was ist 2. So verwe...

CSS-Positionierungslayout (Position, Positionierungslayoutfähigkeiten)

1. Was ist Positionierung? Das Positionsattribut ...

Vue3-Zeitstempelkonvertierung (ohne Verwendung von Filtern)

Wenn vue2 Zeitstempel konvertiert, verwendet es i...

Einführung in die Installation des Vim-Plugins unter Linux

Inhaltsverzeichnis Installieren Sie den Vim-Plugi...

Bringen Sie Ihnen bei, wie Sie ein React+Antd-Projekt von Grund auf erstellen

Bei den vorherigen Artikeln handelte es sich um m...