Проблема заключалась в том, что GLOBAL.GTID_PURGED зарегистрировал только одну из моих основных баз данных, которая устанавливает правильную позицию, с которой следует продолжить процесс репликации. Остальные базы данных по сути были запущены с начала времен. Таким образом, я получал неправильное позиционирование и ошибки повторяющейся записи.
Итак, это было мое решение:
Руководство по репликации GTID с несколькими источниками MySQL от ME:
Переустановите сервер MySQL:
После защиты текущих данных я выполнил чистую установку MySQL Server 5.7.7-rc на подчиненный сервер. Любой сервер MySQL можно полностью удалить, используя следующее:
$ sudo apt-get --purge remove mysql-client mysql-server mysql-common
$ sudo apt-get autoremove
а затем выберите ДА в ответ на приглашение удалить каталог «Данные» (это приведет к безвозвратному удалению всех ваших баз данных, конфигураций и т. д.). Если у вас есть какие-либо пользовательские конфигурации, сейчас самое время сделать резервную копию вашего /etc/mysql/my.cnf
файла.
Переустановите MySQL Server 5.7 для Ubuntu 14-lts
$ sudo apt-get install mysql-server-5.7
Если в вашей системе нет версии 5.7, используйте это руководство
Резервное копирование основных баз данных Live:
Я создал текущий дамп MySQL всех трех баз данных Live Master. У каждой из моих баз данных разные имена, например db01, db02, db03, и они сохраняются непосредственно на подчиненном сервере.
В моем случае каждая база данных находится на собственном сервере, поэтому я запускал ее несколько раз, меняя IP-адрес, базу данных и имя файла.
$ mysqldump -u username -p -h 10.10.10.10 --skip-lock-tables --single-transaction --triggers --routines --databases db01 > ~/dumpDB01.sql
После завершения вам потребуются данные GTID_PURGED из каждого дампа и сохраните их для дальнейшего использования:
$ grep PURGED ~/dumpDB01.sql
SET @@GLOBAL.GTID_PURGED='d23dceda-08a4-11e5-85e4-005056a2431f:1-10073';
Вам понадобится вся эта строка: d23dceda-08a4-11e5-85e4-005056a2431f: 1-10073
Конфигурация подчиненного сервера MySQL:
Теперь я решил полностью настроить mysql, прежде чем я когда-либо импортировал какие-либо данные, и вскоре я объясню почему.
Отредактируйте my.cnf:
sudo vi /etc/mysql/my.cnf
gtid_mode =ON
enforce_gtid_consistency =true
log_bin =/var/log/mysql/bin_log.index
log_slave_updates =true
master_info_repository =TABLE
relay_log_info_repository =TABLE
server-id =1001
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
#bind-address = 127.0.0.1
Вам нужно будет сохранить файл конфигурации и создать файл bin_log.index, иначе сервер не запустится.
$ sudo touch /var/log/mysql/bin_log.index
$ sudo chown mysql:mysql /var/log/mysql/bin_log.index
$ sudo service mysql restart
Импорт / настройка данных:
При импорте дампов первый зарегистрирует свой GTID_PURGED автоматически следующим образом:
SET @@GLOBAL.GTID_PURGED='d23dceda-08a4-11e5-85e4-005056a2431f:1-10073';
Как только это произойдет, ваш GTID_EXECUTED будет установлен с теми же данными, и каждый последующий импорт будет вызывать такие ошибки:
ERROR 1840 (HY000) at line 24: @@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_EXECUTED is empty.
Эти ошибки можно игнорировать при импорте с помощью $ mysql -u username -p -f < ~/dumpDB02.sql
, поскольку мы собираемся изменить GTID_PURGED вручную после процесса импорта. Если вы уже форсировали импорт и видели эту ошибку, вы можете очистить обе переменные GTID, выполнив mysql > RESET MASTER;
Из консоли mysql запустите следующее:
mysql> RESET MASTER;
Вам понадобятся все 3 GTID из дампов и разделите их запятыми в назначении ниже.
mysql> SET @@GLOBAL.GTID_PURGED='d23dceda-08a4-11e5-85e4-005056a2431f:1-10073,d23dceda-08a4-11e5-85e4-005056a2431f:1-10073,d23dceda-08a4-11e5-85e4-005056a2431f:1-10073';
Теперь вы можете инициализировать и начать репликацию:
Для каждой базы данных (в моем случае я изменил IP-адрес, а канал - это строка по вашему выбору. Вы будете использовать этот канал для доступа к подчиненным данным):
mysql> CHANGE MASTER TO MASTER_HOST="10.10.10.10", MASTER_PORT=3306, MASTER_USER="username", MASTER_PASSWORD="password", MASTER_AUTO_POSITION=1 FOR CHANNEL "db01";
Затем запустите каждый раб:
mysql> START SLAVE FOR CHANNEL "db01";
mysql> SHOW SLAVE STATUS FOR CHANNEL "db01"\G
и успехов!
У меня есть все данные, никаких ошибок, и теперь они обновлены с помощью мастер-серверов.
person
Justin Herter
schedule
03.06.2015