MariaDB replikering: Korrupt binær log på slave

(Last Updated On: 2. marts 2018)

Denne meddelelse i SHOW SLAVE STATUS betyder at den binære log på enten master eller slave er korrupt:

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.

Start med at notere dig følgende:

Tjek logfilerne på master og slave

Nu tjekker du slavens aktuelle relay log. Se Relay_Log_File. På Ubuntu ligger den under /var/lib/mysql:

mysqlbinlog oversætter den binære log til tekst, og du vil derfor se en masse fare hen over skærmen. Det kan godt tage tid hvis filen er stor. Når den stopper, kigger du efter en fejlmeddelelse:

I dette tilfælde er det slavens binære log der er korrupt. Og det er heldigt, for det kan vi nemt fikse.

Tjek også masterens binære log, som i mit tilfælde ligger under /var/log/mysql:

Slavens log er korrupt

Hvis det er slavens log der indeholder fejl, gør du følgende på slaven:

!!! BEMÆRK !!!
• RESET SLAVE ALL nulstiller bl.a. alle MASTER oplysningerne, så dem skal du have parat. Hvis du ikke har adgangskoden til din master bruger, kan du lige starte med at ændre den med ALTER USER bruger@'host' IDENTIFIED BY 'kode' både på master og slave… og husk FLUSH PRIVILEGES.
• Værdien MASTER_LOG_POS skal du tage fra Exec_Master_Log_Pos, og MASTER_LOG_FILE er Relay_Master_Log_File, som du noterede dig tidligere.

Æren for ovenstående løsning, går til dette svar : https://dba.stackexchange.com/a/75200/127493

Masterens log er korrupt

Hvis masterens log er korrupt, kan slaven ikke læse den. Drejer det sig om et enkelt statement i loggen, kan du fikse det ved at få slaven til at skippe den. Men du bør først overveje hvilke konsekvenser det manglende data kan have for de efterfølgende statements slaven modtager.

Du kan se i indlægget MariaDB replikering: Når replikeringen fejler hvordan du skipper et statement eller starter slaven forfra ved at indlæse et fuldt dump fra masteren.