Duplicate entry/Error_code: 1062 в MySQL репликации (Master-Slave)

Duplicate entry/Error_code: 1062 в MySQL репликации (Master-Slave)

Получил ошибку «Duplicate entry» или она еще называется «Error_code: 1062» в MySQL репликации (Master-Slave). И хочу рассказать, как ее можно исправить.

Чтобы проверить, работает ли SLAVE на сервере ( с репликацией Master-Slave), нужно выполнить команду, но для начала подключитесь к серверу MYSQL:

mysql> show slave status\G

Ошибка выглядит вот так:

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 66.66.66.66
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000210
          Read_Master_Log_Pos: 115912924
               Relay_Log_File: mysqld-relay-bin.000640
                Relay_Log_Pos: 253
        Relay_Master_Log_File: mysql-bin.000210
             Slave_IO_Running: Yes
            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: 1062
                   Last_Error: Could not execute Write_rows event on table linux-notes.log_visitor; Duplicate entry '14158493' for key 'PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log mysql-bin.000210, end_log_pos 333
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 107
              Relay_Log_Space: 115913373
              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: 1062
               Last_SQL_Error: Could not execute Write_rows event on table linux-notes.log_visitor; Duplicate entry '14158493' for key 'PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log mysql-bin.000210, end_log_pos 333
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 3361
1 row in set (0.00 sec)

mysql>

Где:

  • 66.66.66.66 — ИП адрес Master-а
  • Duplicate entry ‘14158493’ — Это дублирующиеся запись, ее нужно убрать.

Исправление Duplicate entry/Error_code: 1062 в MySQL репликации (Master-Slave)

Обычно репликация MySQL остановится всякий раз, когда возникает ошибка выполнения запроса на slave. Это происходит для того, чтобы мы могли идентифицировать проблему и устранить ее, и сохранить данные в соответствии с master-ом, который послал запрос. Вы можете пропустить такие ошибки (даже если это не рекомендуется) до тех пор, пока не найдете причину.

Для начала, остановим SLAVE:

mysql> SLAVE STOP;
Query OK, 0 rows affected (0.00 sec)

mysql>

И для исправления данной проблемы, имеется вот эта команда:

mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=14158493; START SLAVE;
Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

mysql>

И собственно, проверяем и убеждаемся что все хорошо:

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 66.66.66.66
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000210
          Read_Master_Log_Pos: 132954424
               Relay_Log_File: mysqld-relay-bin.000641
                Relay_Log_Pos: 1457939
        Relay_Master_Log_File: mysql-bin.000210
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              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: 12183443
          Exec_Master_Log_Pos: 132954424
              Relay_Log_Space: 132954873
              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: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 3361
1 row in set (0.00 sec)

mysql>

Видим что проблема решена!

Если вы уверены, что пропуск этой ошибки не приведет падению slave, то можно прописать в конфиг-файл mysql пропуск этих ошибок, а сделать это можно вот так:

# vim /etc/my.cnf

И вставляем (если нет, то прописываем) данную переменную:

[...]
slave-skip-errors = 1062
[...]

Как было показано в примере выше, я пропускаю ошибку 1062: _ Error: 1062 SQLSTATE: 23000 (ER_DUP_ENTRY) Message: Duplicate entry ‘%s’ for key %d_

Вы можете пропускать и другие типы ошибок:

slave-skip-errors=[err_code1,err_code2,...|all]

Или можно пропускать все ошибки, но это крайне не рекомендуется делать! БУДЬТЕ ВНИМАТЕЛЬНЫ! А на этом, у меня все, статья «Duplicate entry/Error_code: 1062 в MySQL репликации (Master-Slave)» завершена.

 

One thought on “Duplicate entry/Error_code: 1062 в MySQL репликации (Master-Slave)

  1. SQL_SLAVE_SKIP_COUNTER=14158493;
    это значит пропустит 14158493 запросов!
    Так себе идея, обычно хватает SQL_SLAVE_SKIP_COUNTER=1;

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.