Procedimiento para reimportado de bases de datos MySQL -- Core-Admin -- Recuperación fallo grave no recuperable de InnoDB


#1

1. Introducción

  1. Si el servidor MySQL no arranca y muestra un error similar al siguiente en /var/log/syslog

    >> tail -f /var/log/syslog | grep mysqld
    Aug 12 02:53:57 node1 mysqld: InnoDB: Dump of the tablespace extent descriptor: len 40; hex 00000000003a744b0000400026beffffffff000000000001ffffffffffffffffffffffffffffffff; asc :tK @ & ;
    Aug 12 02:53:57 node1 mysqld: InnoDB: Serious error! InnoDB is trying to free page 104638
    Aug 12 02:53:57 node1 mysqld: InnoDB: though it is already marked as free in the tablespace!
    Aug 12 02:53:57 node1 mysqld: InnoDB: The tablespace free space info is corrupt.
    Aug 12 02:53:57 node1 mysqld: InnoDB: You may need to dump your InnoDB tables and recreate the whole
    Aug 12 02:53:57 node1 mysqld: InnoDB: database!
    Aug 12 02:53:57 node1 mysqld: InnoDB: Please refer to
    Aug 12 02:53:57 node1 mysqld: InnoDB: http://dev.mysql.com/doc/refman/5.5/en/forcing-innodb-recovery.html

  1. Y no se corrige el problema al intentar arrancar el servidor MySQL ajustando la variable innodb_force_recovery = 4, entonces es muy posible que no tengas más opción que tener que reimportar todas las bases de datos.

Para ello, sigue los siguientes pasos.

2. Reimportando todas las bases de datos MySQL con Core-Admin

  1. Hacer un dump de todas las bases de datos:

    >> mysqldump -R --triggers --opt --single-transaction -u root -p --all-databases > /var/backups/mysql-backups/all-databases.txt

    NOTA: guardar este fichero ya que contiene todas las bases de dato durante el proceso

  2. Limpiar referencias mysql en el /var/backups/mysql-backups/all-databases.txt

    NOTA: buscar con un editor de texto “CREATE DATABASE mysql”, marcar y buscar el siguiente CREATE DATABASE para borrar la porción de texto entre medias.

    IMPORTANTE: es importante reimportarlo todo manteniendo la base de datos mysql y perfomance_schema
    (donde se localizan usuarios y contraseñas actuales).

  3. Parar servidor mysql, agente core-admin (para evitar que nos levante el mysql), postfix y apache2:

    >> /etc/init.d/postfix stop
    >> /etc/init.d/apache2 stop
    >> /etc/init.d/crad-agent stop
    >> /etc/init.d/mysql restart

  4. Con el servidor MySQL parado, borrar todas las bases de datos salvo la de mysql:

    >> rm -rf `ls -d /var/lib/mysql/* | grep -v ‘/var/lib/mysql/mysql’`

  5. Editar el /etc/mysql/my.cnf y comentar la línea de recovery, y aprovechar
    para añadir la separación de innodb por tabla por fichero:

    # innodb_force_recovery = 4
    innodb_file_per_table=1

  6. Arrancar mysql (debería arrancar bien ya que está vacío y sólo con la tabla mysql):

    >> /etc/init.d/mysql start

  7. Conectar al mysql como root:

    >> mysql --defaults-file=/etc/mysql/debian.cnf

  8. Reimportar todas las bases de datos:

    mysql> . /var/backups/mysql-backups/all-databases.txt

  9. Ejecutar upgrade si en los logs aparece:

    Aug 12 10:12:33 node1 mysqld: 190812 10:12:33 [ERROR] Native table ‘performance_schema’.‘events_waits_history’ has the wrong structure
    Aug 12 10:12:33 node1 mysqld: 190812 10:12:33 [ERROR] Native table ‘performance_schema’.‘events_waits_history_long’ has the wrong structure
    Aug 12 10:12:33 node1 mysqld: 190812 10:12:33 [ERROR] Native table ‘performance_schema’.‘setup_consumers’ has the wrong structure

    >> mysql_upgrade -u root -p

  10. Reactivamos servicios parados:

    >> /etc/init.d/crad-agent start
    >> /etc/init.d/apache2 start
    >> /etc/init.d/postfix start