Ein Beispiel für die Umstellung der traditionellen Replikation auf GTID-Replikation ohne Geschäftsunterbrechung in MySQL 5.7

Ein Beispiel für die Umstellung der traditionellen Replikation auf GTID-Replikation ohne Geschäftsunterbrechung in MySQL 5.7

Aufgrund der Vorteile von GTID müssen wir die herkömmliche, auf Dateipositionen basierende Replikation in eine GTID-basierte Replikation ändern. Wie dies online geändert werden kann, wird zu einem Problem. Im Folgenden finden Sie eine spezielle Methode:

Derzeit verfügen wir über eine MS-Struktur unter herkömmlicher Replikation:

Port 3301 Master

Port 3302 Sklave

Auf Master (3301):
[zejin] 3301>Wählen Sie * aus t_users aus;
+----+------+
| Ich würde | Name |
+----+------+
| 1 | ja |
| 2 | zhou |
+----+------+
Zeilen im Set (0,00 Sek.)
 
 
Auf Slave (3302):
[zejin] 3302>Slave-Status anzeigen\G
*************************** 1. Reihe ***************************
Slave_IO_State: Wartet darauf, dass der Master ein Ereignis sendet
Master_Host: 192.168.1.240
Master_Benutzer: repl
Master_Port: 3301
Verbindungswiederholung: 60
Master_Log_File: binlog57.000002
Read_Master_Log_Pos: 417
Relay_Log_File: zejin240-relay-bin.000004
Relay_Log_Pos: 628
Relay_Master_Log_File: binlog57.000002
Slave_IO_Running: Ja
Slave_SQL_Running: Ja
Replicate_Do_DB:
Replikat_Ignorieren_DB:
Tabelle_replizieren:
Tabelle_Ignorieren_replizieren:
Wild_Do_Tabelle replizieren:
Tabelle_Wild_Ignore_replizieren:
Last_Errno: 0
Letzter_Fehler:
Skip_Counter: 0
Exec_Master_Log_Pos: 417
Relay_Log_Space: 884
Until_Condition: Keine
Bis_Log_Datei:
Bis_Log_Pos: 0
Master_SSL_Allowed: Nein
Master_SSL_CA_Datei:
Master_SSL_CA_Pfad:
Master_SSL_Zertifikat:
Master_SSL_Chiffre:
Master_SSL_Schlüssel:
Sekunden_Hinter_Master: 0
Master_SSL_Verify_Server_Cert: Nein
Last_IO_Errno: 0
Letzter_E/A-Fehler:
Last_SQL_Errno: 0
Letzter_SQL_Fehler:
Server-IDs replizieren_ignorieren:
Master_Server_Id: 3301
Master_UUID: a97983fc-5a29-11e6-9d28-000c29d4dc3f
Master_Info_Datei: /home/mysql/I3302/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave hat alle Relay-Logs gelesen; wartet auf weitere Updates
Master_Retry_Count: 86400
Master_Bind:
Zeitstempel des letzten IO-Fehlers:
Letzter_SQL_Fehler_Zeitstempel:
Master_SSL_Crl:
Master_SSL_Crlpfad:
Abgerufenes_Gtid_Set:
Ausgeführtes_Gtid_Set:
Auto_Position: 0
DB replizieren_neu schreiben:
Kanalname:
Master_TLS_Version:
Zeile im Satz (0,00 Sek.)
 
[zejin] 3302>Wählen Sie * aus t_users aus;
+----+------+
| Ich würde | Name |
+----+------+
| 1 | ja |
| 2 | zhou |
+----+------+
Zeilen im Set (0,00 Sek.)

Im Folgenden sind die einzelnen Schritte für Online-Änderungen aufgeführt:

Prämisse:

1. Erfordert alle MySQL-Versionen 5.7.6 oder höher.

2. Der gtid_mode-Wert aller MySQL in der aktuellen Topologie ist deaktiviert.

3. Die folgenden Schritte sind in der richtigen Reihenfolge und dürfen nicht übersprungen werden.

Ergänzen Sie die Beschreibung der globalen Systemvariablen GTID_MODE um den Variablenwert:

AUS Neue Transaktionen sind nicht GTID. Der Slave akzeptiert nur Transaktionen ohne GTID. Transaktionen mit GTID melden einen Fehler.

OFF_PERMISSIVE Neue Transaktionen sind nicht GTID, und der Slave akzeptiert sowohl Transaktionen ohne GTID als auch Transaktionen mit GTID

