MySQL репликация - тонкости 1

Jul 26, 2017 21:20


Иногда возникает необходимость добавить репликацию с мастера ещё одной базы. Или эта база уже была на слейве, но по какой-то причине была повреждена и починить её не получилось. В случае когда нам нужно реплицировать одну единственную базу, всё просто: импортируем дамп, смотрим в нем файл и позицию да и прописываем эти данные на слейву. Но когда на слейве уже крутится база, добавление второй связано с необходимостью синхронизировать данные о файле бинлога и позиции в нем с уже существующей базой.

Допустим, у нас есть мастер master с двумя базами sun и moon. База sun уже реплицируется на слейв slave и мы хотим чтобы и moon участвовала в репликации. Сделаем дамп базы moon:

mysqldump -h localhost -u root -p --master-data=2 --single-transaction moon > moon_dump.sql

Отправим дамп на слейв:

scp moon_dump.sql user@slave:/home/user

На слейве создадим базу данных и импортируем дамп:

mysql> CREATE DATABASE moon;

mysql -h localhost -u root -p moon < moon_dump.sql

А теперь самое интересное. Нам нужно синхронизировать позиции репликации баз sun и moon. Для начала откроем текстовым редактором дамп и найдем строку, начинающуюся с «CHANGE MASTER» (она может быть в любой части файла, закономерности тут нет) и запишем её куда-нибудь:

CHANGE MASTER TO MASTER_LOG_FILE='mysqld-bin.0553', MASTER_LOG_POS=000234;

Остановим репликацию и посмотрим файл и позицию базы sun:

mysql> STOP SLAVE 'master';

mysql>SHOW SLAVE 'master' STATUS\G

Нас интересуют строки

Master_Log_File: mysqld-bin.000555
Exec_Master_Log_Pos: 123000

Запишем их тоже.

Теперь в /etc/mysql/conf.d/mariadb.cnf

Изменим строку, отвечающую за репликацию sun (поменяем do на ignore) и добавим строку для репликации moon:

master.replicate-ignore-db="sun"

master.replicate-do-db="moon"

Перезапустим mysql и установим для в настройках коннекшна файл и позицию, которые мы прочитали в дампе:

/etc/init.d/mysql restart

CHANGE MASTER 'master' TO MASTER_HOST = "ip мастера", MASTER_USER = "юзер для репликации", MASTER_PASSWORD ="пароль юзера для репликации", MASTER_LOG_FILE='mysqld-bin.000553', MASTER_LOG_POS=000234;

А теперь, наверное, самый важные момент: нам нужно запустить наш слейв, но не абы как, а так чтобы репликация нашей свежедобавленой базы moon прошла ровно до того момента, на котором была прервана репликация базы sun. В этом нам поможен ключ «UNTIL» и файл\позиция на которых мы стопали слейв:

START SLAVE 'master' UNTIL MASTER_LOG_FILE = "mysqld-bin.000555", MASTER_LOG_POS = 123000;

Теперь последим за ходом репликации:

SHOW SLAVE 'master' STATUS\G

Разумеется, Slave_IO_Running и Slave_SQL_Running должны иметь значение Yes, а кроме того нас остро интересует строка Seconds_Behind_Master - она показывает количество секунд, на которые слейв отстает от мастера. Когда это число дойдет до нуля, синхронизация автоматически остановится и обе наши базы окажутся на одной и той же позиции репликации.

Теперь нам нужно возобновить репликацию, теперь уже обеих баз одновременно. Открываем /etc/mysql/conf.d/mariadb.cnf, меняем ignore на do:

master.replicate-do-db="sun"

master.replicate-do-db="moon"

Перезапускаем mysql чтобы применились изменения конфига и, используя файл и позицию, на которых был остановлен слейв в самом начале, продолжим репликацию уже обеих баз:

/etc/init.d/mysql restart

CHANGE MASTER 'master' TO MASTER_HOST = "ip мастера", MASTER_USER = "юзер для репликации", MASTER_PASSWORD ="пароль юзера для репликации", MASTER_LOG_FILE='mysqld-bin.000555', MASTER_LOG_POS=123000;

После этого проверим статус слейва и, когда Seconds_Behind_Master дойдет до нуля - поздравляю! Мы успешно добавили ещё одну базу на слейв и она успешно реплицируется.

админ, mysql

Previous post Next post
Up