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