ASPECTO # 1: Replicación
No creo que
replicate-wild-do-table = db_backup.%
replicate-rewrite-db = db->db_backup
pertenecer juntos
Otras personas también se han preguntado sobre esto
El problema se deriva de que se procesan las reglas de replicación del pedido. De acuerdo con la documentación de MySQL sobre las reglas de replicación :
Si se especificaron las opciones --replicate-rewrite-db, se aplican antes de que se prueben las reglas de filtrado --replicate- *.
Incluso la documentación de MySQL en replicate-rewrite-db dice:
La traducción del nombre de la base de datos se realiza antes de que se prueben las reglas --replicate- *.
El replicate-wild-do-table
se aplica después de la reescritura. No sería sorprendente si este pedido de alguna manera impusiera un INSERT en una tabla que ya tiene datos.
Probablemente se pregunte cómo llegaron los datos allí.
ASPECTO # 2: mysqldump
Hacerlo mysqldump --single-transaction
parece ser la mejor manera de volcar datos en un momento dado. Por desgracia, mysqldump --single-transaction
tiene un talón de Aquiles: ALTER TABLE
. Si una tabla está sujeta a algún ALTER TABLE
comando, como a DROP TABLE
y CREATE TABLE
, que puede romper la integridad de la transacción, mysqldump intentaba realizar el volcado. Truncar una tabla (que es DDL en el universo MySQL) y soltar y agregar índices puede También ser tan disruptivo.
Puede encontrar más información al respecto en el MySQLDump Secret mejor guardado de MySQL Performance Blog . De hecho, abordé este punto en una pregunta anterior que describe 12 comandos que pueden romper la integridad de una transacción de mysqldump: MySQL backup InnoDB
CONSIDERACIÓN
EPÍLOGO
Uno o ambos aspectos pueden haber contribuido a permitir que una fila se deslice durante el mysqldump que no debería haber existido debido a las reglas de reescritura o al aislamiento del mysqldump que se anula.
SUGERENCIAS
Haría un volcado de mysqlbinlog de todos los registros de retransmisión desde el inicio de mysqldump para ver todos los INSERTOS que el esclavo procesará y ver si esas filas ya existen en el esclavo. Si lo hacen, probablemente podría hacer dos cosas:
1: omita todos los errores de clave duplicada
Simplemente agregue esto a my.cnf en el esclavo
[mysqld]
slave-skip-errors=1062
skip-slave-start
y reinicie mysql. Entonces correSTART SLAVE;
todos los errores de clave duplicada se omitirán. Cuando Seconds_Behind_Master
llegue a 0, elimine esas líneas y reinicie mysql.
2: descargar herramientas de percona
Las herramientas que necesitas son
Úselos para encontrar las diferencias en el esclavo y luego corríjalos