El siguiente artículo explica cómo restablecer la contraseña del usuario root (administrador) de un servidor de bases de datos MySQL.



Puede ser el caso que seamos pésimos administradores de sistemas y no hayamos guardado de forma segura nuestras contraseñas. O tal vez que hayamos tomado un servidor instado por otro Sysadmin y no tengamos la información de todas las credenciales. Sea cual sea la razón, si hemos olvidado o desconocemos el password del usuario "root" de MySQL, es posible restablecerlo de forma sencilla.

En el manual de MySQL existen instructivos para llevar a cabo este procedimiento sobre diferentes plataformas para cada versión de MySQL. Esto se debe a que dicha tarea ha cambiado en cada versión de MySQL. Sin embargo, el método que se utiliza en este artículo debería funcionar perfectamente para cualquier versión de MySQL (actualmente soportada), e incluso para cualquier plataforma (incluyendo Microsoft Windows).

Por supuesto se debe contar con acceso como superusuario ("root") o Administrador sobre el sistema operativo en cuestión.

El primer paso consiste en detener el servidor MySQL:

root@cloud:/var/www# service mysql stop

Luego, se debe iniciar el proceso servidor MySQL (mysqld_safe) agregando la opción --skip-grant-tables:

root@cloud:/var/www# /usr/bin/mysqld_safe --skip-grant-tables > /dev/null 2>&1 &
[1] 3531

Esta opción hace que el servidor inicie sin utilizar el sistema de privilegios, lo cual otorga acceso irrestricto al mismo (y a todas sus bases de datos) a cualquier usuario, sin autenticar. No hace falta aclarar el riesgo incurrido al mantener al servidor MySQL corriendo con esta opción.

A partir de este momento es posible gestionar el servidor MySQL sin usuario ni contraseña:

root@cloud:/var/www# mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.5.44-0+deb7u1 (Debian)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

Una vez conectado al servidor, ejecutar la consulta flush privileges; para que se inicie el sistema de gestión de privilegios. A partir de este momento el manejo de cuentas de usuarios comienza a funcionar y ya no es posible acceder de manera irrestricta sin autenticación.

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

MySQL almacena la información de usuarios (incluyendo sus credenciales) en la tabla user:

mysql> describe mysql.user;
+------------------------+-----------------------------------+------+-----+---------+-------+
| Field                  | Type                              | Null | Key | Default | Extra |
+------------------------+-----------------------------------+------+-----+---------+-------+
| Host                   | char(60)                          | NO   | PRI |         |       |
| User                   | char(16)                          | NO   | PRI |         |       |
| Password               | char(41)                          | NO   |     |         |       |
| Select_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Insert_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Update_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Delete_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Create_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Drop_priv              | enum('N','Y')                     | NO   |     | N       |       |
| Reload_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Shutdown_priv          | enum('N','Y')                     | NO   |     | N       |       |
| Process_priv           | enum('N','Y')                     | NO   |     | N       |       |
| File_priv              | enum('N','Y')                     | NO   |     | N       |       |
| Grant_priv             | enum('N','Y')                     | NO   |     | N       |       |
| References_priv        | enum('N','Y')                     | NO   |     | N       |       |
| Index_priv             | enum('N','Y')                     | NO   |     | N       |       |
| Alter_priv             | enum('N','Y')                     | NO   |     | N       |       |
| Show_db_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Super_priv             | enum('N','Y')                     | NO   |     | N       |       |
| Create_tmp_table_priv  | enum('N','Y')                     | NO   |     | N       |       |
| Lock_tables_priv       | enum('N','Y')                     | NO   |     | N       |       |
| Execute_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Repl_slave_priv        | enum('N','Y')                     | NO   |     | N       |       |
| Repl_client_priv       | enum('N','Y')                     | NO   |     | N       |       |
| Create_view_priv       | enum('N','Y')                     | NO   |     | N       |       |
| Show_view_priv         | enum('N','Y')                     | NO   |     | N       |       |
| Create_routine_priv    | enum('N','Y')                     | NO   |     | N       |       |
| Alter_routine_priv     | enum('N','Y')                     | NO   |     | N       |       |
| Create_user_priv       | enum('N','Y')                     | NO   |     | N       |       |
| Event_priv             | enum('N','Y')                     | NO   |     | N       |       |
| Trigger_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Create_tablespace_priv | enum('N','Y')                     | NO   |     | N       |       |
| ssl_type               | enum('','ANY','X509','SPECIFIED') | NO   |     |         |       |
| ssl_cipher             | blob                              | NO   |     | NULL    |       |
| x509_issuer            | blob                              | NO   |     | NULL    |       |
| x509_subject           | blob                              | NO   |     | NULL    |       |
| max_questions          | int(11) unsigned                  | NO   |     | 0       |       |
| max_updates            | int(11) unsigned                  | NO   |     | 0       |       |
| max_connections        | int(11) unsigned                  | NO   |     | 0       |       |
| max_user_connections   | int(11) unsigned                  | NO   |     | 0       |       |
| plugin                 | char(64)                          | YES  |     |         |       |
| authentication_string  | text                              | YES  |     | NULL    |       |
+------------------------+-----------------------------------+------+-----+---------+-------+
42 rows in set (0.00 sec)

