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