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
Fuente: linuxito