восстановить MySQL репликацию без выключения

Thank you for reading this post, don't forget to subscribe!

Часто сер­вер MySQL необ­хо­ди­мо вклю­чить в репли­ку пря­мо во вре­мя его рабо­ты без вся­ких пауз и даун­тай­мов само­го при­ло­же­ния. Сде­лать это мож­но с помо­щью ути­ли­ты Xtrabackup. Весь про­цесс зани­ма­ет 3 шага:

1. Настройка мастера

Этот пункт нуж­но про­пу­стить, если мастер уже настро­ен. Это нуж­но сде­лать толь­ко один раз. Логи­ним­ся на мастер сер­вер и добав­ля­ем в сек­цию [mysql] кон­фи­га my.cnf:

После это­го пере­за­пус­ка­ем сер­вер (коман­ды выпол­ня­ем на мастере):

Мы вклю­чи­ли бинар­ные логи, кото­рые нуж­ны для рабо­ты репли­ка­ции. Это един­ствен­ная пере­за­груз­ка, кото­рая пона­до­бит­ся за весь про­цесс. Далее уста­нав­ли­ва­ем пра­ва досту­па для реплики:

# 10.10.0.2 — ip сер­ве­ра, кото­рый будет слу­жить слейвом

2. Копирование данных

Гото­вим дан­ные для копи­ро­ва­ния (коман­ды выпол­ня­ем на мастере):

# самая мед­лен­ная операция

Нака­ты­ва­ем лог на дан­ные в создан­ной пап­ке (напри­мер, /root/2019-02-09_21-02-52)

# прой­дет в несколь­ко раз быст­рее, чем предыдущая

Копи­ру­ем эту же пап­ку на слейв:

MySQL ново­го слей­ва дол­жен быть оста­нов­лен. Гото­вим дан­ные (коман­ды выпол­ня­ем на слейве):

3. Включение репликации

Перед вклю­че­ни­ем выяс­ня­ем назва­ние и пози­цию бинар­но­го лога:

Резуль­тат будет иметь такой вид:

После это­го выпол­ня­ем такой MySQL-запрос на слей­ве исполь­зуя эти данные:

# 10.10.0.1 — ip наше­го мастера

И еще один запрос тут же для запус­ка реплики:

Про­ве­ря­ем ста­тус репликации:

# Все хоро­шо и репли­ка работает

Ждем пока Seconds_Behind_Master ста­нет стре­мить­ся к нулю

 

 

===============================================

 

Xtrabackup — это необ­хо­ди­мый инстру­мент для созда­ния горя­чих бэка­пов MySQL. Инстру­мент созда­ет резерв­ную копию сер­ве­ра (т.е. всех баз дан­ных сра­зу) без бло­ки­ро­вок и оста­но­вок. Уста­нав­ли­ва­ет­ся из пакетов:

Если нет в пакетах.

Создание резервной копии

Сна­ча­ла копи­ру­ем фай­лы теку­ще­го сер­ве­ра с помо­щью команды:

В пап­ке /var/backups будет созда­на под­пап­ка с теку­щей датой (напри­мер, 20201010132431). После это­го необ­хо­ди­мо нака­тить лог изме­не­ний на файл данных:

Теперь эту пап­ку мож­но сохра­нить на резерв­ный сер­вер и ждать слу­чая для использования.

Восстановление

Для вос­ста­нов­ле­ния доста­точ­но ско­пи­ро­вать бэкап в пап­ку дан­ных MySQL (пара­метр datadir в my.cnf):

Периодическое копирование

Резер­ви­ро­ва­ние луч­ше доба­вить в cron и выпол­нять раз в час (день, если база зани­ма­ет более 10Гб):