Zusammenfassung der Online-Methoden zur Fehlerbehebung bei MySQL-Synchronisierungsfehlern (unbedingt lesen)

Zusammenfassung der Online-Methoden zur Fehlerbehebung bei MySQL-Synchronisierungsfehlern (unbedingt lesen)

Vorwort

Nach einem Failover sind Synchronisierungsfehler ein häufiges Problem. Wenn die Datenbank klein ist, kann sie leicht durch Dumping und anschließendes Importieren behandelt werden. Online-Datenbanken sind jedoch 150–200 G groß. Wenn diese Methode allein verwendet wird, sind die Kosten zu hoch. Daher wurden nach einer Untersuchungsphase mehrere Verarbeitungsmethoden zusammengefasst.

Architekturdiagramm der Produktionsumgebung

Die aktuelle Netzwerkarchitektur speichert zwei Kopien der Daten und verwendet asynchrone Replikation, um einen Hochverfügbarkeitscluster mit zwei Maschinen zu erstellen, die externe Dienste bereitstellen. Wenn ein Fehler auftritt, wechseln Sie zum Slave und machen Sie ihn zum Master. Die defekte Maschine wird umgekehrt mit dem neuen Master synchronisiert. Bei der Fehlerbehandlung treten am häufigsten Master-Slave-Fehler auf. Nachfolgend die Fehlermeldung, die ich erhalten habe.

Häufige Fehler

Die drei häufigsten Situationen

Diese drei Situationen treten beim HA-Switching auf. Aufgrund der asynchronen Replikation und sync_binlog=0 wird ein kleiner Teil des Binlogs nicht empfangen, was zu Synchronisierungsfehlern führt.

Die erste: Auf dem Master wird ein Datensatz gelöscht, dieser kann aber auf dem Slave nicht gefunden werden.

Last_SQL_Error: Das Ereignis „Delete_rows“ konnte für die Tabelle hcy.t1 nicht ausgeführt werden.
Datensatz in „t1“ nicht gefunden,
Fehlercode: 1032; Handler-Fehler HA_ERR_KEY_NOT_FOUND;
das Hauptprotokoll des Ereignisses mysql-bin.000006, end_log_pos 254

Der zweite Typ: doppelter Primärschlüssel. Der Datensatz ist bereits auf dem Slave vorhanden und der gleiche Datensatz wird auf dem Master eingefügt.

Last_SQL_Error: Das Write_rows-Ereignis konnte für die Tabelle hcy.t1 nicht ausgeführt werden.
Doppelter Eintrag '2' für Schlüssel 'PRIMARY',
Fehlercode: 1062;
Handler-Fehler HA_ERR_FOUND_DUPP_KEY; das Hauptprotokoll des Ereignisses mysql-bin.000006, end_log_pos 924

Der dritte Typ: Auf dem Master wird ein Datensatz aktualisiert, dieser kann jedoch auf dem Slave nicht gefunden werden, was zu Datenverlust führt.

Last_SQL_Error: Das Ereignis „Update_rows“ konnte für die Tabelle hcy.t1 nicht ausgeführt werden.
Datensatz in „t1“ nicht gefunden,
Fehlercode: 1032;
Handler-Fehler HA_ERR_KEY_NOT_FOUND; das Hauptprotokoll des Ereignisses mysql-bin.000010, end_log_pos 263

Asynchroner halbsynchroner Unterschied

Asynchrone Replikation <br /> Einfach ausgedrückt: Der Master sendet das Binärprotokoll und die Aktion endet, unabhängig davon, ob der Slave es empfangen oder ausgeführt hat.

Halbsynchrone Replikation <br /> Einfach ausgedrückt: Der Master sendet das Binlog und der Slave bestätigt, dass er es erhalten hat. Unabhängig davon, ob es ausgeführt wurde, sendet der Master ein Signal, dass er es erhalten hat, und die Aktion ist abgeschlossen. (Von Google geschriebener Code, offiziell angewendet in 5.5.)

Nachteile der Asynchronität <br /> Wenn der Master mit Schreibvorgängen beschäftigt ist, beträgt der aktuelle POS-Punkt beispielsweise 10 und der IO_THREAD-Thread auf dem Slave empfängt 3. Zu diesem Zeitpunkt stürzt der Master ab, was dazu führt, dass eine Differenz von 7 Punkten nicht an den Slave übertragen wird und Daten verloren gehen.

Besondere Umstände

Der Relay-Bin des Relay-Logs des Slaves ist beschädigt.
Last_SQL_Error: Fehler beim Initialisieren der Relay-Log-Position: E/A-Fehler beim Lesen des Headers aus dem Binärlog
Last_SQL_Error: Fehler beim Initialisieren der Relay-Log-Position: Binlog hat eine falsche magische Zahl;
Es handelt sich nicht um eine binäre Logdatei, die von dieser MySQL-Version verwendet werden kann

In diesem Fall ist der SLAVE ausgefallen oder wurde unrechtmäßig heruntergefahren, z. B. aufgrund eines Stromausfalls, eines durchgebrannten Motherboards usw., wodurch das Relay-Protokoll beschädigt und die Synchronisierung gestoppt wird.

Vorsicht vor menschlichen Fehlern: Mehrere Slaves haben doppelte Server-IDs
In diesem Fall verzögert sich die Synchronisierung und wird nie abgeschlossen. Die beiden obigen Informationszeilen werden immer im Fehlerprotokoll angezeigt. Die Lösung besteht darin, die Server-ID so zu ändern, dass sie inkonsistent ist.

Slave: Endpaket vom Server empfangen, offensichtliches Herunterfahren des Masters:
Slave-E/A-Thread: Fehler beim Lesen des Protokollereignisses. Erneutes Verbinden zum erneuten Versuch, Protokoll „mysql-bin.000012“ an Position 106

Problemlösung

Löschen fehlgeschlagen

Löschen Sie einen Datensatz auf dem Master, dieser kann jedoch auf dem Slave nicht gefunden werden.

