Heim > Datenbank > MySQL-Tutorial > Zeichnen Sie das MySQL-Snapshot-Skript für langsame Abfragen automatisch auf

Zeichnen Sie das MySQL-Snapshot-Skript für langsame Abfragen automatisch auf

高洛峰
Freigeben: 2016-11-21 14:47:17
Original
1205 Leute haben es durchsucht

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: =, dbid ist der einzige, der die Datenbankinstanz darstellt. Legen Sie später die Optionen für jede zu löschende Datenbank fest. Der Konfigurationsname dieses Abschnitts ist id_;

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 einmal

eine 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_ überschrieben.

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_INTERVAL

k_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

Die Konfigurationselemente in diesem Bereich sind Entspricht db_commconfig und wird zum Beenden einzelner Datenbankoptionen verwendet.

Verwendungsvorschläge

Zwei Kombinationsmodi:

Setzen Sie dry_run=0, Standard k_user=none. Wenn in der Datenbank eine Ausnahme auftritt, ändern Sie aktiv den entsprechenden k_user-Wert db, dynamisch töten

Setzen Sie dry_run=1, der Standardwert ist k_user=all, was der Ausführung im Daemon-Modus entspricht. Wenn eine langsame Abfrage vorliegt, werden Sie per E-Mail benachrichtigt und erhalten die entsprechenden Informationen Die Zeit wird aufgezeichnet

Natürlich können Sie auch „dry_run=0“ und „k_user=all“ verwenden, wodurch das Programm im Hintergrund ausgeführt und beendet werden kann. Dies wird jedoch in Produktionsumgebungen dringend empfohlen.

Es stehen Protokolle und Snapshot-Dateien zur Ansicht zur Verfügung.

Beispiel für eine Konfigurationsdatei

mysqlk.ini:

[mail_config]mail_host=smtp.exmail.qq.commail_user=xxx@ecqun.commail_pass=xxxxxxmail_receiver=[db_info]crm0 Wie oft wurde diese Konfigurationsdatei geändert? 0: Alle Kills deaktivieren; 999: Threads, die die Kill-Bedingungen erfüllen, können nicht inheritrun_max_count=999dry_run=1 sein

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage