Error de MySQL: 'Acceso denegado para el usuario 'root'@'localhost'
Considerar:
./mysqladmin -u root -p** '_redacted_'
Salida (incluyendo escribir la contraseña):
Introducir la contraseña:
mysqladmin: Error al conectarse al servidor en 'localhost':
'Acceso denegado para el usuario 'root'@'localhost' (usando contraseña: SÍ)'
¿Cómo puedo arreglar esto?
Todas las soluciones que encontré fueron mucho más complejas de lo necesario y ninguna funcionó para mí. Aquí está la solución que resolvió mi problema. No es necesario reiniciar mysqld ni iniciarlo con privilegios especiales.
sudo mysql
-- for MySQL
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root';
-- for MariaDB
ALTER USER 'root'@'localhost' IDENTIFIED VIA mysql_native_password USING PASSWORD('root');
Con una sola consulta, cambiamos auth_plugin a mysql_native_password y configuramos la contraseña de root en root (no dude en cambiarla en la consulta) .
Ahora deberías poder iniciar sesión con root. Puede encontrar más información en la documentación de MySQL o en la documentación de MariaDB .
(Salga de la consola MySQL con Ctrl+ Do escribiendo exit ).
- Abra y edite
/etc/my.cnf
o/etc/mysql/my.cnf
, según su distribución. - Añadir
skip-grant-tables
debajo[mysqld]
- Reiniciar MySQL
- Debería poder iniciar sesión en MySQL ahora usando el siguiente comando
mysql -u root -p
- Correr
mysql> flush privileges;
- Establecer nueva contraseña por
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPassword';
- Regrese a /etc/my.cnf y elimine/comente skip-grant-tables
- Reiniciar MySQL
- Ahora podrás iniciar sesión con la nueva contraseña.
mysql -u root -p
Ninguna de las respuestas anteriores me ayudó con este problema, así que aquí está la solución que encontré .
La parte relevante:
En los sistemas Ubuntu que ejecutan MySQL 5.7 (y versiones posteriores), el usuario raíz de MySQL está configurado para autenticarse utilizando el complemento auth_socket de forma predeterminada en lugar de con una contraseña. Esto permite una mayor seguridad y usabilidad en muchos casos, pero también puede complicar las cosas cuando necesita permitir que un programa externo (por ejemplo, phpMyAdmin) acceda al usuario.
Para utilizar una contraseña para conectarse a MySQL como root, deberá cambiar su método de autenticación de auth_socket a mysql_native_password. Para hacer esto, abra el indicador de MySQL desde su terminal:
sudo mysql
A continuación, verifique qué método de autenticación utiliza cada una de sus cuentas de usuario de MySQL con el siguiente comando:
SELECT user,authentication_string,plugin,host FROM mysql.user;
Producción
+------------------+-------------------------------------------+-----------------------+-----------+ | user | authentication_string | plugin | host | +------------------+-------------------------------------------+-----------------------+-----------+ | root | | auth_socket | localhost | | mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost | | mysql.sys | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost | | debian-sys-maint | *CC744277A401A7D25BE1CA89AFF17BF607F876FF | mysql_native_password | localhost | +------------------+-------------------------------------------+-----------------------+-----------+ 4 rows in set (0.00 sec)
En este ejemplo, puede ver que el usuario root, de hecho, se autentica utilizando el complemento auth_socket. Para configurar la cuenta raíz para autenticarse con una contraseña, ejecute el siguiente comando ALTER USER. Asegúrese de cambiar la contraseña por una contraseña segura de su elección y tenga en cuenta que este comando cambiará la contraseña de root que estableció en el Paso 2:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
Luego, ejecute FLUSH PRIVILEGES, que le indica al servidor que recargue las tablas de concesión y ponga en vigor los nuevos cambios:
FLUSH PRIVILEGES;
Verifique nuevamente los métodos de autenticación empleados por cada uno de sus usuarios para confirmar que root ya no se autentica usando el complemento auth_socket:
SELECT user,authentication_string,plugin,host FROM mysql.user;
Producción
+------------------+-------------------------------------------+-----------------------+-----------+ | user | authentication_string | plugin | host | +------------------+-------------------------------------------+-----------------------+-----------+ | root | *3636DACC8616D997782ADD0839F92C1571D6D78F | mysql_native_password | localhost | | mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost | | mysql.sys | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost | | debian-sys-maint | *CC744277A401A7D25BE1CA89AFF17BF607F876FF | mysql_native_password | localhost | +------------------+-------------------------------------------+-----------------------+-----------+ 4 rows in set (0.00 sec)
Puede ver en este ejemplo que el usuario raíz de MySQL ahora se autentica usando una contraseña. Una vez que confirmes esto en tu propio servidor, puedes salir del shell MySQL:
exit
Intenté muchos pasos para corregir este problema. Hay tantas fuentes de posibles soluciones a este problema que es difícil separar lo que tiene sentido de lo que no tiene sentido. Finalmente encontré una buena solución aquí :
Paso 1: identificar la versión de la base de datos
mysql --version
Verás un resultado como este con MySQL:
mysql Ver 14.14 Distrib 5.7.16, for Linux (x86_64) using EditLine wrapper
O salida como esta para MariaDB:
mysql Ver 15.1 Distrib 5.5.52-MariaDB, for Linux (x86_64) using readline 5.1
Tome nota de qué base de datos y qué versión está ejecutando, ya que las usará más adelante. A continuación, debe detener la base de datos para poder acceder a ella manualmente.
Paso 2: detener el servidor de la base de datos
Para cambiar la contraseña de root, debe cerrar el servidor de la base de datos de antemano.
Puedes hacer eso para MySQL con:
sudo systemctl stop mysql
Y para MariaDB con:
sudo systemctl stop mariadb
Paso 3: reiniciar el servidor de la base de datos sin verificar los permisos
Si ejecuta MySQL y MariaDB sin cargar información sobre los privilegios del usuario, le permitirá acceder a la línea de comando de la base de datos con privilegios de root sin proporcionar una contraseña. Esto le permitirá acceder a la base de datos sin saberlo.
Para hacer esto, debe evitar que la base de datos cargue las tablas de concesión, que almacenan información de privilegios del usuario. Debido a que esto representa un pequeño riesgo para la seguridad, también debe omitir la conexión a redes para evitar que otros clientes se conecten.
Inicie la base de datos sin cargar las tablas de concesión ni habilitar la red:
sudo mysqld_safe --skip-grant-tables --skip-networking &
El signo comercial al final de este comando hará que este proceso se ejecute en segundo plano para que puedas continuar usando tu terminal.
Ahora puede conectarse a la base de datos como usuario root, lo que no debería solicitar una contraseña.
mysql -u root
En su lugar, verá inmediatamente un mensaje de shell de base de datos.
Mensaje de MySQL
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
Aviso de MariaDB
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]>
Ahora que tiene acceso de root, puede cambiar la contraseña de root.
Paso 4: cambiar la contraseña de root
mysql> FLUSH PRIVILEGES;
Ahora podemos cambiar la contraseña de root.
Para MySQL 5.7.6 y posteriores, así como para MariaDB 10.1.20 y posteriores , utilice el siguiente comando:
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';
Para MySQL 5.7.5 y versiones anteriores, así como MariaDB 10.1.20 y versiones anteriores , utilice:
mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('new_password');
Asegúrese de reemplazarla new_password
con la nueva contraseña que elija.
Nota: Si el ALTER USER
comando no funciona, suele ser indicativo de un problema mayor. Sin embargo, puedes intentar UPDATE ... SET
restablecer la contraseña de root.
[IMPORTANTE] Esta es la línea específica que solucionó mi problema particular:
mysql> UPDATE mysql.user SET authentication_string = PASSWORD('new_password') WHERE User = 'root' AND Host = 'localhost';
Recuerde recargar las tablas de subvenciones después de esto.
En cualquier caso, debería ver la confirmación de que el comando se ejecutó correctamente.
Query OK, 0 rows affected (0.00 sec)
La contraseña ha sido cambiada, por lo que ahora puede detener la instancia manual del servidor de base de datos y reiniciarlo como estaba antes.
Paso 5: reinicie el servidor de base de datos normalmente
El tutorial incluye algunos pasos adicionales para reiniciar la base de datos, pero la única parte que utilicé fue esta:
Para MySQL, utilice:
sudo systemctl start mysql
Para MariaDB, utilice:
sudo systemctl start mariadb
Ahora puedes confirmar que la nueva contraseña se ha aplicado correctamente ejecutando:
mysql -u root -p
El comando ahora debería solicitar la contraseña recién asignada. Ingréselo y debería obtener acceso al mensaje de la base de datos como se esperaba.
Conclusión
Ahora tiene restaurado el acceso administrativo al servidor MySQL o MariaDB. Asegúrese de que la nueva contraseña de root que elija sea segura y guárdela en un lugar seguro.