Replica MySQL: "Voce duplicata per chiave PRIMARY"


9

La prego di aiutarmi a capire perché sto ricevendo "Voce duplicata per chiave PRIMARY" su un server slave dopo una risincronizzazione completa.

Fondamentalmente "mysqldump" era in esecuzione quasi tutta la notte e quindi il processo di ripristino ha richiesto un paio d'ore, quindi quando ho avviato lo slave era ~ 63874 secondi indietro rispetto al master.

Il server slave è di sola lettura (read_only) e non vi sono state scritture durante il processo di risincronizzazione, quindi non capisco perché ci siano chiavi duplicate.

Il formato del registro binario è impostato su MIXED sul master.

Comando utilizzato per il backup del DB:

mysqldump --opt --single-transaction -Q --master-data=2 db | bzip2 -cz > db.sql.bz2

Lo slave sta replicando solo un database dal master (db -> db_backup) con le seguenti opzioni:

replicate-wild-do-table = db_backup.%
replicate-rewrite-db = db->db_backup

Risposte:


11

ASPETTO n. 1: replica

Non lo penso

replicate-wild-do-table = db_backup.%
replicate-rewrite-db = db->db_backup

appartenersi, fare parte della stessa coppia.

Anche altre persone si sono chieste di questo

Il problema deriva dalle regole di replica dell'ordine elaborate. Secondo la documentazione MySQL sulle regole di replica :

Se sono state specificate eventuali opzioni --replicate-rewrite-db, vengono applicate prima che vengano testate le regole di filtro --replicate- *.

Anche la documentazione MySQL su replicate-rewrite-db dice:

La traduzione del nome del database viene eseguita prima del test delle regole --replicate- *.

La replicate-wild-do-tableviene applicata dopo la riscrittura. Non sarebbe sorprendente se questo ordinamento in qualche modo imponesse un INSERT in una tabella che ha già dei dati.

Probabilmente ti stai chiedendo come sono arrivati ​​i dati?

ASPETTO # 2: mysqldump

Fare mysqldump --single-transactionsembra essere il modo migliore per eseguire il dump di dati temporizzati. Purtroppo, mysqldump --single-transactionha un tallone d'Achille: ALTER TABLE. Se una tabella è soggetta a ALTER TABLEcomandi, come a DROP TABLEe CREATE TABLE, che possono violare l'integrità della transazione in cui mysqldump stava cercando di eseguire il dump. Troncando una tabella (che è DDL nell'universo MySQL) e rilasciando e aggiungendo indici può anche essere dirompente.

Puoi trovare maggiori informazioni a riguardo dal Segreto MySQLDump segreto meglio conservato di MySQL Performance Blog . In realtà ho affrontato questo punto in una domanda passata che descrive 12 comandi che possono violare l'integrità della transazione di mysqldump: backup MySQL InnoDB

AVVERTIMENTO

EPILOGO

Uno o entrambi gli aspetti potrebbero aver contribuito a far scivolare una riga durante il mysqldump che non avrebbe dovuto esistere a causa della sovrascrittura delle regole o dell'isolamento del mysqldump.

SUGGERIMENTI

Farei un dump mysqlbinlog di tutti i log di inoltro dall'inizio del mysqldump per vedere tutti gli INSERTI che lo Slave elaborerà e vedere se quelle righe esistono già sullo Slave. Se lo fanno, probabilmente potresti fare due cose:

1: salta tutti gli errori della chiave duplicata

Aggiungilo semplicemente a my.cnf sullo Slave

[mysqld]
slave-skip-errors=1062
skip-slave-start

e riavvia mysql. Quindi, corriSTART SLAVE;

tutti gli errori della chiave duplicata verranno ignorati. Quando Seconds_Behind_Masterarriva a 0, rimuovi quelle linee e riavvia mysql.

2: Scarica gli strumenti percona

Gli strumenti di cui hai bisogno sono

Usali per trovare le differenze nello Slave e poi correggili


0

Verificare la query di inserimento nel codice che si inserisce direttamente nello slave. Possiamo solo leggere dallo schiavo. Le query di scrittura devono essere indirizzate al master.


Guarda indietro alla domanda. Lo Slave è di sola lettura e non ci sono scritture durante la risincronizzazione.
RolandoMySQLDBA,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.