GNU/Linux >> Tutoriales Linux >  >> Linux

Reparación de bases de datos MySQL InnoDB

Introducción:
Esta publicación es una copia de la maravillosa publicación siguiente:
https://blackbird.si/mysql-corrupted-innodb-tables-recovery-step-by-step-guide/https://blackbird .si/mysql-corrupted-innodb-tables-recovery-step-by-step-guide/

Aquí hay algunos extractos importantes de él:

MySQL – Recuperación de tablas corruptas de InnoDB – Guía paso a paso

Publicado en bases de datos por Alen Krmelj el 19 de marzo de 2013, 5-6 minutos

Las tablas de InnoDB no se corrompen fácilmente, pero cuando lo hacen, generalmente ocurre debido a problemas de hardware, cortes de energía o errores de MySQL. Lo deja con páginas corruptas en el espacio de tabla de InnoDB y recuperarse de eso podría ser un problema. Cuando su MySQL falla correctamente y no quiere volver, es posible que vea un error similar en bucle:

InnoDB: Assertion failure in thread 1129654592 in file ibuf0ibuf.c line 4231
InnoDB: Failing assertion: page_get_n_recs(page) > 1
InnoDB: We intentionally generate a memory trap.
InnoDB: Submit a detailed bug report to http://bugs.mysql.com.
InnoDB: If you get repeated assertion failures or crashes, even
InnoDB: immediately after the mysqld startup, there may be
InnoDB: corruption in the InnoDB tablespace. Please refer to
InnoDB: http://dev.mysql.com/doc/refman/5.5/en/forcing-innodb-recovery.html
InnoDB: about forcing recovery.
mysqld got signal 6 ;

This could be because you hit a bug. It is also possible that this binary
or one of the libraries it was linked against is corrupt, improperly built,
or misconfigured. This error can also be caused by malfunctioning hardware.
We will try our best to scrape up some info that will hopefully help diagnose
the problem, but since we have already crashed, something is definitely wrong
and this may fail.
...
some backtrace
...
The manual page at http://dev.mysql.com/doc/mysql/en/crashing.html contains
information that should help you find out what is causing the crash.
mysqld_safe Number of processes running now: 0
mysqld_safe mysqld restarted

Recuperación de tablas InnoDB dañadas

Paso 1:active su base de datos en modo de recuperación

Deberías bajar tu base de datos. Ciérrelo en caso de que todavía se esté ejecutando y esté enviando spam a estos mensajes en su registro. Como último recurso, también puede eliminar el proceso. Para recuperar su base de datos, deberá iniciarla en modo de recuperación, con innodb_force_recovery . Debe saber que este modo de recuperación hace que sus bases de datos sean de solo lectura. Los usuarios que se conectan a él no pueden actualizar, insertar o alterar de otra manera los datos existentes. Para evitar que su MySQL sea golpeado en el momento en que regresa, le sugiero que también cambie el puerto del servidor MySQL de 3306 a algo aleatorio. Agregue innodb_force_recovery=1 a su my.cnf En caso de que su servidor no quiera volver, puede aumentar aún más este número de 1 a 6, consulte el manual de MySQL para ver cuáles son las diferencias.

Asegúrese de revisar sus registros de MySQL, y si se repite con algo como:

InnoDB: Waiting for the background threads to start

También debe agregar innodb_purge_threads=0 a su my.cnf .

Entonces, todos juntos para recuperar la base de datos, tuve que agregar estos 3 parámetros en my.cnf :

port = 8881
innodb_force_recovery=3
innodb_purge_threads=0

Paso 2:compruebe qué tablas están dañadas y haga una lista

Ahora tiene su base de datos en funcionamiento, pero en modo de recuperación. No puede cambiar sus bases de datos/tablas. Si lo intenta, obtendrá el error:

Got error -1 from storage engine

Necesitamos averiguar qué tablas se corrompieron. Para hacer eso, ejecutamos:mysqlcheck --all-databases

Verifique las líneas donde dice que la tabla está dañada. Anote todas las tablas/bases de datos que le dieron un error. Deberá mysqldump en modo de recuperación y vuelva a importarlos después de que reinicie en modo MySQL normal. Permíteme recordarte también que innochecksum El comando no me ayudó a descubrir qué tablas están dañadas, así que no se moleste con eso.

Paso 3:haga una copia de seguridad y elimine sus tablas corruptas

Una vez que obtenga la lista de tablas dañadas, debe mysqldumplas en sus propios archivos .sql, de esa manera tendrá una copia de seguridad para volver a importar. En caso de que se pregunte cómo volcar solo una tabla en la base de datos:

mysqldump tabla de mi_base de datos> base de datos.tabla.sql

Una vez que tenga la copia de seguridad, elimine las tablas dañadas ejecutando:drop table database.table; desde su shell MySQL. Ahora ha limpiado su base de datos MySQL, por lo que es hora de reiniciarla sin modo de recuperación.

Paso 4:reiniciar MySQL en modo normal

Cuando no quede ninguna tabla dañada en nuestra base de datos, debemos eliminar la configuración de my.cnf que agregamos en el Paso 1. No elimine la configuración del puerto todavía, porque a su base de datos todavía le faltan tablas de las que hizo una copia de seguridad y necesita para ser reimportado. Reinicie su MySQL.

Paso 5:importar la copia de seguridad .sql

Importe cada tabla .sql volcada a su base de datos respectiva. Para hacer eso desde CLI:

mysql database < database.table.sql

Paso 6:cambia de puerto y tómate una cerveza

Una vez que haya terminado de importar sus tablas, puede cambiar la configuración del puerto en su my.cnf . Por supuesto, reinicie MySQL después. Debería volver y empezar a funcionar igual que antes del bloqueo. Tome una cerveza y haga clic en la parte superior de esta publicación para informarme que este artículo lo ayudó a resolver su problema.


Linux
  1. Cómo administrar bases de datos MySQL y usuarios en cPanel

  2. Cómo copiar tablas MySQL entre bases de datos

  3. MySQL:conversión a datos por tabla para InnoDB

  4. Copia de seguridad incremental de MySQL:copia de seguridad y recuperación en un punto en el tiempo de las bases de datos InnoDB y MyIsam

  5. Mostrar tipos de bases de datos MySQL en bash

Cómo importar y exportar bases de datos MySQL en Linux

Cómo mostrar una lista de todas las bases de datos en MySQL

Cómo hacer una copia de seguridad de todas las bases de datos MySQL desde la línea de comandos

Cómo mostrar la lista de todas las bases de datos en MySQL

Cómo crear y modificar bases de datos MySQL en cPanel

¿Cómo resolver InnoDB:no se puede bloquear el error ./ibdata1 mysql?