Cómo resolver casos de corrupción de InnoDB para la base de datos MySQL

Created:

2016-11-16 13:08:52 UTC

Modified:

2017-08-18 18:00:03 UTC

33

Was this article helpful?


Have more questions?

Enviar una solicitud

Cómo resolver casos de corrupción de InnoDB para la base de datos MySQL

Aplicable a:

  • Plesk

Síntomas

  1. En Plesk puede verse el siguiente error:

    ERROR: PleskMainDBException
    MySQL query failed: Incorrect information in file: './psa/misc.frm'
  2. Al actualizar Plesk se obtiene el siguiente error:

    DATABASE ERROR!!!
    Database psa found, but version undefined
  3. El servicio MySQL no se inicia:

    /etc/init.d/mysqld start
    Timeout error occurred trying to start MySQL Daemon.
    Starting MySQL: [FAILED]
  4. mysqldump y mysqlcheck devuelven un mensaje de error informando de que una tabla no existe (use la cuenta del administrador de MySQL para verificarlo):

    mysqlcheck -uadmin -p****** db_example

    db_example.BackupTasks
    error : Can't find file: 'BackupTasks.MYD' (errno: 2)
  5. No se puede efectuar una consulta a una tabla con el argumento SELECT :

    mysql> select * from db_example.misc;
    ERROR 1033 (HY000): Incorrect information in file: './db_example/misc.frm'
  6. La tabla no puede repararse porque el motor InnoDB no soporta la reparación.

    mysql> repair table misc;
    +-------------------------+--------+----------+---------------------------------------------------------+
    | Table | Op | Msg_type | Msg_text |
    +-------------------------+--------+----------+---------------------------------------------------------+
    | psa.APSApplicationItems | repair | note | The storage engine for the table doesn't support repair |
    +-------------------------+--------+----------+---------------------------------------------------------+
  7. En el archivo de registro de MySQL se muestra la siguiente información:

    150704 19:09:27 InnoDB: Waiting for the background threads to start
    150704 19:09:28 InnoDB: Error: tablespace size stored in header is 3712 pages, but
    150704 19:09:28 InnoDB: the sum of data file sizes is only 3072 pages
    150704 19:09:28 InnoDB: Cannot start InnoDB. The tail of the system tablespace is
    150704 19:09:28 InnoDB: missing. Have you edited innodb_data_file_path in my.cnf in an
    150704 19:09:28 InnoDB: inappropriate way, removing ibdata files from there?
    150704 19:09:28 InnoDB: You can set innodb_force_recovery=1 in my.cnf to force
    150704 19:09:28 InnoDB: a startup if you are trying to recover a badly corrupt database.

Causa

InnoDB está dañado.

En la mayoría de los casos se trata de un problema de hardware. La escritura en páginas corruptas puede estar ocasionada por fallos de corriente o por una memoria incorrecta. La incidencia también puede deberse al uso de almacenamiento de red compartido (NAS) y a la asignación de bases de datos InnoDB a este.

Resolución

Nota: como la ubicación del archivo de configuración, de los registros y del control del servicio MySQL no es la misma para todos los sistemas operativos, este artículo únicamente proporciona ejemplos de comandos generales. Si desea más información sobre MySQL en los distintos sistemas operativos, consulte los siguientes artículos:

[Linux] Servidor MySQL local para todas las bases de datos

[Windows] Servidor MySQL local para las bases de datos de los clientes

[Windows] Servidor MySQL local para bases de datos relacionadas con Plesk (psa, apsc, horde)

Si desea más información, verifique su sistema operativo y la documentación de MySQL.

Existen distintas formas de recuperar una base de datos MySQL fallida:

