Как повторно синхронизировать Mysql DB, если Master и Slave имеют разные базы данных в случае репликации Mysql? - PullRequest
130 голосов
/ 02 марта 2010

Mysql Server1 работает как MASTER .
Mysql Server2 работает как SLAVE .

Теперь репликация БД происходит от MASTER до SLAVE .

Server2 удален из сети и повторно подключите его через 1 день. После этого происходит несоответствие в базе данных в ведущем и ведомом устройствах.

Как выполнить повторную синхронизацию БД, поскольку после восстановления БД, переданной от ведущего к ведомому, проблема также не решается?

Ответы [ 13 ]

0 голосов
/ 15 сентября 2018

Мы используем технику репликации мастер-мастер MySQL, и если один сервер MySQL, скажем, 1, удаляется из сети, он восстанавливает соединение после восстановления соединения и всех записей, которые были зафиксированы на сервере 2, который был в сети передаются на сервер 1, который потерял соединение после восстановления. Ведомый поток в MySQL пытается подключиться к своему мастеру через каждые 60 секунд по умолчанию. Это свойство может быть изменено как MySQL, имеющий флаг "master_connect_retry = 5", где 5 в секундах. Это означает, что мы хотим повторить попытку через каждые 5 секунд.

Но вам нужно убедиться, что сервер, потерявший соединение, не показывает никаких изменений в базе данных, так как вы получаете дубликат. Ошибка ключа Код ошибки: 1062

0 голосов
/ 21 мая 2015

Восстановление ведомого с использованием LVM

Вот метод, который мы используем для перестройки подчиненных MySQL с использованием Linux LVM. Это гарантирует постоянный моментальный снимок, требуя при этом минимального времени простоя на вашем мастере.

Установите на главном сервере MySQL значение innodb max грязных страниц в ноль. Это заставит MySQL записать все страницы на диск, что значительно ускорит перезапуск.

set global innodb_max_dirty_pages_pct = 0;

Для отслеживания количества грязных страниц выполните команду

mysqladmin ext -i10 | grep dirty

Как только число перестанет уменьшаться, вы достигнете точки, чтобы продолжить. Затем сбросьте мастер, чтобы очистить старые журналы бина / журналы реле:

RESET MASTER;

Выполните lvdisplay, чтобы получить LV Path

lvdisplay

Вывод будет выглядеть так

--- Logical volume ---
LV Path                /dev/vg_mysql/lv_data
LV Name                lv_data
VG Name                vg_mysql

Завершите работу базы данных master с помощью команды

service mysql stop

Далее сделайте снимок, имя нового логического тома будет mysql_snapshot. Если на диске ОС размещены блоки журналов, они также должны быть моментальными снимками.

lvcreate --size 10G --snapshot --name mysql_snapshot /dev/vg_mysql/lv_data

Снова запустить мастер с помощью команды

service mysql start

Восстановление грязных страниц по умолчанию

set global innodb_max_dirty_pages_pct = 75;

Запустите lvdisplay еще раз, чтобы убедиться, что снимок есть и виден

lvdisplay

Выход:

--- Logical volume ---
LV Path                /dev/vg_mysql/mysql_snapshot
LV Name                mysql_snapshot
VG Name                vg_mysql

Смонтировать снимок

mkdir /mnt/mysql_snapshot
mount /dev/vg_mysql/mysql_snapshot /mnt/mysql_snapshot

Если у вас есть работающий подчиненный MySQL, вам нужно остановить его

service mysql stop

Далее необходимо очистить папку данных MySQL

cd /var/lib/mysql
rm -fr *

Вернуться к мастеру. Теперь rsync снимок к ведомому MySQL

rsync --progress -harz /mnt/mysql_snapshot/ targethostname:/var/lib/mysql/

После завершения rsync вы можете размонтировать и удалить снимок

umount /mnt/mysql_snapshot
lvremove -f /dev/vg_mysql/mysql_snapshot

Создать пользователя репликации на главном сервере, если старый пользователь репликации не существует или пароль неизвестен

GRANT REPLICATION SLAVE on *.* to 'replication'@'[SLAVE IP]' identified by 'YourPass';

Убедитесь, что файлы данных / var / lib / mysql принадлежат пользователю mysql, если это так, вы можете пропустить следующую команду:

chown -R mysql:mysql /var/lib/mysql

Следующая запись позиции бинлога

ls -laF | grep mysql-bin

Вы увидите что-то вроде

..
-rw-rw----     1 mysql mysql  1073750329 Aug 28 03:33 mysql-bin.000017
-rw-rw----     1 mysql mysql  1073741932 Aug 28 08:32 mysql-bin.000018
-rw-rw----     1 mysql mysql   963333441 Aug 28 15:37 mysql-bin.000019
-rw-rw----     1 mysql mysql    65657162 Aug 28 16:44 mysql-bin.000020

Здесь главный файл журнала - это наивысший номер файла в последовательности, а позиция журнала bin - размер файла. Запишите эти значения:

* * 1068

Следующий запуск ведомого MySQL

service mysql start

Выполнить команду мастера изменения на ведомом устройстве, выполнив следующее:

CHANGE MASTER TO 
master_host="10.0.0.12", 
master_user="replication", 
master_password="YourPass", 
master_log_file="mysql-bin.000020", 
master_log_pos=65657162; 

Наконец-то запустить раба

SLAVE START;

Проверить статус ведомого:

SHOW SLAVE STATUS;

Убедитесь, что ведомый ввод-вывод запущен и нет ошибок соединения. Удачи!

BR, Juha Vehnia

Я недавно написал это в своем блоге, который можно найти здесь ... Здесь есть еще несколько деталей, но история такая же.

http://www.juhavehnia.com/2015/05/rebuilding-mysql-slave-using-linux-lvm.html

0 голосов
/ 02 марта 2015

Я создал репозиторий GitHub со скриптом, чтобы быстро решить эту проблему. Просто измените пару переменных и запустите их (сначала скрипт создает резервную копию вашей базы данных).

Надеюсь, это поможет вам (и другим людям тоже).

Как сбросить (повторно синхронизировать) MySQL Master-Slave Replication

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...