Sistemas

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

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.

Abkrim

Yo solo se que no se nada, y que me paso la vida aprendiendo

Entradas recientes

Fatal error: Allowed memory size of 268435456 bytes exhausted en WordPress. Otro post más… pero diferente

No es la primera vez que me encuentro con el agotamiento de la memoria en…

5 meses hace

Problemas de Acceso con Centos 7, Almalinux 8, Ubuntu 20.04, y Debian 10/11: Un Enigma Firewall CSF

Descubre cómo solucionar problemas de acceso a servidores con Centos 7, Almalinux 8, Ubuntu 20.04…

10 meses hace

Actualización de seguridad 6.2.1 para WordPress y la importancia de los backups confiables

La seguridad de nuestro sitio web es de vital importancia en el mundo digital actual.…

12 meses hace

El mito de los ficheros SVG inseguros en las subidas de ficheros

Los ficheros SVG son archivos gráficos vectoriales escalables ampliamente utilizados en diseño web. Aunque no…

1 año hace

Solución de problemas de errores 500 en Castris Hosting: una guía para usuarios de cPanel

En este artículo, te guiamos en la solución de problemas de errores 500 en Castris…

1 año hace

DMARC, protección frente al pishing, scam, spoofing en Cpanel

DMARC es un protocolo de autenticación de correo electrónico, diseñado para conceder una mayor protección…

1 año hace