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. 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. 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. 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. 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 Slave: Endpaket vom Server empfangen, offensichtliches Herunterfahren des Masters: 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. 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; 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; 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 Slave_SQL_Running: Schreibvorgang ausführen Relay_Master_Log_File 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 Maatkit-Toolkit 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 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 Ü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:
|
Verknüpfung: https://qydev.weixin.qq.com/wiki/ind...
Vorwort Ich habe vor Kurzem :first-child in einem...
Inhaltsverzeichnis 1. Array-Dekonstruktion 2. Obj...
Nachfragehintergrund Als statistische Schnittstel...
Import und Export von Docker-Images Dieser Artike...
Im Tabellenkopf können Sie die dunkle Rahmenfarbe...
Inhaltsverzeichnis 1. Einleitung 2. Warum brauche...
Ein einfacher cooler Effekt, der mit CSS3-Animati...
1. Hintergrund Bei unserer täglichen Website-Wart...
Heute sind CSS-Präprozessoren der Standard für di...
Im vorherigen Artikel haben wir das ausführliche ...
Nur 15 Zeilen CSS und Ihr iPhone stürzt ab Der Si...
Mybatis-Implementierungsmethode für Fuzzy-Abfrage...
Wirkung der Operation: html <!-- Dieses Elemen...
Inhaltsverzeichnis 1. Einleitung 2. Einführung in...