web-dev-qa-db-fra.com

Qu'est-ce qui cause l'erreur MySQL 1062 - Entrée en double lors du démarrage de l'esclave?

  • MySQL Master version: 5.5.16-1
  • Version d'esclave MySQL: 5.5.18-1

L'instantané de la maîtrise est créé par:

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

Ce fichier de vidage est importé sur l'esclave (qui est démarré avec --skip-slave-start option) sans erreur:

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

Mais j'ai eu l'erreur suivante lors de l'exécution du 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, ...

Il n'y a qu'un seul disque avec ID 115846 sur le maître:

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

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

Essayez de sauter des questions avec:

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

n'a pas aidé. Je ne veux pas sauter ces erreurs en ajoutant:

slave-skip-errors = 1062

à my.cnf Fichier parce qu'il peut apporter esclave incohérent.

Qu'est-ce qui peut être la raison de cette erreur?


MISE À JOUR

Ce n'est pas comment je configurais habituellement la réplication MySQL

Quelles mesures que vous pensez ne pas suivre le document?

Je me demande si vous rencontrez le même problème si vous deviez configurer toute la configuration plutôt que de passer la commande mysqldump.

Non, cela fonctionne comme normalement si je modifie également le maître aux coordonnées correspondantes.

J'essaierais de laisser tomber la base de données sur l'esclave, assurez-vous que les binlogs sont clairs et recommencez. Vérifiez également la table en question sur le maître pour assurer que les index n'ont pas d'erreurs.

Est supprimé (déplacer) tout le datadir assez? Je l'ai fait et j'ai le même résultat.


Répondre à @dmytro Leonenko

"Afficher le statut esclave\g 'sur l'esclave pour s'assurer qu'il est correctement configuré, master_log_pos est 0

Seuls "montrez l'esclave Statug\g" après l'importation mais avant 'commencer l'esclave;' peut nous donner la réponse

J'ai sauvegardé le Datadir, supprimez tous et courez mysql_install_db, importer le fichier de vidage, exécuter change master to Et voici les résultats:

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)

Je me demande pourquoi master_log_pos est 4?

11
quanta

Que tenter de résoudre votre problème:

  1. Vous devriez supprimer maître.info sur esclave en premier et redémarrer mysql
  2. problème modifier le maître en maître_host = 'xx.xx.xx.xx', master_user = 'replu', master_password = 'slavepass';
  3. est-ce que mysqldump avec l'option '--FLUSH-BOGS' sur MASTER
  4. 'MySQL -U utilisateur -P <bold.sql' sur esclave
  5. "Afficher le statut esclave\g 'sur l'esclave pour s'assurer qu'il est correctement configuré, master_log_pos est 0
  6. "Commencez l'esclave; ' sur esclave.

Que vérifier aussi:

  • Format Binlog: Mixte
  • server_ids sont différents sur maître et esclave
7
Dmytro Leonenko

Le problème est causé par la mise en place du maître sur un serveur de production en cours d'exécution avant de faire la décharge (autant que je puisse dire). Donc, il existe des requêtes écrites dans le maître_log qui ont déjà été exécutées sur les données résidant sur l'esclave. Je n'ai jamais vu une solution sur le site Web de MySQL ou la liste de diffusion. Donc, j'ai proposé la solution suivante qui résolvait mon problème.

sur esclave:

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

sur maître:

mysql> RESET MASTER;

sur esclave:

mysql> RESET SLAVE;
mysql> START SLAVE;

au fait, j'ai couru ma décharge avec ce qui suit sur l'esclave:

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

J'espère que ça aidera quelqu'un d'autre.

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

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

3
BroknDodge

J'ai eu le problème exact et l'UT XD est aidé. Mais la commande dans ce lien avait une erreur de syntaxe et voici la version qui a fonctionné pour moi:

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

Il vérifie essentiellement s'il y a une erreur d'entrée en double et ignorez cet événement de Master. et faites-le dans une boucle.

1
perlwle

De Percona cela m'aide généralement.

pt-slave restart -p MyPassword
0
DimiDak

Dans mon cas, la question est résolue par les commandes suivantes

par les étapes suivantes

STOP SLAVE;
RESET SLAVE;
START SLAVE;
0
Karthik