MySQL / MariaDB – Replikation – Relay log read failure: Could not parse relay log event entry.

Bei einer Master-Slave-Replikation vom MySQL bzw. MariaDB kann es unter bestimmten Vorraussetzungen zu folgenden Fehlerbild kommen.

Die Replikation funktioniert nicht mehr, weil das entsprechenden Relay-Log-File defekt ist.

Relay log read failure

Nach der Eingabe von

mysql> SHOW SLAVE STATUS\G

Erscheint folgende Fehlermeldung:

...
Last_Error: Relay log read failure: Could not parse relay log event entry. The possible reasons are: the master's binary log is corrupted (you can check this by running 'mysqlbinlog' on the binary log), the slave's relay log is corrupted (you can check this by running 'mysqlbinlog' on the relay log), a network problem, or a bug in the master's or slave's MySQL code. If you want to check the master's binary log or slave's relay log, you will be able to know their names by issuing 'SHOW SLAVE STATUS' on this slave.
...

Die passiert unter anderem wenn das Slave-System unkontrolliert beendet wurde, das kann z.B. bei einem Reset des Servers der Fall sein. Das Relay-Log wird nicht vollständig auf die Platte geschrieben wie es bei einem normalen Stop des Datenbankservers der Fall gewesen wäre. Der „Datenmüll“ ist nun für unser Slave-Server nicht mehr verwertbar und eine Replikation ist somit nicht mehr möglich.

Retten können wir das System folgendermaßen.

Zuerst stoppen wir den Slave

mysql> STOP SLAVE;

und lassen wir uns nochmals alle wichtigen Informationen zum Status der Replikation ausgeben.

mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
               Slave_IO_State:
                  Master_Host: x.x.x.x
                  Master_User: replikatoruser
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysqld-bin.006432
          Read_Master_Log_Pos: 688908797
               Relay_Log_File: slave-relay.004257
                Relay_Log_Pos: 945811289
        Relay_Master_Log_File: mysqld-bin.006430
             Slave_IO_Running: No
            Slave_SQL_Running: No
              Replicate_Do_DB:
          Replicate_Ignore_DB: information_schema
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 1594
                   Last_Error: Relay log read failure: Could not parse relay log event entry. The possible reasons are: the master's binary log is corrupted (you can check this by running 'mysqlbinlog' on the binary log), the slave's relay log is corrupted (you can check this by running 'mysqlbinlog' on the relay log), a network problem, or a bug in the master's or slave's MySQL code. If you want to check the master's binary log or slave's relay log, you will be able to know their names by issuing 'SHOW SLAVE STATUS' on this slave.
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 945811142
              Relay_Log_Space: 2752894101
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File:
           Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
               Master_SSL_Key:
        Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 1594
               Last_SQL_Error: Relay log read failure: Could not parse relay log event entry. The possible reasons are: the master's binary log is corrupted (you can check this by running 'mysqlbinlog' on the binary log), the slave's relay log is corrupted (you can check this by running 'mysqlbinlog' on the relay log), a network problem, or a bug in the master's or slave's MySQL code. If you want to check the master's binary log or slave's relay log, you will be able to know their names by issuing 'SHOW SLAVE STATUS' on this slave.
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 1
1 row in set (0.00 sec)

Wichtig sind für uns nun die Einträge Relay_Master_Log_File und Exec_Master_Log_Pos diese solle man sich genau notieren.

...
Relay_Master_Log_File: mysqld-bin.006430
...
Exec_Master_Log_Pos: 945811142
...

Nun setzen wir den Slave zurück und löschen somit alle Relay-Logs.

mysql> RESET SLAVE;

Jetzt Konfigurieren wir den Slave neu und setzten genau an der Stelle an, an der die Replikation abgebrochen wurde. Dazu benötigen wir die notierten Werte Relay_Master_Log_File und Exec_Master_Log_Pos.

mysql> CHANGE MASTER TO MASTER_LOG_FILE='Relay_Master_Log_File', MASTER_LOG_POS=Exec_Master_Log_Pos;

In unserem konkreten Fall ist das

mysql> CHANGE MASTER TO MASTER_LOG_FILE='mysqld-bin.006430', MASTER_LOG_POS=945811142;

Nach dem die Replikation wieder gestartet wurde sendet uns der Master wieder ein entsprechendes Binär-Log und die Replikation sollte wieder wie gewohnt laufen.

mysql> START SLAVE
mysql> SHOW SLAVE STATUS\G
...
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
...

Wie immer lohnt auch ein Blick in die Dokumentation von MySQL.

 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.