Detaillierte Erklärung der atomaren DDL-Syntax von MySQL 8.0

Detaillierte Erklärung der atomaren DDL-Syntax von MySQL 8.0

01 Einführung in Atomic DDL

Atomare DDL-Anweisungen kombinieren die mit der DDL-Operation verbundenen Datenwörterbuchaktualisierungen, Speicher-Engine-Operationen und Binärprotokollschreibvorgänge zu einer einzigen atomaren Operation. Der Vorgang wird entweder festgeschrieben, wobei anwendbare Änderungen am Datenwörterbuch, den Speicher-Engines und dem Binärprotokoll erhalten bleiben, oder rückgängig gemacht.

In MySQL 8.0 unterstützt die Funktion für atomare DDL-Operationen tabellenbezogene Operationen wie „Create Table“ und „Drop Table“ sowie nicht tabellenbezogene Operationen wie „Create Routine“ und „Drop Trigger“.

In:

Zu den unterstützten Tabellenoperationen gehören:

Drop-, Create-, Alter-Syntax (Operationsobjekte sind Datenbanken, Tablespaces, Tabellen und Indizes), Truncate-Syntax

Zu den unterstützten Nicht-Tabellenvorgängen gehören:

Erstellen, Löschen, Ändern (das Operationsobjekt ist Auslöser, Ereignis, Ansichten usw.)

Kontoverwaltungsanweisungen: Anweisungen für Benutzer und Rollen erstellen, ändern, löschen und umbenennen sowie Anweisungen erteilen und widerrufen

Es ist zu beachten, dass für tabellenbezogene DDL-Operationen die Speicher-Engine Innodb sein muss. Für nicht tabellenbezogene Operationen gibt es keine solche Anforderung.

Einige SQL-Anweisungen unterstützen kein atomares DDL, zum Beispiel:

1. Tabellenoperationen für Nicht-Innodb-Speicher-Engines

2. Plugin installieren und Plugin deinstallieren (Plugins installieren)

3. installcomponent- und uninstallcomponent-Anweisungen

4. Anweisungen zum Erstellen eines Servers, Ändern eines Servers und Löschen eines Servers (diese Anweisung wird von der FEDERATED-Speicher-Engine verwendet und kann vorübergehend ignoriert werden)

02 Änderungen im Ausführungsverhalten einiger DDL-Operationen

Die Änderung im Ausführungsverhalten atomarer Operationen hängt mit der Änderung der Organisationsstruktur des Datenwörterbuchs zusammen. Vor MySQL 8.0 war das Datenwörterbuch zusätzlich zu den FRM-, TRG- und OPT-Dateien auch in Systemtabellen (MyISAM-Tabellen, die nicht zur Transaktions-Engine gehören) vorhanden. In MySQL 8.0 ist das Datenwörterbuch vollständig in der Datenwörterbuch-Speicher-Engine (d. h. in der InnoDB-Tabelle) vorhanden, wodurch die Atomizität bei der Wiederherstellung nach einem Systemabsturz beibehalten werden kann. Die folgende Abbildung beschreibt die strukturellen Änderungen des Datenwörterbuchs.

Vor MySQL 8.0 war die Datenwörterbuchstruktur wie folgt:

Nach MySQL 8.0 wird das Datenwörterbuch:

Schauen wir uns zwei spezifische Syntaxänderungen an:

(1) Änderungen in der Drop-Syntax:

Wir erstellen eine Tabelle namens test1 in der Datenbank, aber keine Tabelle namens test2 und führen dann „drop table test1, test2“ aus, um die Ergebnisse zu beobachten.

Leistung von MySQL 5.7:

mysql> Tabelle test1 erstellen (id int);
Abfrage OK, 0 Zeilen betroffen (0,01 Sek.)

mysql> Tabellen anzeigen;
+----------------+
| Tabellen_in_yeyz |
+----------------+
| t1 |
| t2 |
| t3 |
| Prüfung1 |
+----------------+
4 Zeilen im Satz (0,00 Sek.)

mysql> Tabelle Test1, Test2 löschen;
FEHLER 1051 (42S02): Unbekannte Tabelle „yeyz.test2“
mysql> Tabellen anzeigen;
+----------------+
| Tabellen_in_yeyz |
+----------------+
| t1 |
| t2 |
| t3 |
+----------------+
3 Zeilen im Satz (0,00 Sek.)

MySQL 8.0-Leistung:

mysql> Tabelle test1 erstellen (id int);
Abfrage OK, 0 Zeilen betroffen (0,17 Sek.)

mysql> Tabellen anzeigen;
+----------------+
| Tabellen_in_yeyz |
+----------------+
| Prüfung1 |
+----------------+
1 Zeile im Satz (0,00 Sek.)

mysql> Tabelle Test1, Test2 löschen;
FEHLER 1051 (42S02): Unbekannte Tabelle „yeyz.test2“
mysql> Tabellen anzeigen;
+----------------+
| Tabellen_in_yeyz |
+----------------+
| Prüfung1 |
+----------------+
1 Zeile im Satz (0,00 Sek.)

Es ist ersichtlich, dass in MySQL 8.0, wenn kein Test2 vorhanden ist, die Tabelle Test1 nicht gelöscht und die gesamte Anweisung vollständig zurückgesetzt wird; in MySQL 5.7 hingegen wird die Tabelle Test1 versehentlich gelöscht und die gesamte Anweisung nicht vollständig zurückgesetzt.

Aufgrund der unterschiedlichen Verarbeitungsmechanismen tritt ein Fehler auf, wenn wir MySQL 5.7 und MySQL 8.0 für die Master-Slave-Replikation verwenden und Anweisungen wie die oben genannten verwenden. Weil ihr Ausführungsverhalten unterschiedlich ist. Um dieses Problem zu lösen, müssen Sie die Syntax „Tabelle löschen, wenn nicht vorhanden“ verwenden. Ebenso sind die Verarbeitungsmethoden für eine Reihe von Vorgängen wie „Datenbank löschen“ und „Drop-Trigger“ ähnlich. Ein weiterer erwähnenswerter Punkt ist, dass die Drop-Datenbank atomar ist, wenn alle Tabellen in einer Datenbank InnoDB sind, andernfalls ist die Drop-Datenbank nicht atomar.

(2) Tabelle erstellen...Syntax auswählen:

Ab MySQL 8.0.21 wird auf Speicher-Engines, die atomares DDL unterstützen, bei Verwendung des zeilenbasierten Replikationsmodus die Anweisung CREATE TABLE ... SELECT ... als Transaktion im Binärprotokoll aufgezeichnet. In früheren Versionen wurde es als zwei Transaktionen aufgezeichnet, eine zum Erstellen der Tabelle und eine andere zum Einfügen der Daten. Ein Serverfehler zwischen Transaktionen oder beim Einfügen von Daten kann dazu führen, dass eine leere Tabelle kopiert wird. Mit der Einführung der Unterstützung für atomares DDL sind CREATE TABLE ... SELECT-Anweisungen jetzt für die zeilenbasierte Replikation sicher und können mit GTID-basierter Replikation verwendet werden.

03 Wie kann ich das Protokoll der DDL-Operationen anzeigen?

Um das Redo und Rollback von DDL-Operationen zu unterstützen, schreibt InnoDB DDL-Protokolle in die Tabelle mysql.innodb_ddl_log. Diese Tabelle existiert im Data Dictionary-Tabellenbereich. Wenn der Benutzer den Inhalt dieser Tabelle anzeigen möchte, muss der Parameter aktiviert werden:

mysql> Variablen wie „%innodb_print_ddl_logs%“ anzeigen; 
+--------------------------+----------+
| Variablenname | Wert |
+--------------------------+----------+
| innodb_print_ddl_logs | AUS |
+--------------------------+----------+
1 Zeile im Satz (0,01 Sek.)

Anschließend können Sie das Protokoll des DDL-Vorgangs im Fehlerprotokoll sehen. Die relevanten Protokolle sind wie folgt:

[Hinweis] [000000] InnoDB: DDL-Log einfügen: [DDL-Eintrag: DELETE SPACE, id=18, thread_id=7,
space_id=5, alter_Dateipfad=./test/t1.ibd]
[Hinweis] [000000] InnoDB: DDL-Protokoll löschen: nach ID 18
[Hinweis] [000000] InnoDB: DDL-Log einfügen: [DDL-Eintrag: CACHE ENTFERNEN, ID=19, Thread-ID=7,
Tabellen-ID=1058, neuer Dateipfad=test/t1]
[Hinweis] [000000] InnoDB: DDL-Protokoll löschen: nach ID 19
[Hinweis] [000000] InnoDB: DDL-Log einfügen: [DDL-Eintrag: FREE, id=20, thread_id=7,
Raum-ID = 5, Index-ID = 132, Seitennummer = 4]
[Hinweis] [000000] InnoDB: DDL-Protokoll löschen: nach ID 20
[Hinweis] [000000] InnoDB: DDL-Log-Post ddl: begin für Thread-ID: 7
[Hinweis] [000000] InnoDB: DDL-Log-Post DDL: Ende für Thread-ID: 7