Last_SQL_Error: Das Ereignis „Delete_rows“ konnte für die Tabelle hcy.t1 nicht ausgeführt werden.
Datensatz in „t1“ nicht gefunden,
Fehlercode: 1032; Handler-Fehler HA_ERR_KEY_NOT_FOUND;
das Hauptprotokoll des Ereignisses mysql-bin.000006, end_log_pos 254

Lösung:

Denn der Master möchte einen Datensatz löschen, der Slave diesen aber nicht findet und einen Fehler meldet, so hat in diesem Fall der Master ihn gelöscht, der Slave kann ihn also direkt überspringen. Verfügbare Befehle:

Sklave stoppen;
Setzen Sie den globalen sql_slave_skip_counter = 1.
Slave starten;

Wenn dies häufig vorkommt, können Sie ein von mir geschriebenes Skript verwenden, skip_error_replcation.sh, das standardmäßig 10 Fehler überspringt (es überspringt nur diese Situation und gibt in anderen Situationen Fehlerergebnisse aus und wartet auf die Verarbeitung). Dieses Skript ist in Shell mit Bezug auf das mk-slave-restart-Prinzip des maakit-Toolkits geschrieben. Es definiert einige seiner eigenen Funktionen und überspringt nicht alle Fehler. )

Doppelter Primärschlüssel

Der Datensatz ist bereits auf dem Slave vorhanden und der gleiche Datensatz wird auf dem Master eingefügt.

Last_SQL_Error: Das Write_rows-Ereignis konnte für die Tabelle hcy.t1 nicht ausgeführt werden. 
Doppelter Eintrag '2' für Schlüssel 'PRIMARY', 
Fehlercode: 1062; 
Handler-Fehler HA_ERR_FOUND_DUPP_KEY; das Hauptprotokoll des Ereignisses mysql-bin.000006, end_log_pos 924

Lösung:

Verwenden Sie deschcy.t1 auf dem Slave; sehen Sie sich zunächst die folgende Tabellenstruktur an:

mysql> desc hcy.t1;
+-------+---------+------+-----+---------+---------+----------+
| Feld | Typ | Null | Schlüssel | Standard | Extra |
+-------+---------+------+-----+---------+---------+----------+
| id | int(11) | NEIN | PRI | 0 | | 
| Name | char(4) | JA | | NULL | | 
+-------+---------+------+-----+---------+---------+----------+

Entfernen doppelter Primärschlüssel

mysql> löschen aus t1, wo ID=2;
Abfrage OK, 1 Zeile betroffen (0,00 Sek.)

mysql> Slave starten;
Abfrage OK, 0 Zeilen betroffen (0,00 Sek.)

mysql> Slave-Status anzeigen\G;
…
Slave_IO_Running: Ja
Slave_SQL_Running: Ja
…
mysql> wähle * von t1, wobei ID=2 ist;

Bestätigen Sie noch einmal auf dem Master und dem Slave.

Update verloren

Auf dem Master wird ein Datensatz aktualisiert, dieser kann jedoch auf dem Slave nicht gefunden werden, was zu Datenverlust führt.

Last_SQL_Error: Das Ereignis „Update_rows“ konnte für die Tabelle hcy.t1 nicht ausgeführt werden. 
Datensatz in „t1“ nicht gefunden, 
Fehlercode: 1032; 
Handler-Fehler HA_ERR_KEY_NOT_FOUND; 
das Hauptprotokoll des Ereignisses mysql-bin.000010, end_log_pos 794

Lösung:

Verwenden Sie auf dem Master mysqlbinlog, um zu analysieren, was das falsche Binlog-Protokoll macht.

/usr/local/mysql/bin/mysqlbinlog --no-defaults -v -v --base64-output=DECODE-ROWS mysql-bin.000010 | grep -A '10' 794

