MySQL verwendet Ereignisse, um geplante Aufgaben abzuschließen

MySQL verwendet Ereignisse, um geplante Aufgaben abzuschließen

Ereignisse können die Ausführung von SQL-Code einmalig oder in bestimmten Zeitabständen festlegen. Normalerweise werden komplexe SQL-Anweisungen mithilfe gespeicherter Prozeduren gekapselt und dann werden die gespeicherten Prozeduren regelmäßig aufgerufen, um bestimmte Aufgaben abzuschließen.

Für Ereignisse ist keine Serververbindung erforderlich, sondern sie werden über einen separaten Ereignisplanungs-Thread initialisiert. Ereignisse haben keine Eingabeparameter und keine Rückgabewerte, denn ohne Verbindung gibt es keine Eingabe oder Ausgabe. Nach der Aktivierung können Sie die ausgeführten Anweisungen über das Serverprotokoll anzeigen, es ist jedoch schwierig herauszufinden, von welchem ​​konkreten Ereignis sie stammen. Sie können auch die Tabelle INFORMATION_SCHEMA.EVENTS abfragen, um den Status eines Ereignisses zu erfahren, beispielsweise den Zeitpunkt seiner letzten Ausführung.

Ähnlich wie bei gespeicherten Prozeduren müssen auch bei Ereignissen ähnliche Aspekte berücksichtigt werden. Erstens verursachen Ereignisse zusätzliche Arbeit für den MySQL-Server. Obwohl das Ereignis selbst nur eine geringe Nutzlast aufweist, können die vom Ereignis aufgerufenen SQL-Anweisungen erhebliche Auswirkungen auf die Leistung haben. Darüber hinaus treten bei Ereignissen dieselben Probleme auf wie bei gespeicherten Prozeduren, die durch die anweisungsbasierte Replikation verursacht werden. Gute Anwendungsgebiete für Ereignisse sind Aufgaben wie etwa regelmäßige Wartungsaufgaben, das Neuaufbauen von Caches, die Erstellung von Datenstatistiken und das Speichern von Statuswerten zur Überwachung und Diagnose.

Das folgende Beispiel erstellt ein Ereignis, das eine gespeicherte Prozedur aufruft, um jede Woche eine Tabellenoptimierung für eine angegebene Datenbank auszuführen:

EREIGNIS ERSTELLEN optimize_somedb PLANMÄSSIG JEDE WOCHE
TUN 
Rufen Sie optimize_tables('somedb') auf;

Sie können angeben, ob das Ereignis wiederholt werden soll. In manchen Fällen ist das in Ordnung, in anderen jedoch nicht. Anhand des obigen Beispiels möchten Sie möglicherweise den Befehl OPTIMIZE TABLE auf allen Replikaten ausführen. Es muss jedoch beachtet werden, dass die Leistung des gesamten Servers beeinträchtigt wird, wenn alle Replikate diesen Vorgang gleichzeitig ausführen (z. B. durch Sperren der Tabelle). Darüber hinaus kann die Ausführung periodischer Ereignisse viel Zeit in Anspruch nehmen und es ist sogar möglich, dass ein neues Ereignis ausgeführt wird, bevor das nächste Ereignis abgeschlossen ist. MySQL kann diese Situation nicht verhindern, daher müssen Sie Ihren eigenen Code schreiben, um den gegenseitigen Ausschluss derselben Aufgaben zu implementieren. Dies kann durch die Verwendung von Sperren erreicht werden:

EREIGNIS ERSTELLEN optimize_somedb PLANMÄSSIG JEDE WOCHE
TUN 
BEGINNEN
	DECLARE CONTINUE HANDLER FÜR SQLEXCEPTION
  	ANFANG ENDE;
  WENN GET_LOCK('somedb', 0) DANN
  	Rufen Sie optimize_tables('some_db') auf;
  ENDE, WENN;
  Machen Sie RELEASE_LOCK('somedb');
ENDE

Der scheinbar „redundante“ Continue-Handler stellt sicher, dass die Sperre auch dann aufgehoben wird, wenn eine Ausnahme auftritt.

Obwohl Ereignisse nichts mit Verbindungen zu tun haben, haben sie doch mit Threads zu tun. Der MySQL-Server verfügt über einen Hauptthread zur Ereignisverteilung, der in der Serverkonfiguration aktiviert werden kann:

SETZE GLOBAL event_handler := 1;

Sobald dieser Thread aktiviert ist, führt er die im Scheduler angegebenen Ereignisse aus. Sie können das Fehlerprotokoll auf dem Server anzeigen, um Informationen zur Ereignisausführung zu erhalten.

