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

StackOverflow https://stackoverflow.com/questions/30660

Вопрос

Я использую систему репликации двоичных журналов MySQL «главный-подчиненный» (уф!), которая по некоторым данным не синхронизирована (это означает, что главный хранит больше данных, чем подчиненный).Но слейв очень часто останавливается при малейшей ошибке 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, которая не убивает ведомое устройство при первой ошибке.

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

/мп

Это было полезно?

Решение

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top