30 декабря 2010

Восстановление репликации после сбоя

Если команда не может быть выполнена на слейве или же выполнена с ошибкой, то репликация приостанавливается. Бинарный лог на мастере при этом продолжает вестить. Более того, этот бинарный лог передается slave-базе данных, которая записывает его в так называемый relay-log. Таким образом, на слейв передаются те запросы, которые должны быть на нем выполены, но реально они не выполняются, а только "складируются".

Гарантией того, что слейв продолжает получать бинарный лог со стороны мастера служит то, что обновяется поле Read_Master_Log_Pos в выборке SHOW SLAVE STATUS. И это значание должно быть равным значению Position в выборке SHOW MASTER STATUS на мастере.

Командой SHOW SLAVE STATUS можем посмотреть ошибку и запрос, который ее вызвал, название файла relay-лога и его позицию в момент возникновения ошибки. Например:

Relay_Log_File: localunix-relay-bin.000012
Relay_Log_Pos: 251

Смотрим файл:
mysqlbinary localunix-relay-bin.000012 | less

и находим строку
# at 251

Чуть ниже будет видна команда, которая вызвала ошибку. После устранения причины возникновения ошибки, даем команду START SLAVE, и наш слейв возобновит обработку relay-лога с 251-ой позиции.

Если, например, мы не хотим выполнять текущую команду, а "перепрыгнуть" через нее, тогда нужно остановить слейв - STOP SLAVE, воспользоваться командой CHANGE MASTER TO RELAY_LOG_POS=$position; и запустить слейв заново - START SLAVE; Значение $position - это следующая позиция в релей-бин-логе на слейве.

Кроме того, содержимое binary/relay лога можно напрямую послать на выполнение mysql серверу:

shell> mysqlbinlog log_file | mysql -h server_name

Важно: Команда CHANGE MASTER удаляет все накопленные на слейве relay лог файлы и создает новые, если не указаны опции RELAY_LOG_FILE или RELAY_LOG_POS.

Комментариев нет: