So beenden Sie den MySQL-Prozess ordnungsgemäß und sicher

So beenden Sie den MySQL-Prozess ordnungsgemäß und sicher

Vorwort

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.

Abschlussprozess

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 beim Ausführen von Vorgängen an einer nicht transaktionalen Tabelle zwangsweise beendet wird, kann dies zu inkonsistenten Daten zwischen Master und Slave führen.

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 CONNECTION | QUERY mit zwei Optionen:

KILL CONNECTION ist dasselbe wie das Original. Es stoppt die Rollback-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.
Wenn eine KILL-Operation übermittelt wird, wird im Thread ein spezielles Kill-Flag gesetzt. Normalerweise dauert es eine Weile, 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 festgestellt wird, dass es vorhanden ist, wird die Anweisung beendet und die Transaktion zurückgesetzt. Wenn der Vorgang auf einer nicht transaktionalen Tabelle ausgeführt wird, 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 eine MyISAM-Tabelle während REPAIR TABLE oder OPTIMIZE TABLE zerstört wird, wird die Tabelle beschädigt und unbrauchbar. Diese Anleitung hilft Ihnen, die Tabelle wieder 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 die Operation FLUSH LOCKAL TABLES aus, um alle Tabellen-Caches zu aktualisieren und die geöffneten Tabellen zu schließen (die Funktion von LOCAL besteht darin, zu verhindern, dass die Operation in BINLOG aufgezeichnet wird).

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 dazu, wie Sie den MySQL-Prozess elegant und sicher schließen können. Weitere Informationen zum Schließen des MySQL-Prozesses 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)
  • Einige Vorschläge zur Gewährleistung der MySQL-Datensicherheit
  • So fahren Sie eine MySQL-Instanz sicher herunter
  • Details zur MySQL-Sicherheitsverwaltung

<<:  Einige Tipps zur Verwendung von Less in Vue-Projekten

>>:  Detaillierte Konfiguration von Nginx, das sowohl Http als auch Https unterstützt

Artikel empfehlen

Eine kurze Erläuterung der Unterschiede zwischen FTP, FTPS und SFTP

Inhaltsverzeichnis Einführung in FTP, FTPS und SF...

Ubuntu kompiliert Kernelmodule und der Inhalt wird im Systemprotokoll angezeigt

Inhaltsverzeichnis 1.Linux-Anmeldeschnittstelle 2...

CentOS 8 ist jetzt verfügbar

CentOS 8 ist jetzt verfügbar! Die Versionen von C...

Eine audiovisuelle Linux-Distribution, die Audiophile anspricht

Ich bin kürzlich auf das Audiovisual Linux Projec...

Einige Möglichkeiten zum Eliminieren doppelter Zeilen in MySQL

SQL-Anweisung /* Einige Methoden zum Eliminieren ...

So vergleichen Sie zwei Datenbanktabellenstrukturen in MySQL

Während des Entwicklungs- und Debugging-Prozesses...

CSS3 Milchglaseffekt

Wenn der Milchglaseffekt gut gelingt, kann er die...

4 flexible SCSS-Kompilierungsausgabestile

Vielen Leuten wird das Kompilieren erklärt, sobal...

Zwei Möglichkeiten zum Erstellen von Docker-Images

Inhaltsverzeichnis Aktualisieren Sie das Bild von...