I. Forzar la recuperación de InnoDB

  1. Detenga el servicio MySQL afectado. Haga clic aquí para obtener más información sobre el control del servicio.

  2. Cree un backup de todos los archivos de almacenamiento de datos de MySQL. Estos se encuentran en los siguientes directorios:

    /var/lib/mysql/ - todas las bases de datos en Linux

    %plesk_dir%\\Databases\\MySQL\\Data\\ - bases de datos de los clientes en Windows

    %plesk_dir%\\MySQL\\Data\\ - bases de datos relacionadas con Plesk (psa, apsc, horde) en Windows.

    Por ejemplo:

    # mkdir /root/mysql_backup
    # cp -a /var/lib/mysql/* /root/mysql_backup/
  3. Defina el valor innodb_force_recovery en la sección [mysqld] ( [PleskSQLServer] para Plesk SQL Server en Windows) en el archivo de configuración de MySQL . Esta opción le permitirá iniciar el servicio MySQL y crear un volcado de todas las bases de datos.

    Por ejemplo:

    # vi /etc/my.cnf
    [mysqld]
    innodb_force_recovery = 1

    IMPORTANTE: Únicamente defina innodb_force_recovery a un valor superior a 0 en caso de emergencia para que así pueda iniciar InnoDB y volcar sus tablas. Si establece un valor de 4 o un valor superior, puede que los archivos de datos resulten dañados de forma permanente. Así, aumente este valor de forma incremental tal y como sea necesario. Si desea más información, consulte la documentación oficial de MySQL.

  4. Inicie el servicio MySQL.

  5. Intente volcar todas las bases de datos:

    # MYSQL_PWD=`cat /etc/psa/.psa.shadow` mysqldump -uadmin -A | sed '1i\\SET FOREIGN_KEY_CHECKS = 0;' > /root/dumpall.sql
    • Si al efectuar el volcado obtiene un error como:

      Incorrect information in file: './psa/APSApplicationItems.frm' when using LOCK TABLES"`

      deberá aumentar innodb_force_recovery e intentar volcar las bases de datos de nuevo. Es mejor volcar las bases de datos de una en una y por separado. En este caso no es necesario volver a restaurar todas las bases de datos si la restauración no pudo completarse por algún motivo. - Si no puede volcar las bases de datos, intente usar el método II (" Copiar el contenido de la tabla ") o III (" Restaurar mediante un backup ").

  6. Elimine todos los archivos de almacenamiento de datos de MySQL a excepción de la carpeta mysql . Por ejemplo:

    # rm -rf `ls -d /var/lib/mysql/* | grep -v "/var/lib/mysql/mysql"`
  7. Elimine la opción innodb_force_recovery del archivo de configuración de MySQL.

  8. Reinicie el servicio MySQL.

  9. Examine el archivo de registro de MySQL para comprobar la existencia de algún error.

  10. Restaure las bases de datos mediante el volcado efectuado en el paso 5. Por ejemplo:

    # MYSQL_PWD=`cat /etc/psa/.psa.shadow` mysql -u admin < /root/dumpall.sql

II. Copiar el contenido de la tabla

  1. Repita los pasos 1-4 del método I para copiar todos los archivos de almacenamiento de datos de MySQL y activar el modo de recuperación de InnoDB.

  2. Intente crear una copia de una tabla:

    CREATE TABLE <new_table> LIKE <crashed_table>;
    INSERT INTO <new_table> SELECT * FROM <crashed_table>;
  3. Si la copia pudo crearse correctamente, reemplace la tabla dañada por la que ha creado.

    RENAME TABLE <crashed_table> TO <old_table>;
    RENAME TABLE <new_table> TO <crashed_table>;
    DROP TABLE <old_table>;
     

    Nota: en función de la versión usada de MySQL, es posible que deba establecer un valor innodb_force_recovery inferior o que deba eliminarlo del archivo de configuración de MySQL y reiniciar el servicio MySQL para poder efectuar correctamente las operaciones DROP y RENAME . Si desea más información, consulte la documentación oficial de MySQL.


III. Restaurar mediante un backup

Si las instrucciones aquí detalladas no le ayudan a solucionar el problema, el único método que puede aplicar es la restauración de las bases de datos mediante un backup. No olvide eliminar la opción innodb_force_recovery del archivo de configuración de MySQL antes de proceder con la restauración.

  • Si desea restaurar bases de datos relacionadas con Plesk (psa, apsc, horde), consulte este artículo. Por ejemplo:

    # ls -l /var/lib/psa/dumps
    -rw------- 1 root root 141960 Aug 8 01:03 mysql.daily.dump.0.gz
    -rw------- 1 root root 141925 Aug 7 01:03 mysql.daily.dump.1.gz

    # zcat /var/lib/psa/dumps/mysql.daily.dump.0.gz | MYSQL_PWD=`cat /etc/psa/.psa.shadow` mysql -u admin psa
  • Si desea restaurar bases de datos del cliente mediante un backup de Plesk, consulte la sección Restauración de datos mediante archivos comprimidos de backup de la guía del administrador.

    Nota: tenga en cuenta que al restaurar bases de datos puede experimentarse interrupción del servicio. De ser así, defina el valor wait_timeout en el archivo de configuración de MySQL y reinicie el servicio MySQL. Por ejemplo:

    # vi /etc/my.cnf
    [mysqld]
    wait_timeout = 1800
¿Tiene más preguntas? Enviar una solicitud
Inicie sesión para dejar un comentario.