Mysql Fatal error: Can’t open and lock privilege tables: Incorrect file format ‘host’

Mysql incorrect format hosts

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'

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.cnf

Despué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.
Backup Cpanel opción directorio 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

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax