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-table
viene 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-transaction
sembra essere il modo migliore per eseguire il dump di dati temporizzati. Purtroppo, mysqldump --single-transaction
ha un tallone d'Achille: ALTER TABLE
. Se una tabella è soggetta a ALTER TABLE
comandi, come a DROP TABLE
e 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_Master
arriva 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