Mysql Fatal error, en una de sus versiones (hay muchas más), en las que mysqlcheck no puede reparar las tablas y MySQL no arranca.
Uno de los mayores problemas del apagón eléctrico o apagado forzado de un servidor, junto con determinados sistemas de ficheros como ext3/ext4 (y otros), y MySQL, es la posibilidad de tener múltiples problemas al reiniciarse la máquina, y ver que nuestro servidor MySQL no inicia, y nuestras paginas web, y las cuentas de nuestro hosting alojadas en ese servidor MySQL son incapaces de funcionar.
Revisando los logs de MySQL y realizando tareas de reparación obtenemos distintos mensajes:
[ERROR] Fatal error: Can't open and lock privilege tables: Incorrect file format 'host'
Contenidos
Mysql Fatal error. Análisis y solución al problema
Lo primero que debemos hacer es, como siempre, monitorizar los logs del servidor que presenta por lo general ubicados en un servidor Cpanel en /var/lib/mysql/nombredelhost.err abriendo una consola shell
tail -f /var/lib/mysql/nombredelhost.err
Nombre del fichero log
El nombre del fichero log usado es el que normalmente existe en Cpanel por su configuración. Sin embargo, el log de MySQL puede tener otros nombres y otras ubicaciones de acuerdo a la configuración usada por nuestra distribución, o configurado en los guiones (scripts) de inicio de MySQL o en los de configuración, como my.cnfDespués en otra consola o shell interactiva con screen ejecutaremos los comandos necesarios para monitorizar el problema.
Inicio o reinicio del servidor mysql
# service mysql status ERROR! MySQL is not running
tail -f /var/lib/mysql/nombredelhost.err [ERROR] Fatal error: Can't open and lock privilege tables: Incorrect file format 'host'
Este mensaje es grave ya que mysql no puede arrancar y aquí tenemos distintas opciones según nuestra política de copias de seguridad.
Copias de seguridad de WHM/Cpanel incluyendo Databases Directory
Si tenemos activa una de las dos opciones siguientes, podremos intentar la secuencia indica mas abajo.
Hacemos copia de seguridad por si hay que revertir el proceso
root@host [~]# tar cvfz /path/backups/mysql.tar.gz /var/lib/mysql/ #Hacemos copia de seguridad por si acaso (SIEMPRE)
Descomprimimos la copias de seguridad de los ficheros de mysql y reemplazamos la base de datos mysql (1)
cd /tmp tar xvfz /path_backups_cpanel/fecha_backup/system/dirs/_var_lib_mysql_.tar.gz rsync -avvz --progress var/lib/mysql/mysql/ /var/lib/mysql/mysql/ service mysql start
Con esto deberiamos ver en el log el mensaje de puesta en marcha de MySQL
150527 08:39:27 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql 150527 8:39:27 [Note] Plugin 'FEDERATED' is disabled. 150527 8:39:27 InnoDB: The InnoDB memory heap is disabled 150527 8:39:27 InnoDB: Mutexes and rw_locks use GCC atomic builtins 150527 8:39:27 InnoDB: Compressed tables use zlib 1.2.3 150527 8:39:27 InnoDB: Using Linux native AIO 150527 8:39:27 InnoDB: Initializing buffer pool, size = 128.0M 150527 8:39:27 InnoDB: Completed initialization of buffer pool 150527 8:39:27 InnoDB: highest supported file format is Barracuda. 150527 8:39:28 InnoDB: Waiting for the background threads to start 150527 8:39:29 InnoDB: 5.5.42 started; log sequence number 3504302644 150527 8:39:29 [Note] Server hostname (bind-address): '0.0.0.0'; port: 3306 150527 8:39:29 [Note] - '0.0.0.0' resolves to '0.0.0.0'; 150527 8:39:29 [Note] Server socket created on IP: '0.0.0.0'. 150527 8:39:29 [Note] Event Scheduler: Loaded 0 events 150527 8:39:29 [Note] /usr/sbin/mysqld: ready for connections. Version: '5.5.42-cll' socket: '/var/lib/mysql/mysql.sock' port: 3306 MySQL Community Server (GPL)
Sin copias de seguridad por directorio de la base de datos en WHM/Cpanel pero con copias de seguridad mysqldump
Esta opción es valida también para otros sistemas sin Cpanel con la salvedad de que los path pueden cambiar de acuerdo a la instalación del sistemas o las preferencias del administrador.
Copia de seguridad del directorio de mysql pero con copia de mysql con mysqldump
tar cvfz /path/backups/mysql.tar.gz /var/lib/mysql/
Iniciamos mysql sin privilegios
mysql --skip-grant &
Ejecutamos mysqlcheck para revisar y reparar la base de datos mysql
mysql mysql mysql.columns_priv OK mysql.db OK mysql.event OK mysql.func OK mysql.general_log OK mysql.help_category OK mysql.help_keyword OK mysql.help_relation OK mysql.help_topic OK mysql.host Error : Incorrect file format 'columns_priv' error : Corrupt mysql.ndb_binlog_index OK mysql.plugin OK mysql.proc OK mysql.procs_priv OK mysql.proxies_priv OK mysql.servers OK mysql.slow_log OK mysql.tables_priv OK mysql.time_zone OK mysql.time_zone_leap_second OK mysql.time_zone_name OK mysql.time_zone_transition OK mysql.time_zone_transition_type OK mysql.user OK
Hacemos un backup con mysqldump de la BD mysql
mysqldump mysql > /path_backups/mysql/mysql_dump.sql
Eliminamos la base de datos mysql y recreamos la base de datos mysql (2)
mysql -e "DROP DATABASE mysql;"; mysql_install_db
Restauramos nuestra base de datos mysql desde nuestra copia de mysqldump (3)
mysql --one-database mysql > /path_backups/mysql/mysqldump_anterior_al_problema.sql
Matamos (kill) el proceso mysql iniciado sin privilegios y con &
ps aux | grep mysqld | awk '{print $2}' | while read l; do kill -9 $l; done
Inciamos mysql normalmente
service mysql start
Otros errores adicionales surgidos tras el arranque de mysql relativos a otras bases de datos
En nuestro sitio obtenemos un mensaje de error de nuestro software indicando que una tabla no puede usar y que esta marcada para ser reparada. Intentamos su reparación y obtenemos:
mysqlcheck --repair mibd error : Can't create new tempfile: './mibd/tabla_con_problemas.TMD status : Operation failed tail -f /var/lib/mysql/nombredelhost.err [ERROR] /usr/sbin/mysqld: Incorrect key file for table './mibd/mitablaconproblemas.MYI'; try to repair it [ERROR] /usr/sbin/mysqld: Table './mibd/mitablaconproblemas' is marked as crashed and last (automatic?) repair failed
Solución reparando la BD con
myisamchk -r -f /var/lib/mysql/mibd/mitablaconproblemas.MYI
Palabras y cadenas relacionadas
- [ERROR] Fatal error: Can’t open and lock privilege tables: Incorrect file format ‘host’
- unable to start mysql Fatal error: Can’t open and lock privilege tables
- Can’t open the mysql.plugin
- table mysql wont start
- Can’t open and lock privilege tables
- [ERROR] Fatal error: Can’t open and lock privilege tables
- Can’t open the mysql.plugin table.
- Please run mysql_upgrade to create it.
- mysql wont start/cant restore mysql
Copias de seguridad
Ante problemas como estos cabe recordar de que un administrador de sistemas, o un usuario de hosting, no debe confiar todo su trabajo a las aplicaciones y/o contratos de servicios que le garanticen la salvaguarda de sus datos. Es bueno, generar copias de seguridad con métodos alternativos. Conozco quienes solo se preocupan por tener copias de las copias de las copias, pero todas ellas basadas del mismo sistema. Si ese sistema falla, toda la cadena de copias no servirá para nada. En el caso de Cpanel, no son pocos los problemas que uno puede tener si confía plena y unicamente a su sistema de copias de seguridad.(1) En Cpanel esta instalado por defecto rsync. En mi opinión muchas operaciones con sistemas en los que tenemos que hacer copias o restauras ficheros, se realizan con mas velocidad y mejor que comprimiendo y descomprimiendo ficheros. tar cvfz /path/backups/mysql.tar.gz /var/lib/mysql/ podemos sustituirlo por rsync -avzz --progress /var/lib/mysql/ /path/backups/mysql/
(2) Solo en el caso de que nuestro backup original de la bd de mysql se halla realizado sin la opción CREATE DATABASE /*!32312 IF NOT EXISTS*/. Si el mysqldump se realizo de forma correcta, el proceso de restauración del fichero .sql creara la BD mysql
(3)–one-database nos permite restaurar una sola base de datos de un fichero realizado con mysql que contiene todas las bases de datos del servidor (mysqldump –opt). También podemos extraer si lo preferimos la base de datos deseada usando sed.
# Extracción de una base de datos de un fichero dump.sql completo sed -n '/^-- Current Database: `mysql`/,/^-- Current Database: `/p' dumpcompleto.sql > dumpmysql.sql
Si sed lanzara el error sed: RE error: illegal byte sequence como pude ocurrir en Mac OS X, se trata de un problema de locales. Para solventarlo debemos ejecutarlo así:
LC_ALL=C sed -n '/^-- Current Database: `mysql`/,/^-- Current Database: `/p' dumpcompleto.sql > dumpmysql.sql
Imagen Designed by Freepik
Comparte este artículo
Artículo Antiguo
Este artículo tiene más de 2 años. Es muy probable que su contenido este anticuado, aunque pueda ser de utilidad, es conveniente que revises otras informaciones al respecto. Si lo encuentras útil o crees que puede ser actualizado, deja tu comentario con la actualización para poder editarlo y que pueda ser útil a los demás.Comparte este articulo en