01 Einführung in Atomic DDLAtomare 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-OperationenDie Ä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:
|
<<: HTML-Grundlagen: HTML-Inhaltsdetails
>>: Detaillierte Erklärung zum Problem der CSS-Klassennamen
Beim Arbeiten mit Dateien im Linux-Terminal möcht...
Verwenden Sie die For-Schleife, um das Zabbix-Ima...
Inhaltsverzeichnis Vorwort: 1. Standardwertbezoge...
Einführung Wenn eine große Anzahl an Systemen ins...
In der vorherigen Entwicklung haben wir die Stand...
Inhaltsverzeichnis Vorwort 1. Installieren Sie da...
[LeetCode] 185. Die drei höchsten Gehälter der Ab...
FireFox ist ein weit verbreiteter Browser mit zah...
In der MySQL-Dokumentation können MySQL-Variablen...
1. Überprüfen Sie, ob der MySQL-Dienst gestartet ...
Vorwort Die Sprachklassifikation von SQL umfasst ...
1. Wie konstruieren? Lassen Sie uns die allgemein...
Gegeben: Ein Array [1,8,5,4,3,9,2], schreiben Sie...
Durch die Verwendung des prozentualen Padding-Top...
Inhaltsverzeichnis Einführung Spiegel-Repository ...