Obwohl der Ereignisplaner ein Single-Thread-System ist, können die Ereignisse selbst gleichzeitig ausgeführt werden. Jedes Mal, wenn ein Ereignis ausgeführt wird, erstellt der Server einen neuen Prozess. Innerhalb des Ereignisses können Sie CONNECTION_ID() aufrufen, um einen eindeutigen Wert zu erhalten (auch wenn keine tatsächliche Verbindung besteht). Was tatsächlich zurückgegeben wird, ist die Thread-ID. Prozesse und Threads werden zerstört, nachdem das Ereignis ausgeführt wurde. Sie können es über „SHOW PROCESSLIST“ anzeigen und es wird in der Spalte „Befehl“ als „Verbinden“ angezeigt.

Obwohl der Prozess den Thread erstellt, der das Ereignis tatsächlich ausführt, wird der Thread nach Abschluss des Ereignisses zerstört und nicht im Cache abgelegt, sodass der Statuszähler „Threads_created“ keinen Anstieg verzeichnet.

Fazit: Im Vergleich zu geplanten Aufgaben auf Anwendungs- oder Betriebssystemebene sind Ereignisse effizienter und kostengünstiger, da kein SQL-Verbindungsaufbauprozess erforderlich ist. Anwendbar auf SQL-Skriptaufgaben, die regelmäßig ausgeführt werden müssen, wie z. B. Datentabellenoptimierung, Generieren statistischer Berichtsdaten usw. Es ist jedoch zu beachten, dass das Ereignis selbst Parallelitätsprobleme aufweisen kann, die durch Sperren gelöst werden können. Wenn ein Ereignis wiederholt ausgeführt werden muss, sollten Sie gleichzeitig keine zu komplexen und zeitaufwändigen Aufgaben ausführen.

Oben finden Sie Einzelheiten dazu, wie MySQL Ereignisse verwendet, um geplante Aufgaben abzuschließen. Weitere Informationen dazu, wie MySQL Ereignisse verwendet, um geplante Aufgaben abzuschließen, finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • Erste Schritte mit gespeicherten Prozeduren, Triggern und Ereignisplanern in MySQL
  • MySQL-Datenbank-Trigger vom Anfänger bis zum Profi
  • Detaillierte Erläuterung des MySQL-Trigger-Trigger-Beispiels
  • Einführung in die Verwendung sowie Vor- und Nachteile von MySQL-Triggern
  • Detaillierte Erläuterung der Idee des MySQL-Triggers zur Echtzeiterkennung einer Anweisung zum Sichern und Löschen
  • So konfigurieren Sie geplante MySQL-Aufgaben (EVENT-Ereignisse) im Detail
  • Erfahren Sie mehr über den Ereignisplaner EVENT in MySQL
  • Analyse der geplanten Aufgaben und Ereignisplanungsbeispiele von MySQL
  • Themenverfeinerung für MySQL-Ereignisse und -Trigger

<<:  React Router 5.1.0 verwendet useHistory, um die Seitensprungnavigation zu implementieren

>>:  Grafische Schritte zur Zabbix-Überwachung des VMware Exsi-Hosts

Artikel empfehlen

Detailliertes Tutorial zur Integration von Apache Tomcat mit dem IDEA-Editor

1. Laden Sie das komprimierte Tomcat-Paket von de...

So verwenden Sie JSONP in Vue

Inhaltsverzeichnis 1. Einleitung 2. Installation ...

Javascript um den Drag-Effekt der Login-Box zu erreichen

In diesem Artikel wird der spezifische Code von J...

Sollten nullbare Felder in MySQL auf NULL oder NOT NULL gesetzt werden?

Personen, die MySQL häufig verwenden, können mit ...

Beispielcode zum Bereitstellen eines Spring-Boot-Projekts mit Docker

1. Grundlegender Spring-Boot-Schnellstart 1.1 Sch...

Beispielcode des Vue-Symbolselektors

Quelle: http://www.ruoyi.vip/ Vue von „vue“ impor...

Reflexion und Proxy in Front-End-JavaScript

Inhaltsverzeichnis 1. Was ist Reflexion? 2. Refle...

So verwenden Sie Standardwerte für Variablen in SASS

Bei in SASS definierten Variablen überschreibt de...

Stapelweises Ersetzen eines Teils der Daten eines Felds in MySQL (empfohlen)

Stapelweises Ersetzen eines Teils der Daten eines...

Shell-Skript zur Überwachung des MySQL-Master-Slave-Status

Geben Sie ein Shell-Skript unter Linux frei, um d...

MySql8 WITH RECURSIVE rekursive Abfrage Eltern-Kind-Sammlungsmethode

Hintergrund Wenn Sie eine Funktion entwickeln, di...