Pourriez-vous s'il vous plaît m'aider à comprendre pourquoi je reçois "Entrée dupliquée pour la clé PRIMAIRE" sur un serveur esclave après une resynchronisation complète.
Fondamentalement, 'mysqldump' fonctionnait presque toute la nuit, puis le processus de restauration a pris quelques heures, donc quand j'ai démarré l'esclave, il était ~ 63874 secondes derrière le maître.
Le serveur esclave est en lecture seule (read_only) et il n'y a eu aucune écriture pendant le processus de resynchronisation, donc je ne comprends pas pourquoi il y a des clés dupliquées.
Le format du journal binaire est défini sur MIXTE sur le maître.
Commande utilisée pour sauvegarder la base de données:
mysqldump --opt --single-transaction -Q --master-data=2 db | bzip2 -cz > db.sql.bz2
L'esclave réplique une seule base de données du maître (db -> db_backup) avec les options suivantes:
replicate-wild-do-table = db_backup.%
replicate-rewrite-db = db->db_backup
Je ne pense pas que
replicate-wild-do-table = db_backup.%
replicate-rewrite-db = db->db_backup
aller ensemble.
D'autres personnes se sont également interrogées à ce sujet
Jun 14, 2012
: Réplication MySQL configurée mais cela ne fonctionne pasJun 13, 2012
: Quelle est la différence entre 'replicate-rewrite-db' et 'replicate-do-db' lors de la réplication mysql?May 31, 2012
: Mysql replicate-rewrite-db ne fonctionne pasLe problème provient des règles de réplication de commande qui sont traitées. Selon la Documentation MySQL sur les règles de réplication :
Si des options --replicate-rewrite-db ont été spécifiées, elles sont appliquées avant que les règles de filtrage --replicate- * ne soient testées.
Même la documentation MySQL sur replicate-rewrite-db dit:
La traduction du nom de la base de données est effectuée avant que les règles --replicate- * ne soient testées.
Le replicate-wild-do-table
est appliqué après la réécriture. Il ne serait pas surprenant que cet ordre impose en quelque sorte un INSERT dans une table qui contient déjà des données.
Vous vous demandez probablement comment les données y sont arrivées?
Faire mysqldump --single-transaction
semble être le meilleur moyen d'effectuer des sauvegardes ponctuelles de données. Malheureusement, mysqldump --single-transaction
a un talon d'Achille: ALTER TABLE
. Si une table est soumise à une ALTER TABLE
commandes, telles que DROP TABLE
et CREATE TABLE
, qui peut briser l'intégrité de la transaction dans laquelle mysqldump tentait d'effectuer le vidage. Tronquer une table (qui est DDL dans l'univers MySQL) et supprimer et ajouter des index peut également être aussi perturbateur.
Vous pouvez trouver plus d'informations à ce sujet sur le blog de performances MySQL MySQLDump Secret le mieux gardé . J'ai en fait abordé ce point dans une question précédente décrivant 12 commandes qui peuvent briser l'intégrité d'une transaction mysqldump: MySQL backup InnoDB
Un ou les deux aspects peuvent avoir contribué à laisser une ligne se glisser pendant le mysqldump qui n'aurait pas dû exister en raison des règles de réécriture ou de l'isolement du mysqldump qui a été remplacé.
Je ferais un vidage mysqlbinlog de tous les journaux de relais depuis le début du mysqldump pour voir tous les INSERTs que l'esclave traitera et voir si ces lignes existent déjà sur l'esclave. S'ils le font, vous pourriez probablement faire deux choses:
Ajoutez simplement ceci à my.cnf sur l'esclave
[mysqld]
slave-skip-errors=1062
skip-slave-start
et redémarrez mysql. Ensuite, exécutez START SLAVE;
toutes les erreurs de clé en double seront contournées. Quand Seconds_Behind_Master
arrive à 0, supprimez ces lignes et redémarrez mysql.
Les outils dont vous avez besoin sont
Utilisez-les pour trouver les différences dans l'esclave, puis corrigez-les
Vérifiez la requête d'insertion dans le code qui s'insère directement dans l'esclave. Nous ne pouvons lire que depuis l'esclave. Les requêtes d'écriture doivent être adressées au maître.