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?
Que tenter de résoudre votre problème:
Que vérifier aussi:
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.
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.
De Percona cela m'aide généralement.
pt-slave restart -p MyPassword
Dans mon cas, la question est résolue par les commandes suivantes
par les étapes suivantes
STOP SLAVE;
RESET SLAVE;
START SLAVE;