Article ID: 6586, created on Aug 10, 2009, last review on Mar 31, 2016

  • Applies to:
  • Plesk

Síntomas

  1. En Parallels Plesk Panel (Plesk) se muestra el siguiente error:

    ERROR: PleskMainDBException
    MySQL query failed: Incorrect information in file: './psa/misc.frm'
    
  2. mysqldump y mysqlcheck experimentan errores y se obtiene un mensaje de error que informa de que una tabla no existe (use la cuenta del administrador de MySQL para realizar la comprobación pertinente):

    ~# mysqlcheck -uadmin -p****** db_example
    db_example.BackupTasks
    error    : Can't find file: 'BackupTasks.MYD' (errno: 2)
    
  3. No se puede consultar correctamente una tabla con el argumento SELECT:

    mysql> select * from db_example.misc;
    ERROR 1033 (HY000): Incorrect information in file: './db_example/misc.frm'
    
  4. 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 |
    +-------------------------+--------+----------+---------------------------------------------------------+
    

Causa

Muchas incidencias de corrupción de InnoDB están relacionadas con el 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

Existen distintas formas de recuperar un MySQL fallido:

I. Forzar la recuperación de InnoDB

  1. Detenga mysqld y cree un backup de todos los archivos presentes en el directorio /var/lib/mysql/:

    ~# /etc/init.d/mysqld stop
    ~# mkdir /root/mysql_backup
    ~# cp -r /var/lib/mysql/* /root/mysql_backup/
    
  2. Añada la opción innodb_force_recovery a la sección [mysqld] en /etc/my.cnf. Esta opción le permitirá iniciar mysqld y crear un volcado de la base de datos.

    ~#/etc/my.cnf
    [mysqld]
    innodb_force_recovery = 4
    

    NOTA: puede aumentar la opción a 5 o 6 hasta que obtenga un volcado correcto. Para más información, haga clic aquí.

  3. Inicie el servicio mysqld:

    ~# /etc/init.d/mysqld start
    
  4. Realice un volcado de todas las bases de datos:

    ~# mysqldump -uadmin -p`cat /etc/psa/.psa.shadow` -A | sed '1i\SET FOREIGN_KEY_CHECKS = 0;' > /root/dumpall.sql
    

    Si el volcado no puede realizarse debido al siguiente error:

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

    En este caso deberá aumentar innodb_force_recovery e intentar volver a realizar el volcado de las bases de datos. Si no puede volcar las bases de datos, intente utilizar el método II ("Copiar el contenido de la tabla") o el método III ("Realizar una restauración mediante el backup") detallados a continuación

  5. Elimine todos los archivos de /var/lib/mysql/ a excepción de la carpeta mysql:

    ~# rm -rf `ls -d /var/lib/mysql/* | grep -v "/var/lib/mysql/mysql"`
    
  6. Elimine la opción innodb_force_recovery del archivo /etc/my.cnf y reinicie mysqld:

    ~# /etc/init.d/mysqld restart
    
  7. Examine /var/log/mysqld.log para comprobar la existencia de cualquier error.

  8. Restaure las bases de datos mediante el volcado:

    ~# mysql -uadmin -p`cat /etc/psa/.psa.shadow` < dumpall2.sql
    

II. Copiar el contenido de la tabla

  1. Detenga mysqld y cree un backup de todos los archivos presentes en /var/lib/mysql/:

    ~# /etc/init.d/mysqld stop
    ~# mkdir /root/mysql_backup
    ~# cp -r /var/lib/mysql/* /root/mysql_backup/
    
  2. Añada la opción innodb_force_recovery a la sección [mysqld] en /etc/my.cnf. Esta opción le permitirá iniciar mysqld y crear un volcado de la base de datos.

    ~#/etc/my.cnf
    [mysqld]
    innodb_force_recovery = 1
    
  3. Intente crear una copia:

    CREATE TABLE <new_table> LIKE <crashed_table>;
    INSERT INTO <new_table> SELECT * FROM <crashed_table>;
    
  4. Si la copia se ha creado correctamente, elimine la tabla corrupta y cambie el nombre de la tabla nueva para que sea el mismo que el que tenía la tabla anterior.

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

III. Realizar una restauración mediante el 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.

Cada día se crea un backup de la base de datos de Parallels Plesk Panel, que se guarda en el directorio de backups DUMP_D:

~# 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

Use el siguiente comando para restaurar la base de datos usando el backup más reciente de mysql.daily.dump.0.gz:

~# zcat /var/lib/psa/dumps/mysql.daily.dump.0.gz | mysql -uadmin -p`cat /etc/psa/.psa.shadow` psa

NOTA: puede que al restaurar bases de datos se exceda el tiempo de espera. En este caso, añada la opción wait_timeout a /etc/my.cnf y reinicie el servicio mysqld:

/etc/my.cnf
[mysqld]
wait_timeout = 1800
~# /etc/init.d/mysqld restart

56797cefb1efc9130f7c48a7d1db0f0c a914db3fdc7a53ddcfd1b2db8f5a1b9c caea8340e2d186a540518d08602aa065 e0aff7830fa22f92062ee4db78133079 400e18f6ede9f8be5575a475d2d6b0a6

Email subscription for changes to this article
Save as PDF