Как восстановить MySQL репликацию без выключения?
Часто сервер MySQL необходимо включить в реплику прямо во время его работы без всяких пауз и даунтаймов самого приложения. Сделать это можно с помощью утилиты Xtrabackup. Весь процесс занимает 3 шага:
1. Настройка мастера
Этот пункт нужно пропустить, если мастер уже настроен.
Это нужно сделать только один раз.
Логинимся на мастер сервер и добавляем в секцию [mysql] конфига my.cnf:
server-id = 1 binlog-format = mixed log-bin = mysql-bin sync_binlog = 1
После этого перезапускаем сервер (команды выполняем на мастере):
/etc/init.d/mysql restart
Мы включили бинарные логи, которые нужны для работы репликации. Это единственная перезагрузка, которая понадобится за весь процесс. Далее устанавливаем права доступа для реплики:
GRANT REPLICATION SLAVE ON *.* TO 'replica'@'10.10.0.2' IDENTIFIED BY 'BZLVT3BthaEB';
# 10.10.0.2 – ip сервера, который будет служить слейвом
2. Копирование данных
Готовим данные для копирования (команды выполняем на мастере):
innobackupex --user=root --password=pwd /root
# самая медленная операция
Накатываем лог на данные в созданной папке (например, /root/2019-02-09_21-02-52)
innobackupex --user=root --password=pwd --apply-log /root/2019-02-09_21-02-52
# пройдет в несколько раз быстрее, чем предыдущая
Копируем эту же папку на слейв:
scp -r /root/2019-02-09_21-02-52 [email protected]:/root/master
MySQL нового слейва должен быть остановлен. Готовим данные (команды выполняем на слейве):
rm -rf /var/lib/mysql mv /root/master /var/lib/mysql chown -R mysql:mysql /var/lib/mysql /etc/init.d/mysql start
3. Включение репликации
Перед включением выясняем название и позицию бинарного лога:
cat /var/lib/mysql/xtrabackup_binlog_info
Результат будет иметь такой вид:
mysql-bin.000001 15386388
После этого выполняем такой MySQL-запрос на слейве используя эти данные:
CHANGE MASTER TO MASTER_HOST='10.10.0.1', MASTER_USER='replica', MASTER_PASSWORD='BZLVT3BthaEB', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=15386388;
# 10.10.0.1 – ip нашего мастера
И еще один запрос тут же для запуска реплики:
SLAVE START;
Проверяем статус репликации:
SHOW SLAVE STATUSG
... Slave_IO_Running: Yes ... Slave_SQL_Running: Yes ... Seconds_Behind_Master: 13 ...
# Все хорошо и реплика работает
Ждем пока Seconds_Behind_Master станет стремиться к нулю.
Сообщить об опечатке
Текст, который будет отправлен нашим редакторам: