Replicación MySQL: 'Entrada duplicada para clave PRIMARIA'

9

¿Podría ayudarme a comprender por qué recibo 'Entrada duplicada para la clave PRIMARIA' en un servidor esclavo después de una sincronización completa?

Básicamente, 'mysqldump' se ejecutó casi toda la noche y luego el proceso de restauración tardó un par de horas, así que cuando comencé el esclavo, estaba ~ 63874 segundos detrás del maestro.

El servidor esclavo es de solo lectura (solo lectura) y no hubo ninguna escritura durante el proceso de resincronización, por lo que no entiendo por qué hay claves duplicadas.

El formato de registro binario se establece en MIXTO en el maestro.

Comando utilizado para respaldar la base de datos:

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

El esclavo está replicando solo una base de datos del maestro (db -> db_backup) con las siguientes opciones:

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

Respuestas:

11

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-tablese 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-transactionparece ser la mejor manera de volcar datos en un momento dado. Por desgracia, mysqldump --single-transactiontiene un talón de Aquiles: ALTER TABLE. Si una tabla está sujeta a algún ALTER TABLEcomando, como a DROP TABLEy 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_Masterllegue 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

RolandoMySQLDBA
fuente
0

Verifique la consulta de inserción en el código que se inserta directamente en el esclavo. Solo podemos leer de esclavos. Las consultas de escritura deben dirigirse al maestro.

Umair Anwar
fuente
Mira de nuevo a la pregunta. El esclavo es de solo lectura y no hay escrituras durante la resincronización.
RolandoMySQLDBA