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

Что вызывает ошибку MySQL 1062 - повторяющаяся запись при запуске ведомого?

Снимок мастера создается:

mysql> FLUSH TABLES WITH READ LOCK;
shell> mysqldump --all-databases --master-data > dbname_`date +%F`.sql

Этот файл дампа импортируется на ведомое устройство (которое запускается с --skip-slave-start вариант) без ошибки:

shell> pv dbname_`date +%F`.sql | mysql -u root -p

Но я получил следующую ошибку при выполнении mysql> start slave;:

    Last_SQL_Errno: 1062
    Last_SQL_Error: Error 'Duplicate entry '115846' for key
'PRIMARY'' on query. Default database: 'db'. Query: 'INSERT INTO
request_posted (id, user_id, channel, message, link, picture, name, ...

На мастере всего одна запись с ID 115846:

mysql> select count(*) from request_posted where id=115846;
Current database: db

+----------+
| count(*) |
+----------+
|        1 |
+----------+
1 row in set (0.01 sec)

Попробуйте пропустить некоторые запросы с помощью:

mysql> STOP SLAVE; 
mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; 
mysql> START SLAVE;

не помогло. Я не хочу пропустить эти ошибки, добавив:

slave-skip-errors = 1062

к my.cnf файл, потому что это может привести к несогласованности ведомого.

В чем может быть причина этой ошибки?


ОБНОВИТЬ

Я обычно не так настраиваю репликацию mySQL

Какие шаги, по вашему мнению, я не выполняю в соответствии с документом?

Интересно, столкнетесь ли вы с той же проблемой, если бы вы настраивали всю конфигурацию, а не передавали команду mysqldump.

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

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

Достаточно ли удалить (переместить) все данные? Я сделал это и получил тот же результат.


Ответ @Dmytro Leonenko

'показать статус ведомого \ G' на ведомом, чтобы убедиться, что он правильно настроен, MASTER_LOG_POS равен 0

Только 'показывать статус подчиненного \ G' после импорта, но перед 'запускать подчиненное устройство;' может дать нам ответ

Я сделал резервную копию datadir, удалил все и запустил mysql_install_db, импортируем файл дампа, выполняем change master to и вот результаты:

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: 
                  Master_Host: x.x.x.x
                  Master_User: xx
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: 
          Read_Master_Log_Pos: 4
               Relay_Log_File: mysqld-relay-bin.000001
                Relay_Log_Pos: 4
        Relay_Master_Log_File: 
             Slave_IO_Running: No
            Slave_SQL_Running: No
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 0
              Relay_Log_Space: 106
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
1 row in set (0.00 sec)

Мне интересно, почему Master_Log_Pos 4?

Что попробовать решить вашу проблему:

  1. Вы должны сначала удалить master.info на ведомом устройстве и перезапустить mysql
  2. выдать CHANGE MASTER TO MASTER_HOST = 'XX.XX.XX.XX', MASTER_USER = 'repl', MASTER_PASSWORD = 'slavepass';
  3. выполнить mysqldump с параметром --flush-logs на главном сервере
  4. 'mysql -u user -p <dump.sql' на ведомом устройстве
  5. 'показать статус ведомого \ G' на ведомом, чтобы убедиться, что он правильно настроен, MASTER_LOG_POS равен 0
  6. 'начальный раб;' на раб.

Что еще проверить:

  • Формат бинлога: MIXED
  • server_ids разные на главном и подчиненном

Проблема вызвана установкой мастера на работающем производственном сервере ДО выполнения дампа (насколько я могу судить). Итак, есть запросы, записанные в master_log, которые уже были выполнены для данных, находящихся на ведомом устройстве. На самом деле я никогда не видел решения на веб-сайте mysql или в списке рассылки. Итак, я придумал следующее решение, которое решило мою проблему.

на раб:

mysql> STOP SLAVE;
mysql> FLUSH PRIVILEGES;  # dump likly included users too

по мастеру:

mysql> RESET MASTER;

на раб:

mysql> RESET SLAVE;
mysql> START SLAVE;

кстати, я запустил свой дамп со следующим на раб:

mysqldump -uROOTUSER -pROOTPASSWORD -hMYSQLMASTER.EXAMPLE.COM --all-databases --delete-master-logs | mysql -uROOTUSER -pROOTPASSWORD

Надеюсь, это поможет кому-то другому.

http://dev.mysql.com/doc/refman/5.0/en/reset-master.html

http://dev.mysql.com/doc/refman/5.0/en/reset-slave.html

Если вы не хотите ПОВТОРЯТЬ всю процедуру, хорошим решением будет использование

STOP SLAVE;    
SET GLOBAL sql_slave_skip_counter=1;
START SLAVE;

Если таких ошибок слишком много, неплохо было бы автоматизировать их с помощью сценария bash.

Ссылка: Исправление ошибки повторяющейся записи

У меня была точная проблема, и ссылка Ut xd помогла. но команда в этой ссылке имела синтаксическую ошибку, и вот версия, которая сработала для меня:

while [ 1 ]; do if [ `mysql -uroot -ppassword -e"show slave status \G;" | grep "Duplicate entry" | wc -l` -eq 2 ] ; then mysql -uroot -ppassword -e"stop slave; set global sql_slave_skip_counter=1; start slave;"; fi; sleep 1; mysql -uroot -ppassword -e"show slave status\G"; done

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

В моем случае проблема решается следующими командами

следующими шагами

STOP SLAVE;
RESET SLAVE;
START SLAVE;