Reparar uma réplica quebrada: conflitos de linha 1062 / 1032
MySQLReplicaçãoComando
-- 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;O que faz
Corrige as duas quebras mais comuns da replicação baseada em linhas (1062 chave duplicada, 1032 linha não encontrada) sem pular a transação, levando a linha da réplica ao estado que a source espera; a consistência dos dados é preservada.
Quando usar
Quando Replica_SQL_Running = No com o erro 1062 / 1032; como reparo adequado em vez de pular o GTID com uma transação vazia.
Atenção
A correção na réplica deve rodar com sql_log_bin=0; caso contrário cria um errant GTID que causa problemas no failover. Se super_read_only=ON, desabilite-o temporariamente e reabilite-o depois. Os valores da before-image pressupõem binlog_row_image=FULL; com MINIMAL só a PK é registrada e o restante da linha precisa ser lido da source. Um conflito em uma tabela normalmente significa que há outros; após o reparo compare a tabela com a source usando pt-table-checksum. Caminho do relay log: SELECT @@relay_log_basename;