Tengo este error de InnoDB en MySQL 5.0. Mysqld se detuvo limpiamente, pero logré perder ib_logfile0 e ib_logfile1 después. Ahora, después de un inicio limpio, InnoDB ha realizado su "recuperación de bloqueo". Revisé el negocio innodb_force_recovery = 4, reparé una tabla MyISAM colgada y ahora la replicación está lista, aparte de esto. Grandes números comunicados:
111116 15:49:36 InnoDB: Error: page 393457 log sequence number 111 561,760,232
InnoDB: is in the future! Current system log sequence number 70 3,946,969,851.
InnoDB: Your database may be corrupt or you may have copied the InnoDB
InnoDB: tablespace but not the InnoDB log files. See
InnoDB: http://dev.mysql.com/doc/refman/5.0/en/forcing-recovery.html
InnoDB: for more information.
Esto está en un servidor esclavo. El error anterior arroja por cientos. Encontré esta respuesta: "insertar y eliminar> 64 GB de datos, para que el número de secuencia de registro se infle lo suficientemente grande".
http://forums.mysql.com/read.php?22,50163,50163#msg-50163
Ese número mágico de 64 GB proviene de 4 GB * 16, donde el "número mayor" del registro innodb de ese tipo necesitaba aumentar de 0 a 15. El mío va de 70 a 111 = 164 GB. Esto llevará 5 días. Seguiré trabajando para acelerar mi script y ejecutarlo en paralelo para acelerar esto. Mientras tanto, espero que alguien más tenga una mejor respuesta. Esto es tonto.
Respuestas:
Esta era una situación bastante rara. Espero no volver a terminar allí nunca más, con un "número de secuencia de registro InnoDB en el futuro". error. Debido a mis detalles particulares, la reconstrucción / restauración de los datos de mi servidor fue el último recurso. Algunos trucos para ayudar fueron buenas ideas, pero al final, decidí seguir mejorando mi script de Perl para jugar este juego tonto y batir tantos conciertos / hora como pude. Qué diablos, es una buena prueba de estrés del sistema.
Recuerde: el objetivo es aumentar un único contador ("número de secuencia de registro") que se almacena en algún lugar de los encabezados de ib_logfile0 e ib_logfile1 . Esto es para fingir InnoDB para que ignore una distorsión temporal aparente y continúe con la vida. Pero nadie sabe cómo editar ese número. O si lo saben, nadie está hablando.
Aquí está mi producto final. YMMV, pero usar la función REPEAT de mysql para generar los datos internamente es altamente eficiente.
Mi receta sugerida:
while true; do date; junk.pl dataX; done
.Observe cómo crece su LSN, tal vez en otro ciclo:
El gran número es un INT de 32 bits sin signo que se ajustará a 4 GB, aumentando el número más pequeño cada vez. En este caso anterior, simplemente pasó de 124 a 125. Su objetivo está oculto en el mysqld.log que lo envió a Google para esta solución ridícula en primer lugar. Una vez que cruce esa línea de meta, ¡eso es todo! Soplar los cuernos! ¡Suelta el confeti!
fuente
Tienes tres (3) opciones:
OPCIÓN 01: Realizar rsync de maestro a esclavo (tiempo de inactividad en el maestro)
reset master;
en el maestro (registros binarios de Zaps)service mysql stop
en el maestroservice mysql stop
en el esclavoservice mysql start
en el maestroservice mysql stop --skip-slave-start
en el esclavostart slave;
el esclavo y deja que la replicación se ponga al díaOPCIÓN 02: Realizar rsync de maestro a esclavo (tiempo de inactividad mínimo en el maestro)
reset master;
en el maestro (registros binarios de Zaps)service mysql stop
en el esclavoservice mysql stop
en el maestroservice mysql start
en el maestroservice mysql stop --skip-slave-start
en el esclavostart slave;
en el esclavo y dejar que la replicación se ponga al díaOPCIÓN 03: Usar XtraBackup
Esta herramienta de software no solo realizará una copia no intrusiva de un maestro en ejecución, sino que también creará los ib_logfiles correspondientes para usted. Tendría que configurar la replicación
He publicado anteriormente en StackExchange sobre este tema
He hecho estas cosas muchas veces para la empresa de alojamiento web de mi empleador. Un cliente tenía 3,7 TB para mover y tardó aproximadamente 16 horas. 64GB es muy pequeño en comparación.
fuente
RESET SLAVE
es útil, especialmente si ha acumulado muchos GB de registros de retransmisión. Después del proceso rsync y el restablecimiento de la replicación, recuerde que el comando CAMBIAR MAESTRO A también borrará los registros de retransmisión para usted también.Descubrí que quizás haya una forma más genial de resolver este problema trabajando en tablas particionadas. Necesitaba eliminar particiones de algunos años atrás, y tuve que agregar algunas para 2014. Casi todas las particiones informan este error, así que también las antiguas. Choque muy desagradable.
Entonces, mientras DROPPING old y use REORGANIZE de la partición MAXVALUE (la última), creará nuevos archivos que están bien, por lo que recibo cada vez menos advertencias. Mientras tanto, ayuda a incrementar el contador de secuencia de registro, por lo que no necesito insertar datos falsos. Tengo esto sucediendo en un servidor maestro por cierto ...
Así que esto:
Y esto:
Eso eliminará efectivamente cada partición en el cambio y la recreará con una copia temporal del contenido de lo que estaba allí. Puede hacerlo por tabla si lo desea, mi aplicación permite que eso suceda, por lo que no tiene que preocuparse por las copias de seguridad sincronizadas, etc.
Ahora, para el resto de la tabla, dado que no he tocado todas las particiones en el proceso, algunas quedarán con la advertencia de secuencia de registro, para aquellas que están rotas pero cubiertas por esta acción de reorganización, probablemente ejecutaré esto:
o eso
Entonces, eso me hizo pensar, podría hacer esto con tablas simples de vainilla, agregar particiones temporalmente por hash y luego eliminarlo (o mantenerlas, puedo recomendar particiones).
Sin embargo, estoy usando mariadb, no mysql (entonces XtraDB)
Quizás esto ayude a alguien. Todavía lo estoy ejecutando, hasta ahora todo bien. Cambiar ENGINE también parece hacer el trabajo, así que lo traigo de regreso entre MyIsam y ellos a InnoDB.
Es bastante lógico, si cambia ENGINE, la tabla desaparece de innodb, por lo que ya no será un problema.
Parece que funciona aquí. Puedo confirmar algunas cosas en tablas particionadas:
Usé los últimos en varias mesas. Las advertencias ocurren cuando se trata de abrir los archivos y hay una para cada definición de partición que se abre con problemas de contador. Casi rodé sobre el mostrador hoy para las últimas mesas. Creo que una vez que todo está procesado, uno necesita vaciar los registros binarios.
actualización : puedo concluir algunas cosas ahora que logré resolver este problema.
fuente
USE INFORMATION_SCHEMA; SELECT CONCAT("ALTER TABLE `", TABLE_SCHEMA,"`.`", TABLE_NAME, "` REBUILD PARTITION ALL;") AS MySQLCMD AS MySQLCMD FROM TABLES;
(fuente: dba.stackexchange.com/questions/35073/… ) y unirlo a un archivo para que se ejecute como una serie de comandos.