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

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

Это то, что происходит, время от времени, когда подчиненный пытается реплицировать элемент, который не существует, ведомый просто умирает. быстрая проверка в ПОКАЗАТЬ СОСТОЯНИЕ СЛАВЫ \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, которая не будет убивать подчиненный при первой ошибке.

Приветствия,

/тр

Ответ 1

Да, с -slave-skip-errors = xxx в my.cnf, где xxx - это "все" или список кодов ошибок запятой.

Ответ 2

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

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

Ответ 3

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

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

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

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

Ответ 4

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

Ответ 5

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

Ответ 6

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