DBAtlas · Atlas für Datenbankbetrieb

Defekte Replica reparieren: Zeilenkonflikte 1062 / 1032

MySQLReplikation

Befehl

-- 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;

Was es tut

Behebt die zwei häufigsten Abbrüche zeilenbasierter Replikation (1062 duplicate key, 1032 row not found), ohne die Transaktion zu überspringen, indem die Zeile auf der Replica in den Zustand gebracht wird, den die Quelle erwartet; die Datenkonsistenz bleibt erhalten.

Wann einsetzen

Wenn Replica_SQL_Running = No mit Fehler 1062 / 1032 ist; als saubere Reparatur, statt die GTID mit einer leeren Transaktion zu überspringen.

Vorsicht

Die Korrektur auf der Replica muss mit sql_log_bin=0 laufen; sonst entsteht eine Errant GTID, die beim Failover zum Problem wird. Ist super_read_only=ON, vorübergehend deaktivieren und danach wieder aktivieren. Die Before-Image-Werte setzen binlog_row_image=FULL voraus; bei MINIMAL wird nur der PK protokolliert, und der Rest der Zeile muss von der Quelle gelesen werden. Ein Konflikt in einer Tabelle bedeutet meist, dass es weitere gibt; nach der Reparatur die Tabelle mit pt-table-checksum mit der Quelle vergleichen. Pfad des Relay Logs: SELECT @@relay_log_basename;

In DBAtlas öffnen →

Verwandte Einträge