MySQL no inicia debido a errores en la base de datos interna de MySQL

Basura gurus informática

Uno de los mensajes más alarmantes que puedes encontrarte es aquel que indica que tu servidor MySQL no se puede iniciar debido a una serie de errores vinculados a las tablas de la base de datos interna de mysql.

Más preocupante aún, es ver cómo mucha gente, sin los conocimientos adecuados, se aventura a responder estas cuestiones en foros, Stack Overflow o incluso en tutoriales de YouTube, generando desinformación y, en lugar de ayudar, creando potenciales desastres.

Editado/ampliado: 2023/06/06

El log de error que anuncia que MySQL no inicia

systemctl status mysql
● mariadb.service - MariaDB 10.5.19 database server
Loaded: loaded (/lib/systemd/system/mariadb.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Wed 2023-05-31 19:38:11 CEST; 4s ago
Docs: man:mariadbd(8)
https://mariadb.com/kb/en/library/systemd/
Process: 19091 ExecStartPre=/usr/bin/install -m 755 -o mysql -g root -d /var/run/mysqld (code=exited, status=0/SUCCESS)
Process: 19092 ExecStartPre=/bin/sh -c systemctl unset-environment _WSREP_START_POSITION (code=exited, status=0/SUCCESS)
Process: 19094 ExecStartPre=/bin/sh -c [ ! -e /usr/bin/galera_recovery ] && VAR= ||   VAR=`cd /usr/bin/..; /usr/bin/galera _recovery`; [ $? -eq 0 ]   && systemctl set-environment _WSREP_START_POSITION=$VAR || exit 1 (code=exited, status=0/S>
Process: 19141 ExecStart=/usr/sbin/mariadbd $MYSQLD_OPTS $_WSREP_NEW_CLUSTER $_WSREP_START_POSITION (code=exited, status=1/FAILURE)
Main PID: 19141 (code=exited, status=1/FAILURE)
Status: "MariaDB server is down"
CPU: 418ms

May 31 19:38:11 rasp mariadbd[19141]: 2023-05-31 19:38:11 0 [ERROR] Could not open mysql.plugin table: "Table './mysql/plugin' is marked as crashed and last (automatic?) repair failed". Some plugins may be not loaded
May 31 19:38:11 rasp mariadbd[19141]: 2023-05-31 19:38:11 0 [ERROR] mariadbd: Table './mysql/servers' is marked as crashed and last (automatic?) repair failed
May 31 19:38:11 rasp mariadbd[19141]: 2023-05-31 19:38:11 0 [ERROR] Can't open and lock privilege tables: Table './mysql/servers' is marked as crashed and last (automatic?) repair failed
May 31 19:38:11 rasp mariadbd[19141]: 2023-05-31 19:38:11 0 [Note] Server socket created on IP: '127.0.0.1'.
May 31 19:38:11 rasp mariadbd[19141]: 2023-05-31 19:38:11 0 [ERROR] mariadbd: Table './mysql/db' is marked as crashed and last (automatic?) repair failed
May 31 19:38:11 rasp mariadbd[19141]: 2023-05-31 19:38:11 0 [ERROR] Fatal error: Can't open and lock privilege tables: Table './mysql/db' is marked as crashed and last (automatic?) repair failed
May 31 19:38:11 rasp mariadbd[19141]: 2023-05-31 19:38:11 0 [ERROR] Aborting
May 31 19:38:11 rasp systemd[1]: mariadb.service: Main process exited, code=exited, status=1/FAILURE
May 31 19:38:11 rasp systemd[1]: mariadb.service: Failed with result 'exit-code'.
May 31 19:38:11 rasp systemd[1]: Failed to start MariaDB 10.5.19 database server.

La respuesta más común a este problema es, sorprendentemente, contiene ejecutar el siguiente comando:

rm -Rf /var/lib/mysql/*

Un desastre sin paliativos, en el que más de una aprendiz de informático, puede caer confiado, y verse abocado a un desastre.

Otras respuestas incluyen ejecutar comandos que no se pueden llevar a cabo debido a que el servidor no está en funcionamiento. Lo peor de todo es que algunos insisten en que sus «soluciones» funcionaron.

Lamentablemente, estos no son soluciones sino recetas para el desastre, especialmente considerando que muchos de los usuarios que experimentan estos problemas no suelen tener respaldos de MySQL o, al menos, no respaldos actualizados.

Primero, el respaldo

Es vital tener respaldos de seguridad. Un respaldo completo de todas las bases de datos, incluyendo MySQL, es una excelente práctica.

Reparación

El mensaje de error indica claramente que:

  • El servidor no inicia, por lo tanto, no se pueden ejecutar comandos de reparación.
  • No es lo mismo tratar con MyISAM que con InnoDB.
  • No todos los problemas se tratan de la misma manera.

Inicio de MySQL sin privilegios

La base de datos mysql gestiona los privilegios de acceso, entre otras cosas. Si es precisamente ella la que está causando el problema, una opción es iniciar MySQL sin privilegios.

❯ /usr/sbin/mysqld --skip-grant-tables --general-log
2023-05-31 19:59:58 0 [Note] Starting MariaDB 10.5.19-MariaDB-0+deb11u2-log source revision f8a85af8ca1c937b8d4f847477bd282f80251cde as process 20650
2023-05-31 19:59:58 0 [Note] InnoDB: Uses event mutexes
2023-05-31 19:59:58 0 [Note] InnoDB: Compressed tables use zlib 1.2.11
2023-05-31 19:59:58 0 [Note] InnoDB: Number of pools: 1
2023-05-31 19:59:58 0 [Note] InnoDB: Using generic crc32 instructions
2023-05-31 19:59:58 0 [Note] InnoDB: Using Linux native AIO
2023-05-31 19:59:59 0 [Note] InnoDB: Initializing buffer pool, total size = 134217728, chunk size = 134217728
2023-05-31 19:59:59 0 [Note] InnoDB: Completed initialization of buffer pool
2023-05-31 19:59:59 0 [Note] InnoDB: 128 rollback segments are active.
2023-05-31 19:59:59 0 [Note] InnoDB: Creating shared tablespace for temporary tables
2023-05-31 19:59:59 0 [Note] InnoDB: Setting file './ibtmp1' size to 12 MB. Physically writing the file full; Please wait ...
2023-05-31 19:59:59 0 [Note] InnoDB: File './ibtmp1' size is now 12 MB.
2023-05-31 19:59:59 0 [Note] InnoDB: 10.5.19 started; log sequence number 215925337; transaction id 25935
2023-05-31 19:59:59 0 [Note] Plugin 'FEEDBACK' is disabled.
2023-05-31 19:59:59 0 [Note] InnoDB: Loading buffer pool(s) from /var/lib/mysql/ib_buffer_pool
2023-05-31 19:59:59 0 [Note] Server socket created on IP: '127.0.0.1'.
2023-05-31 19:59:59 0 [Note] Reading of all Master_info entries succeeded
2023-05-31 19:59:59 0 [Note] Added new Master_info '' to hash table
2023-05-31 19:59:59 0 [Note] /usr/sbin/mysqld: ready for connections.
Version: '10.5.19-MariaDB-0+deb11u2-log'  socket: '/run/mysqld/mysqld.sock'  port: 3306  Raspbian 11
2023-05-31 19:59:59 0 [Note] InnoDB: Buffer pool(s) load completed at 230531 19:59:59

Seguiremos viendo el mensaje de error. Sin embargo, ahora podemos ingresar a mysql y utilizar su comando para reparación (veremos que las tablas de MySQL están, en su mayoría, en formato MyISAM (las que tienen el ‘OK’ son MyISAM)

mysqlcheck -r --auto-repair -A
## Salida filtrada con mysqlcheck -r --auto-repair -A | grep  mysql.
mysql.column_stats                                 OK
mysql.columns_priv                                 OK
mysql.db                                           OK
mysql.event                                        OK
mysql.func                                         OK
mysql.global_priv                                  OK
mysql.gtid_slave_pos
mysql.help_category                                OK
mysql.help_keyword                                 OK
mysql.help_relation                                OK
mysql.help_topic                                   OK
mysql.index_stats                                  OK
mysql.innodb_index_stats
mysql.innodb_table_stats
mysql.plugin                                       OK
mysql.proc                                         OK
mysql.procs_priv                                   OK
mysql.proxies_priv                                 OK
mysql.roles_mapping                                OK
mysql.servers                                      OK
mysql.table_stats                                  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.transaction_registry

Cuando termines la reparación, ya puedes matar el proceso sin privilegios, y reiniciar normalmente.

Otro error añadido

Jun 06 20:13:11 rasp mariadbd[2566]: 2023-06-06 20:13:11 0 [ERROR] Could not open mysql.plugin table: "Unknown storage engine 'Aria'". Some plugins may be not loaded
Jun 06 20:13:11 rasp mariadbd[2566]: 2023-06-06 20:13:11 0 [ERROR] Failed to initialize plugins.
Jun 06 20:13:11 rasp mariadbd[2566]: 2023-06-06 20:13:11 0 [ERROR] Aborting

Solución 1

mv /var/lib/mysql/aria_log_control /var/lib/mysql/aria_log_control.orig

 

Adicional para InnoDB

En el caso de InnoDB (si tienes problemas con InnoDB, es recomendable recurrir a un respaldo), existe la posibilidad de iniciar con innodb_force_recovery, comenzando con la opción 1. Para ello debes editar el fichero de configuración de mysql.conf, que varía según las distribuciones (búscalo en /etc/, eso seguro)

Recomendamos leer, 15.21.3 Forcing InnoDB Recovery

[mysqld]
innodb_force_recovery = 1

Concluyendo, es de suma importancia tener conocimientos sólidos a la hora de afrontar este tipo de problemas, y siempre es preferible acudir a fuentes de información confiables y tener un buen sistema de respaldos.

Deja una respuesta

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