ON_PERMISSIVE Neue Transaktionen sind GTIDs und der Slave akzeptiert sowohl Transaktionen ohne als auch mit GTIDs.

ON Neue Transaktionen sind GTID, Slave akzeptiert nur Transaktionen mit GTID

Es ist zu beachten, dass die Änderungen dieser Werte in Ordnung sind, nämlich

aus<--->AUS_ZULÄSSIG<--->EIN_ZULÄSSIG<--->EIN

Zur Ausführung kann nicht gesprungen werden, es wird ein Fehler gemeldet.

Schritt 1: Setzen Sie ENFORCE_GTID_CONSISTENCY auf jeder MySQL-Instanz auf Warnung. Es spielt keine Rolle, welche Instanz zuerst ausgeführt wird.

[zejin] 3302>setze @@global.enforce_gtid_consistency=warn;
Abfrage OK, 0 Zeilen betroffen (0,00 Sek.)
[zejin] 3301>Setzen Sie @@global.enforce_gtid_consistency=warn;
Abfrage OK, 0 Zeilen betroffen (0,00 Sek.)

Hinweis: Wenn nach der Ausführung dieser Anweisung eine GTID-inkompatible Anweisung verwendet wird, zeichnet das Fehlerprotokoll die entsprechenden Informationen auf. Anschließend müssen Sie das Programm anpassen, um inkompatibles Schreiben zu vermeiden , bis keine inkompatiblen Anweisungen mehr generiert werden. Sie können das Programm verwenden, um alle SQL-Anweisungen zu überprüfen, oder Sie können es einrichten und das Fehlerprotokoll für einen bestimmten Zeitraum beobachten. Dieser Schritt ist sehr wichtig.

Schritt 2: Setzen Sie ENFORCE_GTID_CONSISTENCY auf jeder MySQL-Instanz auf ON. Das Ergebnis wird nicht davon beeinflusst, welche Instanz zuerst ausgeführt wird.

Nachdem der erste Schritt abgeschlossen ist, kann der Wert auf „Ein“ gesetzt werden.

[zejin] 3301>setze @@global.enforce_gtid_consistency=on;
Abfrage OK, 0 Zeilen betroffen (0,03 Sek.)
 
[zejin] 3302>setze @@global.enforce_gtid_consistency=on;
Abfrage OK, 0 Zeilen betroffen (0,00 Sek.)

Schritt 3: Setzen Sie GTID_MODE auf jeder MySQL-Instanz auf off_permissiv. Welche Instanz zuerst ausgeführt wird, hat keinen Einfluss auf das Ergebnis.

[zejin] 3301>SET @@GLOBAL.GTID_MODE = OFF_PERMISSIVE;
Abfrage OK, 0 Zeilen betroffen (0,00 Sek.)
 
[zejin] 3302>SET @@GLOBAL.GTID_MODE = OFF_PERMISSIVE;
Abfrage OK, 0 Zeilen betroffen (0,00 Sek.)

Schritt 4: Setzen Sie GTID_MODE bei jeder MySQL-Instanz auf on_permissive. Welche Instanz zuerst ausgeführt wird, hat keine Auswirkungen auf das Ergebnis.

[zeigen] 3302>SET @@GLOBAL.GTID_MODE = on_permissive;
Abfrage OK, 0 Zeilen betroffen (0,00 Sek.)
[zeigen] 3301>SET @@GLOBAL.GTID_MODE = on_permissive;
Abfrage OK, 0 Zeilen betroffen (0,01 Sek.)

Schritt 5: Überprüfen Sie die Variable ONGOING_ANONYMOUS_TRANSACTION_COUNT auf jeder MySQL-Instanz

[zejin] 3301>STATUS WIE „ONGOING_ANONYMOUS_TRANSACTION_COUNT“ ANZEIGEN;
+-------------------------------------+----------+
| Variablenname | Wert |
+-------------------------------------+----------+
| Laufende Anzahl anonymer Transaktionen | 0 |
+-------------------------------------+----------+
Zeile im Satz (0,02 Sek.)
 
 
[zejin] 3302>STATUS WIE „ONGOING_ANONYMOUS_TRANSACTION_COUNT“ ANZEIGEN;
+-------------------------------------+----------+
| Variablenname | Wert |
+-------------------------------------+----------+
| Laufende Anzahl anonymer Transaktionen | 0 |
+-------------------------------------+----------+
Zeile im Satz (0,02 Sek.)

