Reiniciar la contraseña de root en MySQL suele ser una tarea rápida, pero en ocasiones el procedimiento parece completarse y la nueva contraseña sigue sin ser aceptada. Este artículo describe un caso real en un entorno de pruebas con Windows Server 2019 y MySQL 5.6, explica la causa y muestra la solución aplicada.
Escenario
Entorno de pruebas con una única instancia de MySQL. No hay servicio de producción involucrado, por lo que el servidor puede reiniciarse sin restricciones de disponibilidad.
- Sistema operativo: Windows Server 2019 Datacenter
- MySQL: 5.6 con instalación clásica
Problema
Se utilizó el parámetro --skip-grant-tables para omitir la validación de permisos. Después se actualizó la contraseña de root con UPDATE y se ejecutó FLUSH PRIVILEGES. Sin embargo, al intentar conectar con la nueva contraseña, MySQL la rechazaba.
El procedimiento inicial fue el siguiente:
- Detener el servicio de MySQL.
- Iniciar MySQL con
--skip-grant-tables. - Conectar y ejecutar la actualización de la contraseña.
- Ejecutar
FLUSH PRIVILEGES. - Reiniciar el servicio e intentar iniciar sesión con la nueva contraseña.
El resultado era siempre el mismo: la contraseña se actualizaba correctamente según la salida del comando, pero al reiniciar el servicio no era válida.
Análisis de la causa
El origen del problema estaba en la forma de iniciar MySQL con --skip-grant-tables. Al usar este parámetro sin especificar el archivo de configuración my.ini, el servidor entra en un modo especial en el que los cambios realizados sobre las tablas de permisos no se persisten de forma efectiva. Aunque la instrucción UPDATE parezca ejecutarse correctamente, esos cambios se pierden al detener el proceso.
Este comportamiento puede depender del tipo de instalación. Con versiones portables o sin instalación, el procedimiento habitual puede funcionar, pero con una instalación clásica como la de este entorno no es suficiente.
Solución
La clave está en indicar explícitamente el archivo de configuración al iniciar MySQL en modo de omisión de permisos. La ruta de my.ini se puede obtener desde las propiedades del servicio de MySQL en Windows.
- Detener el servicio de MySQL.
- Iniciar MySQL con el archivo de confiugración y el modo
--skip-grant-tables:
mysqld.exe --defaults-file="C:\ProgramData\MySQL\MySQL Server 5.6\my.ini" --skip-grant-tables
La parte --defaults-file debe apuntar a la ruta real del archivo my.ini de la instalación.
- Abrir otra ventana de terminal y conectar como root sin contraseña:
mysql -u root
- Actualizar la contraseña de root:
UPDATE mysql.user SET Password = PASSWORD('nueva_clave') WHERE User = 'root' AND Host = 'localhost';
FLUSH PRIVILEGES;
- Salir de la sesión y detener el proceso de MySQL.
- Reiniciar el servicio de MySQL de forma normal.
- Conectar con la nueva contraseña:
mysql -u root -p
Después de estos pasos, el inicio de sesión con la nueva contraseña se completa correctamente.