#120302 12:08:36 Server-ID 22 end_log_pos 794 Update_rows: Tabellen-ID 33 Flags: STMT_END_F
### UPDATE hcy.t1
###WO
### @1=2 /* INT meta=0 nullable=0 is_null=0 */
### @2='bbc' /* STRING(4) meta=65028 nullable=1 is_null=0 */
### SATZ
### @1=2 /* INT meta=0 nullable=0 is_null=0 */
### @2='BTV' /* STRING(4) meta=65028 nullable=1 is_null=0 */
# bei 794
#120302 12:08:36 Server-ID 22 end_log_pos 821 Xid = 60
BEGEHEN /*!*/;
TRENNUNGSZEICHEN ;
# Ende der Protokolldatei
ROLLBACK /* hinzugefügt von mysqlbinlog */;
/*!50003 SETZEN SIE COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;

Suchen Sie auf dem Slave nach dem aktualisierten Datensatz, der nicht vorhanden sein sollte.

mysql> wähle * von t1, wobei ID=2 ist;
Leerer Satz (0,00 Sek.)

Gehen Sie dann zum Master, um zu überprüfen

mysql> wähle * von t1, wobei ID=2 ist;
+----+------+
| Ich würde | Name |
+----+------+
| 2 | BTV | 
+----+------+
1 Zeile im Satz (0,00 Sek.)

Ergänzen Sie die fehlenden Daten auf dem Slave und überspringen Sie den Fehler.

mysql> in t1-Werte einfügen (2, 'BTV');
Abfrage OK, 1 Zeile betroffen (0,00 Sek.)

mysql> wähle * von t1, wobei ID=2 ist;  
+----+------+
| Ich würde | Name |
+----+------+
| 2 | BTV | 
+----+------+
1 Zeile im Satz (0,00 Sek.)

mysql> Slave stoppen; globalen sql_slave_skip_counter=1 setzen; Slave starten;
Abfrage OK, 0 Zeilen betroffen (0,01 Sek.)
Abfrage OK, 0 Zeilen betroffen (0,00 Sek.)
Abfrage OK, 0 Zeilen betroffen (0,00 Sek.)

mysql> Slave-Status anzeigen\G;
…
 Slave_IO_Running: Ja
 Slave_SQL_Running: Ja
…

Beschädigung des Relay-Protokolls

Der Relay-Bin des Relay-Logs des Slaves ist beschädigt.

Last_SQL_Error: Fehler beim Initialisieren der Relay-Log-Position: E/A-Fehler beim Lesen des Headers aus dem Binärlog
Last_SQL_Error: Fehler beim Initialisieren der Relay-Log-Position: Binlog hat falsche magische Zahl; 
Es handelt sich nicht um eine binäre Logdatei, die von dieser MySQL-Version verwendet werden kann

Manuelle Reparatur

Lösung: Suchen Sie die synchronisierten Binärprotokoll- und POS-Punkte und synchronisieren Sie sie anschließend erneut, sodass Sie einen neuen Relay-Tageswert erhalten.

Beispiel:

mysql> Slave-Status anzeigen\G;
*************************** 1. Reihe ***************************
       Master_Log_File:mysql-bin.000010
     Read_Master_Log_Pos: 1191
        Relay_Log_File: vm02-relay-bin.000005
        Relay_Log_Pos: 253
    Relay_Master_Log_File: mysql-bin.000010
       Slave_IO_Running: Ja
      Slave_SQL_Running: Nein
       Replicate_Do_DB: 
     Replikat_Ignorieren_DB: 
      Tabelle_replizieren: 
    Tabelle_Ignorieren_replizieren: 
   Wild_Do_Tabelle replizieren: 
 Tabelle_Wild_Ignore_replizieren: 
          Letzte_Fehlernummer: 1593
          Last_Error: Fehler beim Initialisieren der Relay-Log-Position: E/A-Fehler beim Lesen des Headers aus dem Binärlog
         Skip_Counter: 1
     Exec_Master_Log_Pos: 821

Slave_IO_Running: Binlog-Informationen vom Master empfangen

Master_Log_File
Read_Master_Log_Pos

Slave_SQL_Running: Schreibvorgang ausführen

Relay_Master_Log_File
Exec_Master_Log_Pos

Der Binärprotokoll- und POS-Ausführungspunkt ist maßgebend.

Relay_Master_Log_File: mysql-bin.000010
Exec_Master_Log_Pos: 821
mysql> Slave stoppen;
Abfrage OK, 0 Zeilen betroffen (0,01 Sek.)

mysql> ÄNDERN SIE MASTER IN MASTER_LOG_FILE='mysql-bin.000010',MASTER_LOG_POS=821;
Abfrage OK, 0 Zeilen betroffen (0,01 Sek.)

mysql> Slave starten;
Abfrage OK, 0 Zeilen betroffen (0,00 Sek.)


mysql> Slave-Status anzeigen\G;
*************************** 1. Reihe ***************************
        Slave_IO_State: Wartet darauf, dass der Master ein Ereignis sendet
         Master_Host: 192.168.8.22
         Master_Benutzer: repl
         Master_Port: 3306
        Verbindungswiederholung: 10
       Master_Log_File:mysql-bin.000010
     Read_Master_Log_Pos: 1191
        Relay_Log_File: vm02-relay-bin.000002
        Relay_Log_Pos: 623
    Relay_Master_Log_File: mysql-bin.000010
       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: 1191
       Relay_Log_Space: 778
       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: 
Ibbackup

Alle Tricks wurden verwendet, aber die Slave-Daten sind zu stark verloren gegangen. Es ist Zeit für Sie, ibbackup zu verwenden (was Geld kostet).

Das Hot-Backup-Tool Ibbackup ist kostenpflichtig. Xtrabackup ist kostenlos und hat die gleiche Funktionalität.

Ibbackup sperrt die Tabelle während der Sicherung nicht. Während der Sicherung wird eine Transaktion gestartet (entspricht der Erstellung eines Snapshots) und anschließend ein Punkt aufgezeichnet. Die nachfolgenden Datenänderungen werden in der Datei ibbackup_logfile gespeichert. Während der Wiederherstellung werden die geänderten Daten in der Datei ibbackup_logfile zurück in ibdata geschrieben.

Ibbackup sichert nur Daten (ibdata, .ibd) und sichert nicht die Tabellenstruktur .frm.

Hier ist ein Demonstrationsbeispiel:

Sicherung: ibbackup /bak/etc/my_local.cnf /bak/etc/my_bak.cnf

Wiederherstellen: ibbackup --apply-log /bak/etc/my_bak.cnf

[root@vm01 usw.]# mehr my_local.cnf 

Datenverzeichnis = /usr/local/mysql/data
innodb_data_home_dir = /usr/local/mysql/data
innodb_data_file_path = ibdata1:10M:autoextend
innodb_log_group_home_dir = /usr/local/mysql/data
innodb_buffer_pool_size = 100 M
innodb_log_file_size = 5M
innodb_log_files_in_group=2


[root@vm01 usw.]# ibbackup /bak/etc/my_local.cnf /bak/etc/my_bak.cnf 

InnoDB Hot Backup Version 3.0.0; Copyright 2002-2005 Innobase Oy
Lizenz A21488 wurde vm01 ([email protected]) erteilt.
(--apply-log funktioniert auf jedem Computer, unabhängig vom Hostnamen)
Lizenziert für die Verwendung auf einem Computer mit dem Hostnamen „vm01“
Läuft am 1.5.2012 (Jahr-Monat-Tag) um 00:00 ab
Weitere Informationen finden Sie unter http://www.innodb.com
Geben Sie ibbackup --license für detaillierte Lizenzbedingungen und --help für Hilfe ein.

Inhalt von /bak/etc/my_local.cnf:
innodb_data_home_dir hat den Wert /usr/local/mysql/data
innodb_data_file_path erhielt den Wert ibdata1:10M:autoextend
datadir hat den Wert /usr/local/mysql/data
innodb_log_group_home_dir hat den Wert /usr/local/mysql/data
innodb_log_files_in_group hat den Wert 2
innodb_log_file_size hat den Wert 5242880

Inhalt von /bak/etc/my_bak.cnf:
innodb_data_home_dir hat den Wert /bak/data
innodb_data_file_path erhielt den Wert ibdata1:10M:autoextend

datadir hat den Wert /bak/data
innodb_log_group_home_dir hat den Wert /bak/data
innodb_log_files_in_group hat den Wert 2
innodb_log_file_size hat den Wert 5242880

ibbackup: Prüfpunkt bei LSN 0 1636898 gefunden
ibbackup: Protokollscan von LSN 0 1636864 starten
120302 16:47:43 ibbackup: Protokoll wird kopiert …
120302 16:47:43 ibbackup: Protokoll kopiert, lsn 0 1636898
ibbackup: Wir warten 1 Sekunde, bevor wir mit dem Kopieren der Datendateien beginnen …
120302 16:47:44 ibbackup: Kopiere /usr/local/mysql/data/ibdata1
ibbackup: Eine kopierte Datenbankseite wurde bei 0 1636898 geändert
ibbackup: Protokoll bis LSN 0 1636898 gescannt
ibbackup: Konnte das Protokoll bis LSN 0 1636898 analysieren
ibbackup: Maximale Seitenzahl für einen Logdatensatz 0
120302 16:47:46 ibbackup: Vollständige Sicherung abgeschlossen!
[root@vm01 usw.]#
[root@vm01 usw.]# cd /bak/data/
[root@vm01 Daten]# ls
ibbackup_logfile ibdata1

[root@vm01-Daten]# ibbackup --apply-log /bak/etc/my_bak.cnf 

InnoDB Hot Backup Version 3.0.0; Copyright 2002-2005 Innobase Oy
Lizenz A21488 wurde vm01 ([email protected]) erteilt.
(--apply-log funktioniert auf jedem Computer, unabhängig vom Hostnamen)
Lizenziert für die Verwendung auf einem Computer mit dem Hostnamen „vm01“
Läuft am 1.5.2012 (Jahr-Monat-Tag) um 00:00 ab
Weitere Informationen finden Sie unter http://www.innodb.com
Geben Sie ibbackup --license für detaillierte Lizenzbedingungen und --help für Hilfe ein.

Inhalt von /bak/etc/my_bak.cnf:
innodb_data_home_dir hat den Wert /bak/data
innodb_data_file_path erhielt den Wert ibdata1:10M:autoextend
datadir hat den Wert /bak/data
innodb_log_group_home_dir hat den Wert /bak/data
innodb_log_files_in_group hat den Wert 2
innodb_log_file_size hat den Wert 5242880

120302 16:48:38 ibbackup: Parameter zur Erstellung der ibbackup_logfile:
ibbackup: Start-LSN 0 1636864, Ende-LSN 0 1636898,
ibbackup: Startprüfpunkt 0 1636898


ibbackup: Startprüfpunkt 0 1636898
InnoDB: Wiederherstellung wird durchgeführt: Bis zur Protokollsequenznummer 0 1636898 gescannt
InnoDB: Starten eines Batches zum Anwenden von Protokolldatensätzen auf die Datenbank ...
InnoDB: Fortschritt in Prozent: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 .....99
Festlegen der Protokolldateigröße auf 0 5242880
ibbackup: Wir konnten ibbackup_logfile bis zu
ibbackup: lsn 0 1636898
ibbackup: Letzte MySQL-Binlog-Dateiposition 0 1191, Dateiname ./mysql-bin.000010
ibbackup: Die erste Datendatei ist „/bak/data/ibdata1“
ibbackup: und die neu erstellten Protokolldateien befinden sich unter „/bak/data/“
120302 16:48:38 ibbackup: Vollständiges Backup erfolgreich zur Wiederherstellung vorbereitet!

[root@vm01 Daten]# ls
ibbackup_logfile ibdata1 ib_logfile0 ib_logfile1

Kopieren Sie ibdata1 ib_logfile0 ib_logfile1 auf den Slave und kopieren Sie auch .frm dorthin. Synchronisieren Sie MySQL nach dem Starten. Dieser Punkt ist die obige Ausgabe:

ibbackup: Letzte MySQL-Binlog-Dateiposition 0 1191, Dateiname ./mysql-bin.000010
ÄNDERN SIE MASTER IN MASTER_LOG_FILE='mysql-bin.000010',MASTER_LOG_POS=1191;

Maatkit-Toolkit
http://www.maatkit.org/

Einführung

MaatKit ist ein Open-Source-Toolkit, das Unterstützung bei der täglichen Verwaltung von MySQL bietet. Derzeit wurde es von Percona erworben und wird von diesem Unternehmen gepflegt. In:

Mithilfe der mk-table-checksum wird geprüft, ob Tabellenstruktur und Daten auf Master und Slave konsistent sind.

mk-table-sync wird verwendet, um Inkonsistenzen zwischen Master- und Slave-Daten zu reparieren.

Es gibt keine tatsächliche Erfahrung mit dem Betrieb dieser beiden Toolkits im Live-Netzwerk. Dies ist lediglich eine Diskussion über neue Technologien und akademischen Austausch. Im Folgenden wird gezeigt, wie man sie verwendet.

http://www.actionsky.com/products/mysql-others/maatkit.jsp

[root@vm02]# mk-table-checksum h=vm01,u=admin,p=123456 h=vm02,u=admin,p=123456 -d hcy -t t1
Verbindung zu MySQL kann nicht hergestellt werden, da das Perl-DBI-Modul nicht installiert ist oder nicht gefunden wurde. 
Führen Sie „perl -MDBI“ aus, um die Verzeichnisse anzuzeigen, in denen Perl nach DBI sucht.
Wenn DBI nicht installiert ist, versuchen Sie:
 Debian/Ubuntu apt-get install libdbi-perl
 RHEL/CentOS yum installiere perl-DBI
 OpenSolaris pgk install pkg:/SUNWpmdbi

Wenn die Meldung angezeigt wird, dass das Perl-DBI-Modul fehlt, installieren Sie Perl-DBI direkt mit „yum“.

[root@vm02 bin]# mk-table-checksum h=vm01,u=admin,p=123456 h=vm02,u=admin,p=123456 -d hcy -t t1
DATENBANK TABELLE CHUNK HOST ENGINE COUNT PRÜFSUMME ZEIT WARTE STAT LAG
hcy t1 0 vm02 InnoDB NULL 1957752020 0 0 NULL NULL
hcy t1 0 vm01 InnoDB NULL 1957752020 0 0 NULL NULL

Wenn die Tabellendaten inkonsistent sind, ist der Prüfsummenwert ungleich.

Erklären Sie, was die Ausgabe bedeutet:

DATABASE: Datenbankname
TABELLE: Tabellenname
CHUNK: ungefährer Wert der Prüfsumme
HOST: MySQL-Adresse
MOTOR: Tischmotor
COUNT: Die Anzahl der Zeilen in der Tabelle
CHECKSUM: Prüfsummenwert
ZEIT: benötigte Zeit
WAIT: Wartezeit
STAT: MASTER_POS_WAIT() Rückgabewert
LAG: Slave-Verzögerungszeit

Wenn Sie herausfiltern möchten, welche Tabellen nicht identisch sind, können Sie das Tool mk-checksum-filter verwenden. Fügen Sie am Ende einfach ein Pipe-Zeichen hinzu.

[root@vm02 ~]# mk-table-checksum h=vm01,u=admin,p=123456 h=vm02,u=admin,p=123456 -d hcy | mk-checksum-filter    
hcy t2 0 vm01 InnoDB NULL 1957752020 0 0 NULL NULL
hcy t2 0 vm02 InnoDB NULL 1068689114 0 0 NULL NULL

Wenn Sie wissen, welche Tabellen inkonsistent sind, können Sie sie mit dem Tool mk-table-sync behandeln.

Hinweis: Die Tabelle wird beim Ausführen von mk-table-checksum gesperrt. Die Größe der Tabelle hängt von der Ausführungsgeschwindigkeit ab.

Tabelle t2-Daten zu MASTER:

Tabelle t2-Daten zu SLAVE:

mysql> wähle * aus t2; mysql> wähle * aus t2;  
+----+------+ +----+------+
| ID | Name | | ID | Name |
+----+------+ +----+------+
| 1 | ein | | 1 | ein | 
| 2 | b | | 2 | b | 
| 3 | ss | | 3 | ss | 
| 4 | asd | | 4 | asd | 
| 5 | ss | +----+------+
+----+------+ 4 Zeilen im Satz (0,00 Sek.)
5 Zeilen im Satz (0,00 Sek.) 
                     mysql> \!Hostname; 
mysql> \! Hostname; vm02    
vm01 
[root@vm02 ~]# mk-table-sync --execute --print --no-check-slave --transaction --databases hcy h=vm01,u=admin,p=123456 h=vm02,u=admin,p=123456 
INSERT INTO `hcy`.`t2`(`id`, `name`) VALUES ('5', 'ss') /*maatkit src_db:hcy src_tbl:t2 src_dsn:h=vm01,p=...,u=admin dst_db:hcy dst_tbl:t2 
dst_dsn:h=vm02,p=...,u=admin Sperre:0 Transaktion:1 changing_src:0 Replikation:0 bidirektional:0 pid:3246 Benutzer:root Host:vm02*/;