Entonces, para modificar la contraseña de "root" simplemente se puede ejecutar la siguiente consulta SQL:

update mysql.user SET password=password('1234') where user='root';

"1234" es una excelente contraseña, útil para todo tipo de cuentas, desde acceso a servidores en producción hasta home banking.

mysql> update mysql.user SET password=password('1234') where user='root';
Query OK, 4 rows affected (0.00 sec)
Rows matched: 4  Changed: 4  Warnings: 0

En este ejemplo se observan 4 filas afectadas, esto se debe a que las credenciales de acceso para "root" se encuentran replicadas para distintos campos "host" (desde qué sitio accede el usuario "root").

Inmediatamente ejecutar nuevamente flush privileges; para que se apliquen estos cambios:

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

Cerrar la sesión con el servidor MySQL:

mysql> quit
Bye
root@cloud:/var/www#

Ahora se debe detener el servidor que fue iniciado manualmente, no a través del gestor de servicios del sistema operativo. Tanto en Linux como en Windows es posible volver a la terminal donde fue lanzado el proceso y presionar Ctrl+C para detenerlo.

Si el proceso fue lanzado en segundo plano (&) en un sistema Linux, es posible recuperar su control con la herramienta fg.

Primero obtener el número de tarea ejecutando jobs:

root@cloud:/var/www# jobs
[1]+  Running                 /usr/bin/mysqld_safe --skip-grant-tables > /dev/null 2>&1 &

Luego, traer el proceso a primer plano con fg y presionar Ctrl+C para finalizarlo:

root@cloud:/var/www# fg 1
/usr/bin/mysqld_safe --skip-grant-tables > /dev/null 2>&1
^Croot@cloud:/var/www#

Otra forma de detener el proceso consiste en primero obtener su PID (porcess ID) utilizando el comando ps ax | grep mysql, para luego enviar la señal TERM utilizando el comando kill.

Por último sólo resta reiniciar el servidor MySQL desde el gestor de servicios del sistema operativo en cuestión:

root@cloud:/var/www# service mysql start
[ ok ] Starting MySQL database server: mysqld ..
[info] Checking for tables which need an upgrade, are corrupt or were 
not closed cleanly..
root@cloud:/var/www#

Verificar el acceso como "root" con la nueva contraseña:

root@cloud:/var/www# mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 38
Server version: 5.5.44-0+deb7u1 (Debian)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

Para más información:

MySQL 5.5 Reference Manual - How to Reset the Root Password

MySQL 5.7 Reference Manual - Server Command Options - option_mysqld_skip-grant-tables

man mysql
man mysqld
man mysqld_safe


Tal vez pueda interesarte


Compartí este artículo