MySQL Master Binlog Beschädigung

7

Wir haben kürzlich einige Änderungen an unserer Infrastruktur vorgenommen und jetzt kann ich die MySQL-Replikation nicht mehr ausführen. Der Slave beschwert sich über ein beschädigtes Binlog und das Zurücksetzen hilft nicht. Ich sehe immer wieder Einträge wie diesen in meinem Hauptprotokoll:

BINLOG '
WFxKTRNJAAAAPwAAAKY / YwAAABsAAAAAAAEACHdlYmVkaTMwAA1QYXJ0bmVyQ29uZmlnAAQICA8P
BC0AYwAA
WFxKTRhJAAAAXAAAAAJAYwAAABsAAAAAAAEABP // 8BoSAAAAAAAAggMAAAAAAAAJUEFDS0NPVU5U
Azc3MfAaEgAAAAAAAIIDAAAAAAAACVBBQ0tDT1VOVAM3NzI =
'/ *! * /;

Im Slave-Protokoll wird dies nur als "Unbekanntes Ereignis" angezeigt, und die Replikation schlägt an dieser Position fehl.

Hier ist meine my.cnf für den Master:

[mysqld]
datadir = / data / mysql-data
Socket = / tmp / mysql.sock
user = mysql
log-error = / var / log / mysqld.log

binlog-do-db = db1
binlog-do-db = db2
binlog-do-db = db3
binlog-do-db = db4
binlog_format = 'MIXED'

log-bin = /data/mysql-binlogs/mysql-bin.log
Server-ID = 73
report-host = thisserver.mydomain.com

thread_cache_size = 30
key_buffer_size = 700M
myisam_sort_buffer_size = 300M
table_cache = 256
sort_buffer_size = 4M
read_buffer_size = 1M
innodb_data_home_dir = / data / mysql-data /
innodb_data_file_path = InnoDB: 100M: Autoextend
set-variable = innodb_buffer_pool_size = 500M
set-variable = innodb_additional_mem_pool_size = 10M
set-variable = max_connections = 500
innodb_log_group_home_dir = / data / mysql-data
set-variable = innodb_log_file_size = 20M
set-variable = innodb_log_buffer_size = 8M
innodb_flush_log_at_trx_commit = 1

Weiß jemand, was den Kauderwelsch in meinen Master-Binlogs verursachen könnte?

Nick Chammas
quelle

Antworten:

8

Überraschenderweise ist das kein Kauderwelsch.

Dies wird in der Tat oben in binlogs angezeigt, wenn Sie mysqlbinlog für ein mit MySQL 5.1 und MySQL 5.5 generiertes binäres Protokoll ausführen. Sie werden diesen Kauderwelsch in Binärprotokollen für MySQL 5.0 und zurück nicht sehen.

Aus diesem Grund ist der Startpunkt für die Replikation aus einem leeren Binärprotokoll

  • 107 für MySQL 5.5
  • 106 für MySQL 5.1
  • 98 für MySQL 5.0 und zurück

Dies ist gut zu beachten, wenn Sie MySQL Replication ausführen, wobei der Master, wenn MySQL 5.1 und der Slave MySQL 5.0 ist. Dies könnte sehr große Kopfschmerzen verursachen.

Die Replikation vom Master mit 5.0 und vom Slave mit 5.1 funktioniert einwandfrei, nicht umgekehrt. (Laut MySQL-Dokumentation wird sie im Allgemeinen aus drei Gründen nicht unterstützt: 1) Binäres Protokollformat, 2) zeilenbasierte Replikation, 3) SQL-Inkompatibilität ).

Führen Sie auf jeden Fall ein mysqlbinlog für das fehlerhafte Binärprotokoll auf dem Master aus. Wenn der resultierende Dump in der Mitte des Dumps Kauderwelsch erzeugt (was ich in meiner DBA-Karriere einige Male gesehen habe), müssen Sie möglicherweise zu Position 98 (MySQL 5.0) oder 106 (MySQL 5.1) oder 107 (MySQL 5.5) springen. des nächsten Binärprotokolls des Masters und starten Sie die Replikation von dort aus (SOB :( Möglicherweise müssen Sie die MAATKIT-Tools mk-table-Prüfsumme und mk-table-sync verwenden, um Masteränderungen nicht auf dem Slave neu zu laden [wenn Sie ein Held sein möchten] ; Schlimmer noch, mysqldump der Master und lade den Slave neu und starte die Replikation komplett von vorne [wenn du kein Held sein willst])

Wenn das mysqlbinlog des Masters nach dem oberen Kauderwelsch, den Sie gesehen haben, vollständig lesbar ist, ist das Binärprotokoll des Masters möglicherweise in Ordnung, aber das Relaisprotokoll auf dem Slave ist beschädigt (aufgrund von Übertragungs- / CRC-Fehlern). Wenn dies der Fall ist, laden Sie einfach die Relaisprotokolle neu, indem Sie den Befehl CHANGE MASTER TO wie folgt ausführen:

STOP SLAVE;
CHANGE MASTER TO
MASTER_HOST='< master-host ip or DNS >',
MASTER_PORT=3306,
MASTER_USER='< usernmae >',
MASTER_PASSWORD='< password >',
MASTER_LOG_FILE='< MMMM >',
MASTER_LOG_POS=< PPPP >;
START SLAVE;

Wo

  • MMMM ist die letzte vom Master verwendete Datei, die zuletzt auf dem Slave verarbeitet wurde
  • PPPP ist die letzte Position des Masters, die zuletzt auf dem Slave verarbeitet wurde

Sie können MMMM und PPPP erhalten, indem Sie dies tun SHOW SLAVE STATUS\Gund verwenden

  • Relay_Master_Log_File für MMMM
  • Exec_Master_Log_Pos für PPPP

Probieren Sie es aus und lassen Sie es mich wissen !!!

Wenn Sie den Befehl CHANGE MASTER TO ausführen, werden die aktuellen Relaisprotokolle des Slaves gelöscht und neu gestartet.

RolandoMySQLDBA
quelle
Die Sache ist jedoch, dass wir diese Zeilen von "Kauderwelsch" überall in unserem Master-Binlog sehen. Ihre Aussage, dass unser Master> 5.0 und unser Slave = 5.0 ist, ist absolut richtig. Ich werde sehen, wie wir unseren Slave auf 5.1 aktualisieren (genau wie der Master) und von vorne anfangen, um zu sehen, wie das geht.
Ihr Vorschlag zur Aktualisierung des Slaves hat perfekt funktioniert. Danke für deine Hilfe.