dimecres, 9 de març de 2016

MySQL Slave out of sync: first log file name in binary log index file missing

Disposem de dues màquines amb MySQL configurades a una xarxa local, una està configurada com a master i l'altra com a slave. El slave presenta el següent problema:
MariaDB [(none)]> show slave status \G;
...
Last_IO_Error: Got fatal error 1236 from master when reading data 
               from binary log: 'Could not find first log file name 
               in binary log index file'
...
Si revisem la configuració del slave veurem que necessita el mysql-bin.000009 que deuria estar enmagatzemat en el master.
MariaDB [(none)]> show slave status \G;
...
Relay_Master_Log_File: mysql-bin.000009
...
Però en els binary logs enmagatzemats del master aquest fitxer no existeix.
ls /var/log/mysql
error.log error.log.2.gz   mysql-bin.000014  mysql-bin.index
error.log.1.gz mysql-bin.000013  mysql-bin.000015
Açò es deu que en el fitxer de configuració /etc/mysql/my.cnf hi ha configurada la següent entrada:
expire_logs_days        = 10
Açò provoca que si la màquina ha estat parada durant un temps, els binary logs s'han purgat i ara el slave no pot sincronitzar-se amb tota la informació del master.També es pot donar el cas que algú haja realitzat un purgat de binary logs accidentals en el master. L'única manera de recuperar tota la info del slave és: sincronitzar-lo des d'un altre slave o utilitzant un backup del master.

En en el nostre cas recuperarem la sincronització master-slave utilitzant un backup del master. El procediment es el següent (aquestes comandes s'han executat al master):
MariaDB [(none)]> reset master;
Query OK, 0 rows affected (0.38 sec)
MariaDB [(none)]> flush tables with read lock;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |      312 |              | mysql            |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
Una volta hem reinicialitzat el binary logs del master realitzem un backup de la base de dades.
mysqldump -uroot -p --all-databases > restore_slave_failure.sql
Desbloquegem les taules,
MariaDB [(none)]> unlock tables;
Transferim el backup a la màquina slave.
scp restore_slave_failure.sql user@192.168.122.3:~/
user@192.168.122.3's password: 
A partir d'ací executem les comandes en el slave. El primer que farem serà restaurar el backup.
mysql -uroot -p < restore_slave_failure.sql 
Enter password: 
Parem el slave.
MariaDB [(none)]> stop slave;
Query OK, 0 rows affected (0.09 sec)
Reinicialitzem tots els valors del slave.
MariaDB [(none)]> reset slave;
Query OK, 0 rows affected (0.01 sec)
Configurem el slave per a que apunte a la posció actual del master.
MariaDB [(none)]> CHANGE MASTER TO 
                  MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=312;
Arranquem el slave de nou.
MariaDB [(none)]> start slave;
Query OK, 0 rows affected (0.09 sec)
Si comprobem l'estat del slave estarà ja funcionant de nou.
MariaDB [(none)]> show slave status\G;
...
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
...

Enllaços:

https://www.percona.com/blog/2014/10/08/mysql-replication-got-fatal-error-1236-causes-and-cures/
http://stackoverflow.com/questions/2366018/how-to-re-sync-the-mysql-db-if-master-and-slave-have-different-database-incase-o

Cap comentari:

Publica un comentari a l'entrada