Kod korišćenja MySQL Master-Slave (ili Master-Master) replikacije, često se dešava da je verzija slajva niža od verzije mastera iz različitih razloga.
Ako se pritom koristi opcija binlog_format=MIXED, može doći do situacije da master zapiše u svoj binlog zapis sledećeg oblika:
BINLOG 'XMawShMEAAAARwAAAEp5UwUAAGkAAAAAAAAACHNhblahblahblah'
Koji slajv neće moći da izvrši, jer ga jednostavno „još ne razume“.
Prvi znak da se ovo desilo biće poruka „SLAVE DOWN“ od sistema za monitoring i zapis u MySQL logu slajva sličan ovom:
090917 14:55:51 [ERROR] Error in Log_event::read_log_event(): 'Found invalid event in binary log', data_len: 71, event_type: 19
090917 14:55:51 [ERROR] Error reading relay log event: slave SQL thread aborted because of I/O error
090917 14:55:51 [ERROR] Slave: 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' o
n 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. Error_code: 0
090917 14:55:51 [ERROR] Error running query, slave SQL thread aborted. Fix the problem, and restart the slave SQL thread with "SLAVE START". We stopped at log 'bin-us1.000022' position 17007149
Pokušaji da se preskoče nepoželjni zapisi starim dobrim metodom:
slave stop;
set global sql_slave_skip_counter=1;
slave start;
u ovom slučaju ne pomažu.
Kao predlog za rešenje, nudim sledeće:
Zaustavite slajv: „SLAVE STOP;“
Izvadite ime binloga i poziciju na kojoj je došlo do greške iz teksta greške.
U ovom slučaju to su bin-us1.000022 i pozicija 17007149.
Na masteru izvršite upit „FLUSH LOGS;“
Napravite dump binloga počevši od pronađene pozicije:
mysqlbinlog --start-position=17007149 bin-us1.000022 > bin-us1-from17007149.sql
Učitajte dobijeni dump na slajvu sa opcijom „–force“
mysql --force -uuser -ppassword database < bin-us1-from17007149.sql
Na slajvu izvršite „FLUSH LOGS;“
U data direktorijumu pronađite relay-log sa najvećim brojem i veličinom od oko 100 bajtova (u mom slučaju to je mysqld-relay-bin.000037)
U istoj direktorijumu, u fajlu relay-log.info
prvu liniju zamenite imenom upravo pronađenog relay-log-a, u drugu unesite 0, u treću – sledeći binlog nakon „oštećenog“, a u četvrtu – 0.
Dobiće se nešto poput:
/var/lib/mysql/mysqld-relay-bin.000037
0
bin-us1.000023
0
Zatim na slajvu izvršite:
CHANGE MASTER TO MASTER_LOG_FILE='bin-us1.000023', MASTER_LOG_POS=0;
SLAVE START;
I na kraju, da biste se uverili da je sve uspešno pokrenuto,
SHOW SLAVE STATUS\G
