Остановилась MySQL репликация на слейве (version 5.1.61). Slave_IO_Running было отмечено как Yes, но Slave_SQL_Running как No. Обычный перезапуск слейва не помог, значит требуется более детальный анализ проблемы. Похоже на то что повреждены relay логи слейва, т.к. тестирование с помощью “mysqlbinlog” показало ошибку. Следовательно, решением должно быть удаление текущих бинлогов слейва и указание слейву позиции с которой нужно продолжить репликацию из бинлогов мастера.

Вот полный вывод команды “show slave status\G” на остановившемся слейв сервере:

{loadposition ads}

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
Slave_IO_State: Waiting for master to send event
Master_Host: 10.1.79.48
Master_User: replica
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.002046
Read_Master_Log_Pos: 639600842
Relay_Log_File: triton-relay-bin.001957
Relay_Log_Pos: 243
Relay_Master_Log_File: mysql-bin.002045
Slave_IO_Running: Yes
Slave_SQL_Running: No
Replicate_Do_DB: pretinac_radio,web
Replicate_Ignore_DB: 
Replicate_Do_Table: 
Replicate_Ignore_Table: web.logging_www,web.logging_raspored,web.web_korisnik
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: 103641119
Relay_Log_Space: 983411603
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: [the same error description as in Last_Error]

Для исправления этой ошибки нужно сбросить текущий бинлог слейва и указать позицию, с которой нужно продолжить репликацию. До этого важно запомнить два параметра, которые мы видели выше в выводе статуса на слейве, это Relay_Master_Log_File и Exec_Master_Log_Pos:

1
2
Relay_Master_Log_File: mysql-bin.002045
Exec_Master_Log_Pos: 103641119

Замечательно, зная эти данные мы можем продолжить репликацию:

останавливаем слейв

mysql> stop slave;

говорим слейву забыть позицию репликации и очистить бинлоги

mysql> reset slave;

говорим слейву откуда ему нужно начать репликацию, указываем позицию, на которой остановились

mysql> change master to master_log_file='mysql-bin.002045', master_log_pos=103641119;

запускаем слейв

mysql> start slave;

1
Для информации: "reset slave" удаляет master.info, relay-log.info и все файлы relay логов, поэтому нам не нужно вручную очищать директорию /var/lib/mysql (или где у вас там БД с логами хранятся). После всех указанных команд слейв должен переподключиться к мастеру и продолжить репликацию (о чём можно судить по значению Seconds_Behind_Master, которое уже не равно нулю). Более полную информацию по "reset slave" можно прочитать в статье RESET SLAVE Syntax. Статья взята с сайта www.redips.net и переведена.