O que causa o erro 1062 do MySQL - entrada duplicada ao iniciar o escravo?

10
  • Versão do MySQL Master: 5.5.16-1
  • Versão do MySQL Slave: 5.5.18-1

O instantâneo do mestre é criado por:

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

Este arquivo de despejo é importado no escravo (que é iniciado com a opção --skip-slave-start ) sem erro:

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

Mas recebi o seguinte erro ao executar o 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, ...

Existe apenas um registro com ID 115846 no mestre:

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

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

Tente pular algumas consultas com:

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

não ajudou. Eu não quero pular esses erros, adicionando:

slave-skip-errors = 1062

para my.cnf file porque pode trazer inconsistente ao slave.

Qual pode ser o motivo desse erro?

UPDATE

This is not how I usually setup mySQL replication

Quais etapas você acha que não seguem o documento?

I wonder if you will encounter the same problem if you were to setup the entire configuration rather that passing the mysqldump command.

Não, funciona normalmente se eu também alterar o mestre para as coordenadas correspondentes.

I would try dropping the database on the slave, make sure the binlogs are clear, and start again. Also check the table in question on the master to assure the indexes do not have errors.

Excluir (mover) todo o datadir é suficiente? Eu fiz isso e obtive o mesmo resultado.

Responder a @Dmytro Leonenko

'show slave status\G' on slave to ensure that it is properly configured, MASTER_LOG_POS is 0

Only 'show slave statug\G' after import but before 'start slave;' can give us the answer

Eu fiz o backup do datadir, excluo tudo e execute mysql_install_db , importe o arquivo de despejo, execute change master to e aqui estão os resultados:

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)

Eu estou querendo saber por que o Master_Log_Pos é 4?

    
por quanta 02.12.2011 / 04:43

4 respostas

7

O que tentar resolver o seu problema:

  1. Você deve remover master.info no slave primeiro e reiniciar o mysql
  2. edite CHANGE MASTER PARA MASTER_HOST = 'XX.XX.XX.XX', MASTER_USER = 'repl', MASTER_PASSWORD = 'slavepass';
  3. do mysqldump com a opção '--flush-logs' no master
  4. 'mysql -u user -p < dump.sql 'on slave
  5. 'mostrar status do escravo \ G' no escravo para garantir que está configurado corretamente, MASTER_LOG_POS é 0
  6. 'iniciar escravo;' no escravo.

O que verificar também:

  • Formato de log binário: MIXED
  • server_ids são diferentes no master e no slave
por 08.12.2011 / 14:45
2

O problema é causado pela configuração do mestre em um servidor de produção em execução ANTES de fazer o despejo (até onde eu sei). Portanto, existem consultas escritas no master_log que já foram executadas nos dados que residem no escravo. Eu nunca vi uma solução no site ou na lista de discussão do mysql. Então, eu encontrei a seguinte solução que resolveu o meu problema.

no escravo:

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

no mestre:

mysql> RESET MASTER;

no escravo:

mysql> RESET SLAVE;
mysql> START SLAVE;

a propósito, eu corri meu despejo com o seguinte sobre o escravo:

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

Espero que isso ajude alguém.

link

link

    
por 09.01.2013 / 20:21
1

Eu tive o problema exato e o link de Ut xd ajudou. mas o comando nesse link tinha erro de sintaxe e aqui está a versão que funcionou para mim:

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

Basicamente, verifica se há erro de entrada duplicado e ignora este evento do mestre. e faça isso em um loop.

    
por 20.05.2017 / 03:46
0

Se você não quiser o procedimento completo REDO, uma boa solução seria usar

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

Se houver muitos desses erros, uma boa ideia seria automatizá-lo usando um script bash.

Ref: Correção Erro de entrada duplicado

    
por 17.09.2014 / 09:11