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

11
  • MySQL Master версия: 5.5.16-1
  • Версия MySQL Slave: 5.5.18-1

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

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.

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

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

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


Ответить @ Дмитрий Леоненко

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

Только «показать ведомую статуэтку \ G» после импорта, но до «запуска ведомого»; может дать нам ответ

Я сделал mysql_install_dbрезервную копию datadir, удалил все и запустил , импортировал файл дампа, выполнил 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
Может быть только одна запись с этим идентификатором, поэтому ошибка никогда не будет записана. При выдаче SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1запроса Меняется ли запрос, вызывающий ошибку? Правильно ли настроено положение подчиненного бинлога?
худой
Каждый раз, когда я пропускаю счетчик, он меняется на другой идентификатор. --master-dataВариант уже записать двоичные координаты лог в файл дампа. Мне нужно только изменить master на master_host, master_user, master_password.
Quanta
Обычно я не настраиваю репликацию MySQL (здесь я обычно настраиваю репликацию для каждого URL: dev.mysql.com/doc/refman/5.0/en/replication-howto.html ) Однако, читая опции mysqldump, нет никаких причин почему это не должно работать. Интересно, столкнетесь ли вы с той же проблемой, если бы вы настраивали всю конфигурацию, а не передавали команду mysqldump.
Рилиндо
Вы имеете в виду, что я не должен использовать эту --master-dataопцию при создании снимка данных? Если это все еще происходит, когда я использую --lock-all-tablesопцию и change master to master_log_file='', master_log_pos='', ..., каковы могут быть причины?
кванты
Нет, это не то, что я говорю. Как я уже говорил, то, что вы сделали, должно работать как задумано - насколько я вижу, с этой опцией не существует ошибки. Тем не менее, это не означает, что нет, поэтому в качестве шага изоляции я бы следовал соглашению, предоставленному MySQL, сначала через этот URL. т. Если это работает, по крайней мере, у вас есть направление, чтобы начать устранение неполадок. Если это не так, у нас другая проблема. :)
Rilindo

Ответы:

7

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

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

Что проверить также:

  • Формат бинлога: СМЕШАННЫЙ
  • server_ids различаются на главном и подчиненном
Дмитрий Леоненко
источник
Выпуск всей основной строки изменений (включая имя журнала и номер позиции) фактически исправляет ее, но на данный момент, я думаю, основной вопрос заключается в том, почему Quanta должен повторно ввести имя журнала и номер позиции, когда он уже находится в файл дампа.
Рилиндо
Только «показать ведомую статуэтку \ G» после импорта, но до «запуска ведомого»; можете дать нам ответ
Дмитрий Леоненко
добавили запрошенную информацию в мой оригинальный пост.
кванты
Как вы в итоге получили «Master_Host: xxxx Master_User: xx» без выдачи «CHANGE MASTER ...». Или вы просто не упомянули об этом в ответе? Вы проверили формат binlog и какова была командная строка для mysqldump?
Дмитрий Леоненко
Я уже упоминал, что в моем посте " импортировать файл дампа, выполнитьchange master to ". Я использую протоколирование на основе MIXED. Я протестировал с MySQL 5.0.77 (на основе операторов), это также вызывает эту ошибку. Полная версия mysqldumpmysqldump -u root -p --all-databases --master-data --flush-logs > alldb_$(date +%F).sql
quanta
2

Проблема вызвана настройкой мастера на работающем производственном сервере ДО выполнения дампа (насколько я могу судить). Итак, в 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

BroknDodge
источник
отредактировано, чтобы включить FLUSH PRIVILEGES; После очередной ошибки я понял, что даже если мои пользователи были импортированы с дампом, их привилегии еще не были активны.
BroknDodge
RESET MASTER должен быть запущен на ведомом, а не на главном, см. Percona.com/blog/2013/02/08/…
Джон
1

Если вы не хотите, чтобы REDO завершил всю процедуру, хорошим решением было бы использовать

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

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

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

Ut xD
источник
1

У меня была точная проблема, и ссылка 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

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

perlwle
источник
1
Это было бы намного лучшим ответом, если бы вы объяснили, что делает этот код, и отформатировали бы код, чтобы сделать его более читабельным.
Касперд
0

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

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

STOP SLAVE;
RESET SLAVE;
START SLAVE;
Картик
источник