Назад | Перейти на главную страницу

MySQL «Дублирующая запись» Постоянные ошибки при репликации Slave.

Я последовал этому руководству:

https://www.digitalocean.com/community/tutorials/how-to-set-up-master-slave-replication-in-mysql

К сожалению, репликация на ведомом устройстве все время останавливается:

[ERROR] Slave SQL: Error 'Duplicate entry '6443185' for key 'PRIMARY'' on query. Default database: 'testdb'. Query: 'INSERT INTO ultimate_cron_lock (name, current, expire) VALUES ('ultimate_cron_serial_launcher_1', '0', '1424077478.0243')', Error_code: 1062

Если я отброшу все dbs, то как я могу сказать подчиненному серверу Mysql, чтобы они создавались автоматически?

Я не указал binlog_do_db = на ведущем устройстве, что означает, что он уже должен вести двоичный журнал для ВСЕХ баз данных, на ведомом я игнорирую только несколько баз данных:

server-id       = 2
relay-log               = /var/lib/mysql/binlog/mysql-relay-bin.log
log_bin         = /var/lib/mysql/binlog/mysql-bin.log

replicate-ignore-db=test
replicate-ignore-db=information_schema
replicate-ignore-db=mysql

Спасибо

Самый деструктивный совет из всех - совет автоматизировать катастрофу с помощью slave-skip-errors. Это быстрый способ получить несогласованную базу данных ведомых устройств. Пожалуйста, избегайте установки slave-skip-errors любой ценой.

В то же время я могу сказать, что наиболее частой причиной ошибок ведомого устройства является незнание того факта, что ведомое устройство mysql по умолчанию не доступно только для чтения. Если вы используете частые переключения, некоторые из ваших клиентов могут по-прежнему записывать изменения в подчиненное устройство. Чтобы избавиться от этого, вам действительно следует установить read_only = on на подчиненных серверах.

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

Вы можете установить следующее в my.cnf подчиненного устройства:

[mysqld]
slave-skip-errors=1062

Но как документация говорит:

Не используйте эту опцию, если вы полностью не понимаете, почему вы получаете ошибки.

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

Как предупреждает документация:

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

Если вы используете эту опцию, а не исследуете свое приложение, вам следует запустить pt-table-контрольная сумма часто.