Die ursprüngliche Absicht beim Schreiben dieses Skripts besteht darin, dass während der Verwendung von Alibaba Cloud RDS eine Ausnahme in der Datenbank auftritt und eine schnelle Wiederherstellung erforderlich ist. Es gibt viele ähnliche Kill-Skripte im Internet, die alle über mysqladmin implementiert werden. In der Ali-RDS-Umgebung gelten jedoch die folgenden Einschränkungen:
Benutzer, die keine SUPER-Berechtigungen bereitstellen, d. h. Benutzer können nur ihre eigenen Threads beenden
Wenn die Anzahl der Verbindungen stark ansteigt, Externe Benutzer können sich nicht anmelden, einschließlich Konsole
Um die beiden Hauptprobleme am Morgen zu lösen, verwendet dieses Python-Skript Multithreading auf der Datenbankinstanz, um für jeden Benutzer eine Verbindung zu reservieren und die Befehlskonfigurationsdatei zu lesen mysqk.ini in Echtzeit. Es wird festgestellt, dass bei Bedarf die vorhandene Verbindung des entsprechenden Benutzers verwendet wird, um den Thread zu finden, der die Bedingungen in information_schema.processlist erfüllt, und ihn zu beenden.
Hinweis: Dieses Skript wurde im September einmal neu geschrieben (Zweig old_0.5.0) und entspricht einem Thread. Es gibt zu viele Threads für eine Datenbankinstanz immer nicht sehr elegant, deshalb habe ich es auf eine Datenbankinstanz und einen Thread geändert, um die Sitzungen mehrerer Benutzer gleichzeitig aufrechtzuerhalten. Gleichzeitig fügt die neue Version weitere Funktionen hinzu, wie z. B. die Prüfung nach Zeitfenster, das Ein- oder Ausschließen bestimmter Verbindungen, E-Mail-Benachrichtigungen und die Abdeckung von Konfigurationselementen.
Funktionen
Behalten Sie immer eine lange Verbindung über MySQL-Ping bei und verfügen Sie über einen automatischen Neustartmechanismus, um die peinliche Situation zu lösen, wenn keine Verbindung verfügbar ist
Jede Datenbankinstanz hat ihren eigenen Thread um den komplizierten Vorgang zu vermeiden, sich bei einzelnen Benutzern anzumelden, um sie zu töten. Wenn Sie über SUPER-Berechtigungen verfügen, können Sie die Konfiguration auch vereinfachen, um sie kompatibel zu machen
Kann mit Szenarien umgehen, in denen Threads separat beendet werden müssen:
Lang andauernde
Ruhezustand für mehr als N Sekunden Transaktion (im Allgemeinen nicht empfohlen, aber manchmal kann das Beenden die Verbindung schnell für die Verwendung durch den Administrator freigeben)
Schließen Sie einige Threads aus, die nicht beendet werden können, z. B. Binlog-Dump
Threads, die bestimmte Schlüsselwörter enthalten, müssen beendet werden
Wenn ein Thread erscheint, der die Bedingungen erfüllt, wird ein Snapshot der aktuellen Prozessliste, des Engine-Status und des lock_wait erstellt und eine E-Mail gesendet
Es gibt einen Trockenlaufmodus für den Testbetrieb, das heißt, alle Inspektionsprozesse werden ausgeführt, aber kein echter Kill
Unterstützt nur die Ausführung innerhalb des Zeitfensters, wenn man bedenkt, dass einige lange Aufgaben in der Nacht nicht überprüft werden
Passwortverschlüsselung
Schnelle Verwendung
erfordert die Installation der MySQL-Python- und Pycrypto-Bibliotheken durch pip werden nur auf Python 2.7 getestet.
Legen Sie den Benutzernamen und das Passwort für die Verbindung in „settings.py“ fest. Hierbei wird davon ausgegangen, dass die zu prüfenden Authentifizierungsinformationen im gleichen DB-Stapel identisch sind. Der angegebene Benutzer wird für die Anmeldeauthentifizierung und zur Information des Skripts verwendet, welche Benutzer überprüft werden müssen.
Das Passwort muss über prpcryptec.py verschlüsselt werden und der verschlüsselte Schlüssel muss in die Variable KEY_DB_AUTH des Skripts selbst geschrieben werden. (Wenn Sie Angst vor Lecks haben, kompilieren Sie mysqk.py in pyc und führen Sie es aus)
Legen Sie in der Hauptkonfigurationsdatei mysqk.ini die Datenbankadresse fest, die im
überprüft werden muss db_info-Abschnitt, z. B. db01=10.0.
Sie können Optionen zum Beenden von Threads angeben, z. B. db01. [id_db01] verwendet dann standardmäßig die Option von [db_commkill]. Der Abschnitt
db_comconfig legt db_puser als Benutzer mit Berechtigungen fest, der alle Prozesslisten anzeigen kann, und hat
nur in DB_AUTH der Einstellungen angegeben .py. Führen Sie eine Prüfung durch, ohne den abnormalen Thread tatsächlich zu beenden, und stellen Sie sicher, dass dry_run nicht gleich 0 ist.
Los geht's!
Konfigurationselementbeschreibung
mysqk.ini:
mail_config
E-Mail-Benachrichtigungseinstellungen, SMTP-Dienstadresse und Authentifizierungsinformationen.
mail_receiver= Leer setzen, was bedeutet, dass keine E-Mail gesendet wird
db_info
Legen Sie fest, welche Datenbankinstanzen überprüft und gelöscht werden sollen.
Format:
Die hier angezeigten Datenbankinstanzen werden überprüft und können mit ; kommentiert werden, das Skript muss jedoch neu gestartet werden.
db_comconfig
Überprüfen Sie die öffentliche Konfiguration und wirken Sie in Echtzeit.
db_puser: Geben Sie einen Benutzernamen für die Anzeige der Prozessliste an, erforderliche Berechtigungen: PROCESS, Anzeige der information_schema-Bibliothek. Es kann als repräsentativer Benutzer betrachtet werden, der den abnormalen Thread überprüft und das Ergebnis dem Benutzer mit der Berechtigung zum Beenden des Threads zur Verfügung stellt.
run_max_count: Die Anzahl der durchzuführenden Prüfungen, ein globaler Kontrollschalter. Bei jeder Änderung dieses Werts wird die Prüfung neu gestartet, also ein sauberer Start, damit die neu geänderte Konfiguration wirksam wird.
ist 0, was bedeutet, dass das Skript keine Prüfungen durchführt und einfach die Verbindung zur Datenbank aufrechterhält. Die Häufigkeit der Überlebensprüfung wird durch CHECK_CONFIG_INTERVAL × CHECK_PING_MULTI in Settings.py bestimmt.
beträgt 999, was bedeutet, dass der Verbindungsthread konsistent im Hintergrund überprüft wird (es kann jedoch sein, dass keiner vorhanden ist, der die Abbruchbedingungen erfüllt). Die Häufigkeit der Prüfung wird durch CHECK_CONFIG_INTERVAL in Settings.py angegeben.
ein anderer Wert ist, bedeutet dies, dass die Prüfung beendet wird, nachdem die Anzahl der Prüfungen erreicht ist. dry_run: Ob der Testlauf aktiviert werden soll Modus, 0 bedeutet echten Kill, 1 oder ein anderer Wert bedeutet Probelauf. Der Testlaufmodus kann zur Überwachung und Warnung bei langsamen Abfragen verwendet werden. Beachten Sie, dass dieselbe Sitzungs-Thread-ID nur einmaleine Warnung auslöst
run_time_window: Das Zeitfenster der laufenden Prüfung. Das Format ist 08:00–22:00 Uhr. Außerhalb dieser Zeit wird keine Prüfung ausgeführt. Wenn Sie das Feld leer lassen, gibt es keine Begrenzung. Die Hauptüberlegung besteht darin, dass bei einigen statistischen Aufgaben nachts „abnormale“ Threads auftreten können.
db_commkill
kill nutzt die öffentliche Konfiguration, wird in Echtzeit wirksam und wird durch die Optionen im Abschnitt id_
k_user: Eine sehr wichtige Option, die angibt, welche Datenbankbenutzer Sie überprüfen und löschen möchten. Mehrere werden durch Kommas (ohne Anführungszeichen) getrennt. Wenn
all ist, bedeutet dies, dass alle von DB_AUTH in Settings.py angegebenen Benutzer überprüft werden. Wenn
none ist, bedeutet dies, dass keine abnormalen Threads beendet werden 🎜>
k_longtime: Eine SQL-Ausführung, die den eingestellten Wert überschreitet, wird als abnormal angesehen. Im Allgemeinen größer als CHECK_CONFIG_INTERVALk_sleep: Wenn die SQL-Anweisung länger als die eingestellten Sekunden schläft, gilt sie als abnormal. Wenn sie 0 ist, bedeutet dies, dass der Thread im Ruhezustand nicht beendet wird 🎜>k_exclude: Threads mit bestimmten Schlüsselwörtern ausschließen, z. B. Threads kopieren, Administratorverbindungen usw. k_include: Threads, die diese spezifischen Schlüsselwörter enthalten, müssen beendet werden. Beachten Sie, dass dies unter der Voraussetzung funktioniert, dass k_user und k_exclude erfüllt sind.Die Werte von k_exclude und k_include liegen im regulären Format vor, das das Python-Re-Modul unterstützt.
id_dbid