Réparer une réplique en échec : conflits de lignes 1062 / 1032
MySQLRéplicationCommande
-- 1) Failing worker, error and GTID
SELECT WORKER_ID, LAST_ERROR_NUMBER, LEFT(LAST_ERROR_MESSAGE, 250) AS last_error, APPLYING_TRANSACTION
FROM performance_schema.replication_applier_status_by_worker
WHERE LAST_ERROR_NUMBER <> 0;
-- 2) Shell: decode the row images of that transaction from the relay log
mysqlbinlog --base64-output=DECODE-ROWS -vv --include-gtids='af6bc361-c353-11f1-8f12-f69e63ad6c0e:11' /var/lib/mysql/db2-relay-bin.0* | grep '^###'
-- 3a) 1062 Duplicate entry: delete the extra row on the replica without binlogging
SET SESSION sql_log_bin = 0;
DELETE FROM shop.orders WHERE id = 20001;
-- 3b) 1032 Can't find record: insert the missing row from the WHERE (before image) values
INSERT INTO shop.orders (id, cust, amount, note, created) VALUES (6, 6, 9.00, 'n6', '2026-10-08 20:09:44');
SET SESSION sql_log_bin = 1;
-- 4) Start the applier and verify
START REPLICA SQL_THREAD;
SELECT SERVICE_STATE, LAST_ERROR_NUMBER FROM performance_schema.replication_applier_status_by_coordinator;Ce que fait la commande
Corrige les deux ruptures de réplication row-based les plus courantes (1062 clé dupliquée, 1032 ligne introuvable) sans sauter la transaction, en ramenant la ligne de la réplique à l'état attendu par la source ; la cohérence des données est préservée.
Quand l'utiliser
Lorsque Replica_SQL_Running = No avec l'erreur 1062 / 1032 ; comme réparation propre au lieu de sauter le GTID avec une transaction vide.
Attention
La correction sur la réplique doit s'exécuter avec sql_log_bin=0 ; sinon elle crée un errant GTID qui pose problème au failover. Si super_read_only=ON, désactivez-le temporairement puis réactivez-le. Les valeurs before-image supposent binlog_row_image=FULL ; avec MINIMAL, seule la PK est journalisée et le reste de la ligne doit être lu sur la source. Un conflit dans une table signifie généralement qu'il y en a d'autres ; après la réparation, comparez la table avec la source à l'aide de pt-table-checksum. Chemin du relay log : SELECT @@relay_log_basename;
Voir aussi
- Mettre en place une réplique (CHANGE REPLICATION SOURCE)
- Démarrer / arrêter une réplique
- Afficher l'état de la réplique (SHOW REPLICA STATUS)
- Sauter une transaction en échec (GTID)
- Surveiller le retard de la réplique et les erreurs des workers d'apply (performance_schema)
- Régler la réplique multi-thread (replica_parallel_workers)