- Version de MySQL Master: 5.5.16-1
- Version MySQL Slave: 5.5.18-1
L'instantané du maître 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 de 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 enregistrement avec l'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 d'ignorer certaines requêtes avec:
mysql> STOP SLAVE;
mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
mysql> START SLAVE;
n'a pas aidé. Je ne veux pas ignorer ces erreurs en ajoutant:
slave-skip-errors = 1062
à my.cnf
déposer car cela peut rendre l'esclave incohérent.
Quelle peut être la raison de cette erreur?
MISE À JOUR
Ce n'est pas comme ça que je configure la réplication mySQL
Quelles étapes pensez-vous que je ne respecte pas le document?
Je me demande si vous rencontrerez le même problème si vous deviez installer la configuration entière plutôt qu'en passant la commande mysqldump.
Non, cela fonctionne normalement si je change également le maître en coordonnées correspondantes.
Je voudrais essayer de supprimer la base de données sur l'esclave, m'assurer que les binlogs sont clairs et recommencer. Vérifiez également le tableau en question sur le maître pour vous assurer que les index ne contiennent pas d'erreurs.
La suppression (déplacement) de toutes les données est-elle suffisante? Je l'ai fait et j'ai obtenu le même résultat.
Répondre à @Dmytro Leonenko
'afficher le statut de l'esclave \ G' sur l'esclave pour s'assurer qu'il est correctement configuré, MASTER_LOG_POS est 0
Uniquement "afficher l'esclave statug \ G" après l'importation mais avant "démarrer l'esclave;" peut nous donner la réponse
J'ai sauvegardé le datadir, tout supprimer et exécuter 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 a 4 ans?
la source
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1
émettez La requête à l'origine de l'erreur change-t-elle le moins? La position du journal des esclaves était-elle correctement configurée?--master-data
option est déjà d'écrire les coordonnées du journal binaire dans le fichier de vidage. J'ai seulement besoin de changer master en master_host, master_user, master_password.--master-data
option lors de la création d'un instantané de données? Si cela se produit toujours lorsque j'utilise l'--lock-all-tables
option etchange master to master_log_file='', master_log_pos='', ...
, quelles peuvent être les causes?Réponses:
Que tenter de résoudre votre problème:
À vérifier également:
la source
change master to
". J'utilise la journalisation MIXED. J'ai testé avec MySQL 5.0.77 (basé sur des instructions), cela provoque également cette erreur. Le mysqldump complet estmysqldump -u root -p --all-databases --master-data --flush-logs > alldb_$(date +%F).sql
Le problème est dû à la configuration du maître sur un serveur de production en cours d'exécution AVANT d'effectuer le vidage (pour autant que je sache). Il existe donc des requêtes écrites dans le master_log qui ont déjà été exécutées sur les données résidant sur l'esclave. Je n'ai jamais vu de solution sur le site ou la liste de diffusion mysql. J'ai donc trouvé la solution suivante qui a résolu mon problème.
sur l'esclave:
sur le maître:
sur l'esclave:
en passant, j'ai exécuté mon vidage avec ce qui suit sur l'esclave:
J'espère que ça aidera quelqu'un d'autre.
http://dev.mysql.com/doc/refman/5.0/en/reset-master.html
http://dev.mysql.com/doc/refman/5.0/en/reset-slave.html
la source
Si vous ne voulez pas REDO la procédure complète, une bonne solution serait d'utiliser
S'il y a trop d'erreurs de ce type, une bonne idée serait de les automatiser à l'aide d'un script bash.
Réf: Correction d'une erreur d'entrée en double
la source
J'ai eu le problème exact et le lien d'Ut xd a 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 ignore cet événement du maître. et faites-le en boucle.
la source
Dans mon cas, le problème est résolu par les commandes suivantes
par les étapes suivantes
la source