Tengo algunas tablas que están particionadas y tienen varios índices en un esclavo replicado. Después de copiar la instantánea (verificado seguro) a un nuevo esclavo y actualizar mysqld de 5.1.42 a 5.5.15 y reiniciar la replicación, recibo bloqueos de InnoDB con el mensaje de error "Puntero no válido ..."
Estos errores han ocurrido en 2 servidores con hardware y O / S diferentes. Despues de correr:
ALTER TABLE .... COALESCE PARTION n;
El problema desaparece para esa mesa.
Sin embargo, mi pregunta tiene un alcance mayor y es "¿Cómo identificas la corrupción de la tabla InnoDB?" o reformulado "¿Cómo evalúa el estado de la tabla InnoDB?" ¿Es "CHECK TABLE" la única herramienta disponible para identificar problemas previos al bloqueo?
No estoy seguro de si es importante, pero se produjeron bloqueos al ejecutarse: Versión: socket '5.5.15-55-log': puerto '/opt/mysql.sock': servidor 3306 Percona (GPL), versión rel21.0, revisión 158
fuente
Respuestas:
Morgan da una pista en su comentario de que InnoDB está constantemente buscando páginas corruptas haciendo sumas de verificación en las páginas que lee. Si InnoDB encuentra una desigualdad suma de comprobación, será
estrellarsedetener el servidor.Si desea acelerar ese proceso (en lugar de esperar a que InnoDB lea la página dañada), puede usar
innochecksum
:Una advertencia interesante:
Entonces sí, para una tabla en línea
CHECK TABLE
es probablemente la herramienta (o como se señala en otra respuestamysqlcheck
si desea hacer más de una base de datos a la vez).Si puede cerrar su base de datos, puede forzarla a usar las sumas de verificación
innochecksum
Anécdota: en un espacio de tabla innodb de 29 GB (con
innodb_file_per_table=1
), este script tardó aproximadamente 2 minutosSin embargo, como beneficio adicional, ya que está ejecutando Percona, implementaron un nuevo método para la suma de comprobación rápida innodb . Nunca lo he usado, pero podría acelerar el proceso.
fuente
ADVERTENCIA: antes de intentar cualquiera de estas instrucciones, se recomienda verificar que haya una copia de seguridad de su base de datos en manos, por si acaso. (gracias a @Nick por la advertencia)
Intenta usar el
mysqlcheck
comando. En una terminal:Este comando generará una lista de todas las tablas y un estado que le indicará si hubo algún tipo de corrupción:
Con eso en las manos, ya sabrá qué tablas debe reparar. En caso de que quiera reparar todo de una vez:
Más sobre
mysqlcheck
: http://dev.mysql.com/doc/refman/5.0/en/mysqlcheck.htmlNota: etiquetó su pregunta con percona . No tenía idea de qué era eso, así que busqué en Google. Parece ser una bifurcación de MySQL, pero no tengo ninguna razón para creer que los comandos son incompatibles (dedos cruzados).
Alguien me señaló esta guía que tiene instrucciones más específicas para la recuperación de la base de datos InnoDB para situaciones más críticas en las que no se inicia toda la base de datos: http://www.softwareprojects.com/resources/programming/t-how-to-fix-mysql -database-myisam-innodb-1634.html
fuente
CHECK TABLE
. La documentación se ha vinculado a los estados: "mysqlcheck
utiliza las sentencias SQLCHECK TABLE
,REPAIR TABLE
,ANALYZE TABLE
, yOPTIMIZE TABLE
de una manera conveniente para el usuario determina qué estados de uso para la operación que desea realizar y, a continuación, envía las declaraciones al servidor para ser ejecutados.. " Eso no es sinónimo; esa es una interfaz de usuario para una colección de declaraciones.De acuerdo con la Guía de estudio de certificación MySQL 5.0, página 443,444 Sección 30.4 :
Lea los documentos de MySQL sobre InnoDB Forced Recovery
fuente
Me pregunto qué sucede si alguien usa los datos de InnoDB creados a través del complemento InnoDB y luego cambia a otra versión de InnoDB. Eso podría crear una posible corrupción de página a los ojos de mysqld.
Tenga en cuenta lo que dice la documentación de MySQL sobre el formato de archivo InnoDB sobre esta posibilidad:
Descartaría los datos del esclavo. De hecho, usaría la fuerza bruta obteniendo un volcado lógico (mysqldump) de los datos:
Mi respuesta original publicada se considera 'vieja escuela'. Sin embargo, en este caso, definitivamente examinaría los formatos de archivo utilizados por .ibd y / o ibdata1.
fuente