Репликация двоичного журнала MySQL: можно ли настроить игнорирование ошибок?

Я использую систему репликации двоичного журнала MySQL master-slave (уф!), Которая для некоторых данных не синхронизирована (это означает, что мастер хранит больше данных, чем подчиненный). Но ведомое устройство очень часто останавливается при малейшей ошибке MySQL, можно ли это отключить? (возможно, настройка my.cnf для реплицирующего подчиненного сервера ignore-replicating-errors или что-то в этом роде;))

Это то, что происходит время от времени, когда ведомое устройство пытается воспроизвести несуществующий элемент, ведомое устройство просто умирает. быстрая проверка на ПОКАЗАТЬ СОСТОЯНИЕ ПОДГОТОВКИ \ G; дает

       Slave-IO-Running: Yes
      Slave-SQL-Running: No
        Replicate-Do-DB: 
             Last-Errno: 1062
             Last-Error: Error 'Duplicate entry '15218' for key 1' on query. Default database: 'db'. Query: 'INSERT INTO db.table ( FIELDS ) VALUES ( VALUES )'

который я быстро исправляю (как только понимаю, что ведомое устройство было остановлено), выполнив следующие действия:

STOP SLAVE;
RESET SLAVE;
START SLAVE;

... в последнее время это становится утомительным, и, прежде чем я выплюнул какой-то PHP, который делает это за меня, мне было интересно, есть ли какая-нибудь запись my.cnf, которая не убьет ведомого при первой ошибке.

Ваше здоровье,

/ мп

«RESET SLAVE» просто снова запустит репликацию с самого начала. Одна и та же ошибка для той же строки должна рано или поздно появиться на правильном пути ... тогда как же она решила ваши проблемы.

Uday 10.05.2012 17:50
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
12
1
18 067
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

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

Во-вторых, я думаю, что ошибка, которую вы получаете, возникает не при репликации несуществующего элемента (что бы это значило в любом случае?) - похоже, что вы реплицируете элемент, который уже существует в подчиненной базе данных.

Я подозреваю, что проблема в основном возникает из-за того, что вы не запускаете чистую копию данных. Кажется, что мастер был скопирован на подчиненный; затем репликация отключена (или не удалась); а затем он снова запустился, но не дав рабу шанс догнать то, что он упустил.

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

Современные команды mysqldump имеют несколько опций, помогающих настроить согласованную репликацию. Обратите внимание на --master-data, который поместит двоичный файл журнала и позицию в дамп и автоматически установит при загрузке в подчиненное устройство. Кроме того, --single-transaction будет делать дамп внутри транзакции, поэтому для согласованного дампа не требуется блокировка записи.

Стоит отметить, что --single-transaction полезен только для транзакционных таблиц, таких как InnoDB.

Michał Szajbe 15.05.2012 01:00
Ответ принят как подходящий

Да, с --slave-skip-errors = xxx в my.cnf, где xxx - это «все» или список кодов ошибок, разделенных запятыми.

Справедливое предупреждение, что это может действительно повредить вашу подчиненную базу данных. Это ошибки неспроста. :)

Riedsio 01.12.2010 15:30

в my.cnf, я полагаю, вы помещаете это без ведущего "-".

TheSatinKnight 02.05.2017 01:51

Если ведомое устройство не используется для каких-либо операций записи, кроме репликации, авторы High Performance MySQL рекомендуют добавить read_only на ведомый сервер, чтобы предотвратить ошибочное изменение пользователями данных на ведомом сервере, поскольку это также вызовет те же ошибки, с которыми вы столкнулись.

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

остановить раба; установить глобальный sql_slave_skip_counter = 1; запустить раб;

Вы можете проигнорировать только текущую ошибку и продолжить процесс репликации.

это отлично работает, спасибо. Не понимаю, почему это не лучший ответ.

Tech4Wilco 15.09.2011 22:30

исходный пост просил автоматический процесс, хотя это работает, он все еще ручной

SeanDowney 23.07.2012 23:27

он все еще может работать, но множество ошибок 1062 - верный признак рассинхронизации ведомых устройств базы данных. вам лучше изолировать, какая база данных является наиболее "современной" или "правильной", продвинуть ее до уровня ведущего, добавить еще несколько ведомых устройств в новый кластер и удалить исходные ведущие / ведомые устройства

nandoP 30.11.2013 04:31

Другие вопросы по теме