Das Funktionsprinzip lautet: Überprüfen Sie zunächst, ob die Tabellen der Master- und Slave-Bibliotheken zeilenweise identisch sind. Wenn Unterschiede bestehen, führen Sie Lösch-, Aktualisierungs-, Einfüge- und andere Vorgänge durch, um sie konsistent zu machen. Die Größe der Tabelle bestimmt, wie schnell die Ausführung erfolgt.

Wenn C<--transaction> angegeben ist, wird C<LOCK TABLES> nicht verwendet. Stattdessen wird lock
und Entsperren werden durch das Starten und Festschreiben von Transaktionen implementiert.
Die Ausnahme ist, wenn L<"--lock"> 3 ist.
Wenn C<--no-transaction> angegeben ist, dann wird C<LOCK TABLES> für alle
Wert von L<"--lock">. Siehe L<"--[no]transaction">.
Wenn diese Option explizit oder implizit aktiviert ist,
wird gesetzt C<REPEATABLE READ> und Transaktionen werden gestartet C<WITH CONSISTENT
SCHNAPPSCHUSS>

MySQL-Replikationsüberwachung

Häufige MySQL-Fehlertypen

1005: Tabelle konnte nicht erstellt werden
1006: Datenbank konnte nicht erstellt werden
1007: Die Datenbank ist bereits vorhanden. Die Datenbank konnte nicht erstellt werden.
1008: Die Datenbank existiert nicht. Das Löschen der Datenbank ist fehlgeschlagen.
1009: Datenbankdatei kann nicht gelöscht werden, daher schlägt das Löschen der Datenbank fehl
1010: Das Löschen des Datenverzeichnisses ist fehlgeschlagen, daher konnte die Datenbank nicht gelöscht werden
1011: Löschen der Datenbankdatei fehlgeschlagen
1012: Datensätze aus der Systemtabelle können nicht gelesen werden
1020: Der Datensatz wurde von einem anderen Benutzer geändert
1021: Nicht genügend freier Speicherplatz auf der Festplatte. Bitte erhöhen Sie den freien Speicherplatz auf der Festplatte.
1022: Schlüsselwort dupliziert, Datensatzänderung fehlgeschlagen
1023: Beim Herunterfahren ist ein Fehler aufgetreten
1024: Fehler beim Lesen der Datei
1025: Beim Ändern des Namens ist ein Fehler aufgetreten
1026: Fehler beim Schreiben der Datei
1032: Datensatz existiert nicht
1036: Die Datentabelle ist schreibgeschützt und kann nicht geändert werden
1037: Nicht genügend Systemspeicher. Bitte starten Sie die Datenbank oder den Server neu.
1038: Nicht genügend Speicher zum Sortieren, bitte vergrößern Sie den Sortierpuffer
1040: Die maximale Anzahl an Datenbankverbindungen wurde erreicht. Bitte erhöhen Sie die Anzahl der verfügbaren Datenbankverbindungen.
1041: Nicht genügend Systemspeicher
1042: Ungültiger Hostname
1043: Ungültige Verbindung
1044: Der aktuelle Benutzer hat keine Berechtigung, auf die Datenbank zuzugreifen
1045: Keine Verbindung zur Datenbank möglich, falscher Benutzername oder falsches Passwort
1048: Feld darf nicht leer sein
1049: Datenbank existiert nicht
1050: Die Datentabelle existiert bereits
1051: Die Datentabelle existiert nicht
1054: Feld existiert nicht
1065: Ungültige SQL-Anweisung, SQL-Anweisung ist leer
1081: Socket-Verbindung kann nicht hergestellt werden
1114: Die Datentabelle ist voll und kann keine Datensätze aufnehmen.
1116: Zu viele offene Tische
1129: Die Datenbank ist abnormal. Bitte starten Sie die Datenbank neu.
1130: Verbindung zur Datenbank konnte nicht hergestellt werden. Keine Berechtigung zur Verbindung mit der Datenbank
1133: Datenbankbenutzer existiert nicht
1141: Der aktuelle Benutzer hat keine Berechtigung, auf die Datenbank zuzugreifen
1142: Der aktuelle Benutzer hat keine Berechtigung, auf die Datentabelle zuzugreifen
1143: Der aktuelle Benutzer hat keine Berechtigung, auf die Felder in der Datentabelle zuzugreifen
1146: Die Datentabelle existiert nicht
1147: Die Benutzerzugriffsrechte für die Tabelle sind nicht definiert
1149: Syntaxfehler der SQL-Anweisung
1158: Netzwerkfehler, Lesefehler, bitte überprüfen Sie den Netzwerkverbindungsstatus
1159: Netzwerkfehler, Lese-Timeout, bitte überprüfen Sie den Netzwerkverbindungsstatus
1160: Netzwerkfehler, Schreibfehler aufgetreten, bitte überprüfen Sie den Netzwerkverbindungsstatus
1161: Netzwerkfehler, Schreib-Timeout, bitte überprüfen Sie den Netzwerkverbindungsstatus
1062: Feldwert wiederholt sich, Speicherung fehlgeschlagen
1169: Feldwert ist dupliziert, Datensatzaktualisierung fehlgeschlagen
1177: Die Datentabelle konnte nicht geöffnet werden
1180: Transaktionscommit fehlgeschlagen
1181: Rollback-Transaktion fehlgeschlagen
1203: Die Anzahl der Verbindungen zwischen dem aktuellen Benutzer und der Datenbank hat die maximale Anzahl von Verbindungen für die Datenbank erreicht. Bitte erhöhen Sie die Anzahl der verfügbaren Datenbankverbindungen oder starten Sie die Datenbank neu.
1205: Zeitüberschreitung der Sperre
1211: Der aktuelle Benutzer hat keine Berechtigung, einen Benutzer zu erstellen
1216: Überprüfung der Fremdschlüsseleinschränkung fehlgeschlagen, Aktualisierung des Datensatzes der untergeordneten Tabelle fehlgeschlagen
1217: Überprüfung der Fremdschlüsseleinschränkung fehlgeschlagen, Löschen oder Ändern von Datensätzen der Primärtabelle fehlgeschlagen
1226: Die vom aktuellen Benutzer verwendeten Ressourcen haben die zulässigen Ressourcen überschritten. Bitte starten Sie die Datenbank oder den Server neu.
1227: Unzureichende Berechtigungen. Sie haben keine Berechtigung, diesen Vorgang auszuführen.
1235: Die MySQL-Version ist zu niedrig und verfügt nicht über diese Funktion.