Der Zeitpunkt des Leerens der Tabelle mysql.innodb_ddl_log wird durch den Parameter innodb_flush_logs_at_trx_commit nicht beeinflusst. Dies geschieht, um die Situation zu vermeiden, dass die Datendatei durch den DDL-Vorgang geändert wird, das entsprechende Redo-Protokoll jedoch nicht auf die Festplatte geleert wurde, was zu einem Fehler während der Wiederherstellung oder des Rollbacks führt.

Lassen Sie uns abschließend die Phasen der gesamten atomaren DDL-Operation vorstellen:

1. Vorbereitungsphase: Erstellen Sie die erforderlichen Objekte und schreiben Sie das DDL-Protokoll in die Tabelle mysql.innodb_ddl_log. Das DDL-Protokoll definiert, wie DDL-Vorgänge vorwärts und rückwärts ausgeführt werden.

2. Ausführungsphase: Operativer Prozess der DDL-Ausführung

3. Commit-Phase: Aktualisieren Sie das Datenwörterbuch und committen Sie die Datenwörterbuch-Transaktion

4. Post-DDL-Phase: DDL-Protokolle erneut abspielen und aus der Tabelle mysql.innodb_ddl_log löschen. Um sicherzustellen, dass das Rollback sicher und ohne Inkonsistenzen durchgeführt werden kann, werden in dieser letzten Phase Dateivorgänge auf der Festplatte ausgeführt, z. B. das Umbenennen oder Löschen von Datendateien. In dieser Phase werden auch dynamische Metadaten aus der Datenwörterbuchtabelle mysql.innodb_dynamic_metadata entfernt, um sie in DROP TABLE, TRUNCATE TABLE und anderen DDL-Operationen zum Neuaufbau von Tabellen zu verwenden.

Oben finden Sie eine ausführliche Erläuterung der atomaren DDL-Syntax von MySQL 8.0. Weitere Informationen zur atomaren DDL-Syntax von MySQL 8.0 finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • Zusammenfassung gängiger MySQL-DDL-Operationen
  • Detaillierte Erklärung der vier SQL-Sprachen: DDL DML DCL TCL
  • Verwendung von MySQL DDL-Anweisungen
  • Grundlegende Anweisungen der MySQL-Datendefinitionssprache DDL
  • MySQL-Tutorial: Datendefinitionssprache (DDL), Beispiel, ausführliche Erklärung

<<:  HTML-Grundlagen: HTML-Inhaltsdetails

>>:  Detaillierte Erklärung zum Problem der CSS-Klassennamen

Artikel empfehlen

5 Möglichkeiten zum Löschen oder Entfernen großer Dateiinhalte in Linux

Beim Arbeiten mit Dateien im Linux-Terminal möcht...

So legen Sie den Standardwert eines MySQL-Felds fest

Inhaltsverzeichnis Vorwort: 1. Standardwertbezoge...

So stellen Sie Dienste in Windows Server 2016 bereit (Grafisches Tutorial)

Einführung Wenn eine große Anzahl an Systemen ins...

Frage zu benutzerdefinierten Attributen von HTML-Tags

In der vorherigen Entwicklung haben wir die Stand...

So importieren und exportieren Sie Cookies und Favoriten in FireFox

FireFox ist ein weit verbreiteter Browser mit zah...

MySQL-Variablenprinzipien und Anwendungsbeispiele

In der MySQL-Dokumentation können MySQL-Variablen...

So setzen Sie das Root-Passwort in Linux mysql-5.6 zurück

1. Überprüfen Sie, ob der MySQL-Dienst gestartet ...

Verwendung von MySQL DDL-Anweisungen

Vorwort Die Sprachklassifikation von SQL umfasst ...

JS beherrscht schnell die Verwendung von ES6-Klassen

1. Wie konstruieren? Lassen Sie uns die allgemein...

Zusammenfassung zum Erlernen von Docker-Befehlen in einem Artikel

Inhaltsverzeichnis Einführung Spiegel-Repository ...