Sie müssen warten, bis diese Variable 0 ist

Schritt 6: Stellen Sie sicher, dass alle anonymen Transaktionen (nicht-GTID-Transaktionen) vollständig auf alle Server repliziert wurden.

Prüfmethode:

Auf dem Master:
[zejin] 3301>Masterstatus anzeigen;
+-----------------+----------+--------------+------------------+-------------------+
| Datei | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-----------------+----------+--------------+------------------+-------------------+
| binlog57.000005 | 154 | | | |
+-----------------+----------+--------------+------------------+-------------------+
Zeile im Satz (0,00 Sek.)
 
 
Auf dem Sklaven,
 
[zejin] 3302>Slave-Status anzeigen\G
*************************** 1. Reihe ***************************
…
  Relay_Master_Log_File: binlog57.000005
   Exec_Master_Log_Pos: 154
…

Überprüfen Sie, ob der Wert von Relay_Master_Log_File größer als binlog57.000005 ist.

Oder es ist gleich Relay_Master_Log_File gleich binlog57.000005 und der Wert von Exec_Master_Log_Pos ist größer oder gleich 154

Oder der Slave verwendet die Funktion direkt:

[zeigen] 3302>SELECT MASTER_POS_WAIT('binlog57.000005', 154);
+-----------------------------------------+
| MASTER_POS_WAIT('binlog57.000005', 154) |
+-----------------------------------------+
| 0 |
+-----------------------------------------+
Zeile im Satz (0,00 Sek.)

Wenn das zurückgegebene Ergebnis größer oder gleich 0 ist, bedeutet dies, dass alle anonymen Transaktionen kopiert wurden.

Schritt 7: Bestätigen Sie, dass in der gesamten Topologie keine anonymen Transaktionen vorhanden sind. Beispielsweise wurden alle zuvor generierten anonymen Transaktionen ausgeführt, und im Binärprotokoll sollten keine anonymen Transaktionen vorhanden sein. Sie können Protokolle leeren und MySQL die alten Binärprotokolldateien automatisch bereinigen lassen.

Schritt 8: Setzen Sie GTID_MODE auf jeder MySQL-Instanz auf „Ein“.

[zeigen] 3301>SET @@GLOBAL.GTID_MODE = ON;
Abfrage OK, 0 Zeilen betroffen (0,04 Sek.)
 
[zeigen] 3302>SET @@GLOBAL.GTID_MODE = ON;
Abfrage OK, 0 Zeilen betroffen (0,04 Sek.)

Schritt 9: Fügen Sie der Konfigurationsdatei my.cnf jeder MySQL-Instanz gtid-mode=ON hinzu.

verifizieren:

[zejin] 3301>in t_users Werte einfügen (3, 'chen');
Abfrage OK, 1 Zeile betroffen (0,02 Sek.)
[zejin] 3301>Aktualisiere t_users, setze Name='li', wobei ID=1 ist;
Abfrage OK, 1 Zeile betroffen (0,03 Sek.)
Übereinstimmende Zeilen: 1 Geändert: 1 Warnungen: 0
[zejin] 3301>Wählen Sie * aus t_users aus;
+----+------+
| Ich würde | Name |
+----+------+
| 1 | li |
| 2 | zhou |
| 3 | chen |
+----+------+
Zeilen im Set (0,00 Sek.)
 
 
[zejin] 3302>Slave-Status anzeigen\G
*************************** 1. Reihe ***************************
    Slave_IO_State: Wartet darauf, dass der Master ein Ereignis sendet
     Master_Host: 192.168.1.240
     Master_Benutzer: repl
     Master_Port: 3301
    Verbindungswiederholung: 60
    Master_Log_File: binlog57.000006
   Read_Master_Log_Pos: 462
    Relay_Log_File: zejin240-relay-bin.000012
    Relay_Log_Pos: 673
  Relay_Master_Log_File: binlog57.000006
    Slave_IO_Running: Ja
   Slave_SQL_Running: Ja
    Replicate_Do_DB: 
   Replikat_Ignorieren_DB: 
   Tabelle_replizieren: 
  Tabelle_Ignorieren_replizieren: 
  Wild_Do_Tabelle replizieren: 
 Tabelle_Wild_Ignore_replizieren: 
     Last_Errno: 0
     Letzter_Fehler: 
     Skip_Counter: 0
   Exec_Master_Log_Pos: 462
    Relay_Log_Space: 969
    Until_Condition: Keine
    Bis_Log_Datei: 
    Bis_Log_Pos: 0
   Master_SSL_Allowed: Nein
   Master_SSL_CA_Datei: 
   Master_SSL_CA_Pfad: 
    Master_SSL_Zertifikat: 
   Master_SSL_Chiffre: 
    Master_SSL_Schlüssel: 
  Sekunden_Hinter_Master: 0