Überwachungsskript kopieren

Modifiziert auf Grundlage des Originaltextes.

Originalskript

#!/bin/bash
#
#check_mysql_slave_replication_status
#
#
#
parasum=2
Hilfenachricht(){
 
Katze <<
 helfen
+---------------------+
+Fehler
 Ursache:
+Sie
 muss $parasum-Parameter eingeben!
+1.
 : Host_IP
+2.
 : Host_Port
helfen
Ausfahrt
}
 
[
 $#
 -ne ${parasum} ] && help_msg #Wenn die Parameter nicht ausreichen, drucken Sie die Hilfeinformationen aus und beenden Sie den Vorgang export HOST_IP=$1
exportiere HOST_PORT=$2
MYUSER="Wurzel"     
MYPASS="123456"
 
MYSQL_CMD="mysql
 -u$MEINBENUTZER -p$MEINPASS"
MailTitle="" #Mail-Betreff Mail_Address_MysqlStatus="[email protected]" #Empfängerpostfach time1=$(date +"%Y%m%d%H%M%S")
Zeit2 = $ (Datum + "% Y-% m-% d
 %H:%M:%S")
 
SlaveStatusFile=/tmp/salve_status_${HOST_PORT}.${time1} 
#Die Datei, in der sich der E-Mail-Inhalt befindet echo "--------------------Begin
 um: "$time2
 > $SlaveStatusFile
echo "" >>
 $SlaveStatusFile
 
#erhalten
 Slave-Status
${MYSQL_CMD}
 -e "zeigen
 Slave-Status\G" >>
 $SlaveStatusFile #Status des Salve-Prozesses abrufen#get
 io_thread_status,sql_thread_status,last_errno Holen Sie sich den folgenden Statuswert IOStatus=$(cat $SlaveStatusFile|grep Slave_IO_Running|awk '{print
 $2}')
SQLStatus=$(cat $SlaveStatusFile|grep Slave_SQL_Running
 |awk '{drucken
 $2}')
  Fehlernummer=$(cat $SlaveStatusFile|grep Last_Errno
 | awk '{drucken
 $2}')
  Dahinter=$(cat $SlaveStatusFile|grep Sekunden_Dahinter_Master
 | awk '{drucken
 $2}')
 
echo "" >>
 $SlaveStatusFile
 
Wenn [
"$IOStatus" ==
"NEIN" ]
 || [ "$SQLStatus" ==
"Nein" ]; dann #Beurteilen Sie den Fehlertyp, wenn [
"$Errno" -eq 0
 ]; dann #Vielleicht wurde der Server-Thread nicht gestartet $MYSQL_CMD
 -e "beginnen
 Slave-IO_Thread;Slave-SQL_Thread starten;"
      echo "Ursache
 Slave-Threads werden nicht ausgeführt. Versuch, slsave io_thread zu starten; starte Slave sql_thread;" >>
 $SlaveStatusFile
      MailTitle="[Warnung]
 Slave-Threads wurden auf $HOST_IP $HOST_PORT gestoppt"
    elif [
"$Errno" -eq 1007
 ] || [ "$Errno" -eq 1053
 ] || [ "$Errno" -eq 1062
 ] || [ "$Errno" -eq 1213
 ] || [ "$Errno" -eq 1032
 ]\
      ||
 [ "Fehlernummer" -eq 1158
 ] || [ "$Errno" -eq 1159
 ] || [ "$Errno" -eq 1008
 ]; dann #Diese Fehler ignorieren $MYSQL_CMD
 -e "stoppen
 Sklave; setze globalen sql_slave_skip_counter=1; starte Sklave;"
      echo "Ursache
 Fehler bei der Slave-Replikation werden abgefangen. Es wird versucht, den Zähler zu überspringen und den Slave neu zu starten. Stoppen Sie den Slave. Setzen Sie den globalen sql_slave_skip_counter auf 1. Starten Sie den Slave. " >>
 $SlaveStatusFile
      MailTitle="[Warnung]
 Slave-Fehler bei $HOST_IP $HOST_PORT! ErrNum: $Errno"
    anders
      Echo "Sklave
 $HOST_IP $HOST_PORT ist down!" >>
 $SlaveStatusFile
      MailTitle="[FEHLER]Slave
 Replikation ist auf $HOST_IP $HOST_PORT ausgefallen! ErrNum:$Errno"
    fi
