Un relé MySQL v5.1.61 se corrompió cuando la máquina se apagó repentinamente. Traté de arreglarlo pero no funcionó.
- ¿Cómo lo soluciono? ¿Hice algo mal?
Hasta donde he leído, los registros corruptos de retransmisión de MySQL se arreglan fácilmente:
change master to master_log_file='<Relay_Master_Log_File>',
master_log_pos=<Exec_Master_Log_Pos>;
donde Relay_Master_Log_File
y Exec_Master_Log_Pos
están listados por:
mysql> show slave status;
Sin embargo, cuando lo hice change master status ...
, recibí un error de violación de clave principal. ¿Cómo es eso posible? ¿El procedimiento anterior no es correcto o, por ejemplo, falta algún +1?
(Por ahora simplemente he reimportado un --master-data mysqldump del maestro al esclavo, y esto resolvió el problema. Sin embargo, en el futuro, hacer eso podría no ser apropiado).
Aquí sigue detalles sobre mi problema particular:
mysql> show slave status \G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: the-master-host
Master_User: replication
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000021
Read_Master_Log_Pos: 33639968
Relay_Log_File: mysql-relay-bin.000271
Relay_Log_Pos: 2031587
Relay_Master_Log_File: mysql-bin.000020
Slave_IO_Running: Yes
Slave_SQL_Running: No
Replicate_Do_DB: the_database
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 1594
Last_Error: Relay log read failure: Could not parse relay log event entry. The possible reasons are: the master's binary log is corrupted (you can check this by running 'mysqlbinlog' on the binary log), the slave's relay log is corrupted (you can check this by running 'mysqlbinlog' on the relay log), a network problem, or a bug in the master's or slave's MySQL code. If you want to check the master's binary log or slave's relay log, you will be able to know their names by issuing 'SHOW SLAVE STATUS' on this slave.
Skip_Counter: 0
Exec_Master_Log_Pos: 66395191
Relay_Log_Space: 36559177
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 1594
Last_SQL_Error: Relay log read failure: Could not parse relay log event entry. The possible reasons are: the master's binary log is corrupted (you can check this by running 'mysqlbinlog' on the binary log), the slave's relay log is corrupted (you can check this by running 'mysqlbinlog' on the relay log), a network problem, or a bug in the master's or slave's MySQL code. If you want to check the master's binary log or slave's relay log, you will be able to know their names by issuing 'SHOW SLAVE STATUS' on this slave.
Y esto es lo que hice:
mysql> stop slave;
mysql> reset slave;
mysql> change master to master_host='the-master-host', master_user='replication', master_password='the-password', master_log_file='mysql-bin.000020', master_log_pos=66395191;
mysql> start slave;
Y esto es lo que sucedió, un error de PK:
131122 15:17:29 [Note] Slave I/O thread: connected to master 'replication@the-master-host:3306',replication started in log 'mysql-bin.000020' at position 66395191
131122 15:17:29 [ERROR] Slave SQL: Error 'Duplicate entry '71373' for key 'PRIMARY'' on query. Default database: 'the_database'. Query: 'insert into ... values ...', Error_code: 1062
131122 15:17:29 [Warning] Slave: Data truncated for column 'date' at row 1 Error_code: 1265
131122 15:17:29 [Warning] Slave: Duplicate entry '71373' for key 'PRIMARY' Error_code: 1062
Creo que seguí el procedimiento recomendado (vea los enlaces a continuación), aún hubo un error de PK :-(? Http://bugs.mysql.com/bug.php?id=26489 , busque "Soluciones". Http: //mhbarr.wordpress.com/2013/07/26/mysql-slave-corrupted-relay-log/ /programming//a/14438408
fuente
SET GLOBAL sql_slave_skip_counter = 1; START SLAVE;
y omitiré un evento en el esclavo, y espero que eso ayude, ¿tiene sentido? Si no ayuda (si todavía hay un error de PK), importaré un volcado--master-data
nuevamente.Respuestas:
Error: Last_SQL_Errno: 1594 Last_SQL_Error: error de lectura del registro de retransmisión: no se pudo analizar la entrada del evento de registro de retransmisión.
Este error significa que el archivo de registro maestro está dañado o el archivo de registro de retransmisión está dañado.
Primero ejecute "mostrar estado esclavo \ G" en el esclavo y observe:
Primero queremos asegurarnos de que el archivo de registro maestro esté intacto, así que salte al servidor maestro y busque el archivo Relay_Master_Log_File (check / var / log / mysql) y ejecute el siguiente comando:
El registro se mostrará pero esperamos que no vea ningún mensaje de error. Si ve mensajes de error, los registros maestros están dañados y es probable que deba volver a crear una imagen.
Luego ejecute el mismo comando en el registro de retransmisión esclavo (a menudo en / var / lib / mysql)
Es probable que vea algunos errores que muestran la corrupción que ha detenido la replicación, como esta:
Si ve algún error, entonces el registro está bien en el maestro y solo el registro de retransmisión del esclavo está dañado. Estas son buenas noticias, podemos reiniciar el esclavo y decirle los detalles del maestro y desde dónde continuar. Si no ve ningún error, deje de leer ahora, tiene un problema diferente.
Si el registro del relé esclavo tiene errores, ejecute los siguientes comandos para restablecer el esclavo y los registros corruptos se vuelven a conectar al maestro, obtenga los registros correctos y comience a esclavizar nuevamente. Tenga en cuenta que MASTER_LOG_POS es el
Exec_Master_Log_Pos
, y MASTER_LOG_FILE es elRelay_Master_Log_File
( NO el primero, que coincide con los registros de retransmisión que se han recuperado y deben desecharse) desde el primer comando.fuente
mysqlbinlog
de la manera que sugiere, y descubrió que el registro de retransmisión (no el registro maestro) estaba dañado. Concentrándose en la solución que sugiere: si lee la pregunta detenidamente, notará que la solución que sugiere es exactamente lo que ya habíamos intentado. Pero eso no funcionó, y de eso se trata la pregunta. - Pero su respuesta podría ser útil para otras personas con un problema similar.MASTER_LOG_FILE
enCHANGE MASTER
debe ser tomado deRelay_Master_Log_File
y no deMaster_Log_File
. Por lo general, serán lo mismo, pero puede que no sea el caso siempre (ver percona.com/blog/2008/07/07/… ).Relay_Master_Log_File
debe ser usado, noMaster_Log_File
. Ver también: percona.com/blog/2008/07/07/…reset slave all
porque no es necesario cambiar la configuración maestra (por ejemplo, master_host, master_user, master_password), solo MASTER_LOG_FILE y MASTER_LOG_POS, entoncesreset_slave
debería ser suficiente[Arreglando la replicación de MySQL después de que el registro de retransmisión de los esclavos estuviera dañado]
fuente
Sé que ha pasado más de un año, pero esto es lo que puede haber sucedido con este problema en particular.
Parece que eso debería haberlo solucionado porque eliminó el registro de retransmisión corrupto.
Entonces, recibiste un error PK 1062. ¿Por qué?
Hay un error sobresaliente ( http://bugs.mysql.com/bug.php?id=60847 ) que todavía está activo en MySQL 5.5
Aunque el error se relaciona con el uso de mysql --single-transaction --flush-logs, existe una peculiaridad relacionada.
He visto esa peculiaridad en algunos servidores EC2 que se ejecutan como esclavos para un cliente la semana pasada en MySQL 5.5.15
En el Master, había un extraño INSERT extendido de múltiples filas donde cada tupla que se insertaba era un SELECT. Lo que sucedió fue que el LAST_INSERT_ID en el registro de retransmisión, que forma el siguiente incremento automático para asignar, ya estaba en uso en el Esclavo debido a las inserciones de varias filas de antemano.
El INSERT serializado en el registro de retransmisión parecía
La lista de columnas no incluía la clave primaria numérica. Cuando volvió el error 1062, usaría la misma consulta en la que falló, ejecutaría la consulta manualmente. No alcanzó el error 1062. Luego, ejecuté los comandos habituales de omisión de esclavos:
Entonces, la replicación se puso al día.
Mi consejo sería serializar adecuadamente sus INSERTs en el Master porque esta situación similar a un error es realmente evitable.
fuente
Lo has hecho bien (como ya se dijo).
El único problema es con el archivo master.info (contiene información sobre la posición en mysql-bin.log del maestro) porque este archivo no se sincroniza con el disco después de cada consulta procesada.
Por lo tanto, su información sobre las posiciones en el registro del maestro está desactualizada y está procesando consultas ya procesadas que deben omitirse
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
.Desafortunadamente, si usa algunas consultas como
UPDATE table SET counter=counter+1 WHERE id = 12345
y el uso debinlog_format=STATEMENT
sus bases de datos puede no estar sincronizado, creo.Puede decirle al servidor MySQL que sincronice master.info después de cada evento configurando la variable sync_master_info, pero probablemente tendrá enormes consecuencias de rendimiento.
fuente