Master_SSL_Verify_Server_Cert: Nein
    Last_IO_Errno: 0
    Letzter_E/A-Fehler: 
    Last_SQL_Errno: 0
    Letzter_SQL_Fehler: 
 Server-IDs replizieren_ignorieren: 
    Master_Server_Id: 3301
     Master_UUID: a97983fc-5a29-11e6-9d28-000c29d4dc3f
    Master_Info_Datei: /home/mysql/I3302/master.info
     SQL_Delay: 0
   SQL_Remaining_Delay: NULL
  Slave_SQL_Running_State: Slave hat alle Relay-Logs gelesen; wartet auf weitere Updates
   Master_Retry_Count: 86400
     Master_Bind: 
  Zeitstempel des letzten IO-Fehlers: 
  Letzter_SQL_Fehler_Zeitstempel: 
    Master_SSL_Crl: 
   Master_SSL_Crlpfad: 
   Abgerufen_Gtid_Set: a97983fc-5a29-11e6-9d28-000c29d4dc3f:1-2
   Ausgeführtes_Gtid_Set: a97983fc-5a29-11e6-9d28-000c29d4dc3f:1-2
    Auto_Position: 0
   DB replizieren_neu schreiben: 
     Kanalname: 
   Master_TLS_Version: 
Zeile im Satz (0,00 Sek.)

Damit ist die Online-Konvertierung von der herkömmlichen Replikation zur GTID-Replikation abgeschlossen.

Das obige Beispiel der Umstellung der traditionellen Replikation auf GTID-Replikation ohne Unterbrechung des MySQL 5.7-Betriebs ist alles, was ich mit Ihnen teilen möchte. Ich hoffe, es kann Ihnen als Referenz dienen. Ich hoffe auch, dass Sie 123WORDPRESS.COM unterstützen werden.

Das könnte Sie auch interessieren:
  • Detaillierte Einführung in den GTID-Modus der MySQL Master-Slave-Replikation
  • MySQL-Datenbank GTID realisiert Master-Slave-Replikation (super praktisch)
  • Lösung für das Problem, dass synchrone Replikationsfehler im MySQL5.6 GTID-Modus nicht übersprungen werden können
  • Detaillierte Erläuterung der MySQL Master-Slave-Replikationspraxis - GTID-basierte Replikation
  • MySQL 5.6 Master-Slave-Replikation basierend auf GTID
  • Tutorial zur Verwendung des GTIDs-Replikationsprotokolls und des Ausfallprotokolls in MySQL
  • Spezifische Verwendung der GTID-Replikation bei der MySQL-Replikation

<<:  SSH-Portweiterleitung, lokale Portweiterleitung, Remote-Portweiterleitung, dynamische Portweiterleitungsdetails

>>:  JavaScript zum Erreichen einer festen Seitenleiste

Artikel empfehlen

Detailliertes Beispiel für MySQL ähnlich dem Schreiben von Oracle Rownum

Rownum ist eine einzigartige Schreibmethode in Or...

Docker verwendet den Prune-Befehl, um das Nicht-Image zu bereinigen

Inhaltsverzeichnis Die Entstehung und Verwirrung ...

MySQL 1130-Ausnahme, Remote-Anmeldung nicht möglich – Lösung

Inhaltsverzeichnis Frage: 1. Aktivieren Sie die B...

So richten Sie Textfelder in mehreren Formularen in HTML aus

Der Formularcode ist wie in der Abbildung dargest...

Detaillierte Erläuterung der Windows-Zeitserver-Konfigurationsmethode

Kürzlich habe ich festgestellt, dass die Serverze...

So verwenden Sie das Realip-Modul im Nginx-Grundlagenlernen

Vorwort Es gibt zwei Arten von Nginx-Modulen: off...

Optimierung der Datenbank-SQL-Anweisung

Warum optimieren: Beim Start des eigentlichen Pro...

So optimieren Sie die langsame Like-Fuzzy-Abfrage in MySQL

Inhaltsverzeichnis 1. Einleitung: 2. Die erste Id...