fi
Wenn [
 -n "$Behind" ];dann
    Dahinter=0
fi
echo "$Hinter" >>
 $SlaveStatusFile
 
#Verzögerung
 hinter dem Master bestimmt die Verzögerungszeit, wenn [
 $Hinter -gt 300 ];dann
  echo `Datum +"%Y-%m%d
 %H:%M:%S"`
"Sklave
 liegt hinter Master $Bebind Sekunden!" >>
 $SlaveStatusFile
  MailTitle="[Warnung]Slave
 Verzögerung $Behind Sekunden, von $HOST_IP $HOST_PORT"
fi
 
Wenn [
 -n "$MailTitle" ]; dann #Wenn ein Fehler auftritt oder die Verzögerung länger als 300 s ist, senden Sie eine E-Mail cat ${SlaveStatusFile}
 | /bin/mail -s
"$MailTitle" $Mail_Address_MysqlStatus
fi
 
#entfernen
 tmp-Datei:SlaveStatusFile
>
 $SlaveStatusFile

Geändertes Skript

Es wurde nur einfach aufgeräumt und die Beurteilung, dass „Behind“ NULL war, korrigiert, es wurde jedoch kein Test durchgeführt.

Erwägen Sie das Hinzufügen von:

Beurteilung des Ergebnisses der Reparaturdurchführung; zyklische Reparatur, Erkennung und Behebung mehrerer Fehler?

Brechen Sie die temporäre Datei „SlaveStatusFile“ ab.

Die Errno- und Behind-Alarme werden separat per E-Mail gesendet und der Alarmtext wird mit dem Originaltext des Show-Slave-Ergebnisses hinzugefügt.

Erhöhen Sie PATH, damit es zu Crontab hinzugefügt werden kann.

Periodische Ausführung in Crontab berücksichtigen (Sperren zur Vermeidung von Ausführungskonflikten, Auswahl des Ausführungszyklus)

Ausführungsprotokoll hinzufügen?

#!/bin/sh
#
 check_mysql_slave_replication_status
#
 Referenz: http://www.tianfeiyu.com/?p=2062
 
Verwendung(){
  echo Verwendung:
  echo "$0
 HOST-PORT-BENUTZERPASS"
}
 
[
 -z "$1" -o
 -z "$2" -o
 -z "$3" -o
 -z "$4" ]
 && Verwendung && exit 1
HOST=$1
PORT=$2
USER=$3
PASS=$4
 
MYSQL_CMD="mysql
 -h$HOST -P$PORT -u$BENUTZER -p$PASS"
 
MailTitle="" #Mail-Betreff Mail_Address_MysqlStatus="[email protected]" #Empfängerpostfach time1=$(date +"%Y%m%d%H%M%S")
Zeit2 = $ (Datum + "% Y-% m-% d
 %H:%M:%S")
 
SlaveStatusFile=/tmp/salve_status_${HOST_PORT}.${time1} 
#Die Datei, in der sich der E-Mail-Inhalt befindet echo "--------------------Begin
 um: "$time2
 > $SlaveStatusFile
echo "" >>
 $SlaveStatusFile
 
#erhalten
 Slave-Status
${MYSQL_CMD}
 -e "zeigen
 Slave-Status\G" >>
 $SlaveStatusFile #Status des Salve-Prozesses abrufen#get
 io_thread_status,sql_thread_status,last_errno Holen Sie sich den folgenden Statuswert IOStatus=$(cat $SlaveStatusFile|grep Slave_IO_Running|awk '{print
 $2}')
SQLStatus=$(cat $SlaveStatusFile|grep Slave_SQL_Running
 |awk '{drucken
 $2}')
  Fehlernummer=$(cat $SlaveStatusFile|grep Last_Errno
 | awk '{drucken
 $2}')
  Dahinter=$(cat $SlaveStatusFile|grep Sekunden_Dahinter_Master
 | awk '{drucken
 $2}')
 
echo "" >>
 $SlaveStatusFile
 
Wenn [
"$IOStatus" =
"Nein" -o
"$SQLStatus" =
"Nein" ]; dann
  Fall "$Errno" in
  0)
    #
 Es kann sein, dass der Slave $MYSQL_CMD nicht gestartet hat
 -e "beginnen
 Slave-IO_Thread;Slave-SQL_Thread starten;"
    echo "Ursache
 Slave-Threads werden nicht ausgeführt. Versuch, slsave io_thread zu starten; starte Slave sql_thread;" >>
 $SlaveStatusFile
    ;;
  1007|1053|1062|1213|1032|1158|1159|1008)
    #
 Ignorieren Sie diese Fehler $MYSQL_CMD
 -e "stoppen
 Sklave; setze globalen sql_slave_skip_counter=1; starte Sklave;"
    echo "Ursache
 Fehler bei der Slave-Replikation werden abgefangen. Es wird versucht, den Zähler zu überspringen und den Slave neu zu starten. Stoppen Sie den Slave. Setzen Sie den globalen sql_slave_skip_counter auf 1. Starten Sie den Slave. " >>
 $SlaveStatusFile
    MailTitle="[Warnung]
 Slave-Fehler auf $HOST:$PORT! ErrNum: $Errno"
    ;;
  *)
    echo "Sklave
 $HOST:$PORT ist down!" >>
 $SlaveStatusFile
    MailTitle="[FEHLER]Slave
 Replikation ist auf $HOST:$PORT ausgefallen! Errno:$Errno"
    ;;
  esac
fi
 
Wenn [
"$Behind" =
"NULL" -o
 -z "$Behind" ];dann
  Dahinter=0
fi
echo "Hinter:$Hinter" >>
 $SlaveStatusFile
 
#Verzögerung
 hinter dem Master bestimmt die Verzögerungszeit, wenn [
 $Hinter -gt 300 ];dann
  echo `Datum +"%Y-%m%d
 %H:%M:%S"`
"Sklave
 liegt hinter Master $Bebind Sekunden!" >>
 $SlaveStatusFile
  MailTitle="[Warnung]Slave
 Verzögerung $Behind Sekunden, von $HOST $PORT"
fi
 
Wenn [
 -n "$MailTitle" ]; dann #Wenn ein Fehler auftritt oder die Verzögerung länger als 300 s ist, senden Sie eine E-Mail cat ${SlaveStatusFile}
 | /bin/mail -s
"$MailTitle" $Mail_Address_MysqlStatus
fi
 
#entfernen
 tmp-Datei:SlaveStatusFile
>
 $SlaveStatusFile

Die obige Zusammenfassung der Online-Methoden zur Fehlerbehebung bei MySQL-Synchronisierungsfehlern (unbedingt lesen) ist der gesamte Inhalt, den der Herausgeber mit Ihnen teilt. Ich hoffe, dass er Ihnen als Referenz dienen kann, und ich hoffe auch, dass Sie 123WORDPRESS.COM unterstützen werden.

Das könnte Sie auch interessieren:
  • So überprüfen Sie MySQL-Sperren mit dem Befehl „MySQL Show Processlist“
  • mysql show processlist zeigt den MySQL-Abfrageprozess an
  • Eine Lösung für das MySQL-Master-Slave-Synchronisationsproblem
  • Eine langsame MySQL-Abfrage verursachte einen Fehler
  • Super-Deployment-Tutorial zur MHA-Hochverfügbarkeits-Failover-Lösung unter MySQL
  • Übersicht, Installation, Fehlerbehebung, Tipps und Tools zur MySQL-Replikation (geteilt von Huo Ding)
  • Methoden zum Erkennen von MySQL-Tabellenfehlern
  • Häufige Fehler und Gründe für MySQL-Verbindungsfehler
  • MySQL SHOW PROCESSLIST unterstützt den gesamten Prozess der Fehlerbehebung

<<:  JS ermittelt die Position des n-ten Vorkommens einer angegebenen Zeichenfolge in einer Zeichenfolge

>>:  Detaillierte Erläuterung der FTP-Serverkonfiguration und 425-Fehler- und TLS-Warnlösungen für FileZilla Server

Artikel empfehlen

Details zur Destrukturierungszuweisung in Javascript

Inhaltsverzeichnis 1. Array-Dekonstruktion 2. Obj...

MySQL-Abfragedaten stündlich, geben Sie 0 ein, wenn keine Daten vorhanden sind

Nachfragehintergrund Als statistische Schnittstel...

Codebeispiele für den Import und Export von Docker-Images

Import und Export von Docker-Images Dieser Artike...

Analyse und Lösung zur Leistungsoptimierung von Vue.js-Anwendungen

Inhaltsverzeichnis 1. Einleitung 2. Warum brauche...

Beispielcode für einen coolen Atemeffekt mit CSS3+JavaScript

Ein einfacher cooler Effekt, der mit CSS3-Animati...

Nginx verwendet Lua+Redis, um IP dynamisch zu blockieren

1. Hintergrund Bei unserer täglichen Website-Wart...

Ein vorläufiges Verständnis der benutzerdefinierten CSS-Eigenschaften

Heute sind CSS-Präprozessoren der Standard für di...

MySQL-Operationen: Operationen mit JSON-Datentyp

Im vorherigen Artikel haben wir das ausführliche ...

Mybatis-Implementierungsmethode für Fuzzy-Abfragen

Mybatis-Implementierungsmethode für Fuzzy-Abfrage...

CSS3 realisiert den leuchtenden Randeffekt

Wirkung der Operation: html <!-- Dieses Elemen...

Verwendung des Array-Filters filter() in JS

Inhaltsverzeichnis 1. Einleitung 2. Einführung in...