Error de MySQL: 'Acceso denegado para el usuario' root '@' localhost '

264

$ ./mysqladmin -u root -p ' redacted '
Ingrese la contraseña:

mysqladmin: error al conectar al servidor en 'localhost':
'Acceso denegado para el usuario' root '@' localhost '(usando la contraseña: SÍ)'

¿Cómo puedo arreglar esto?

Trivedi duro
fuente
1
@clearlight No es la misma pregunta, esta publicación es un problema con mysqladmin win super privilegies en mysql, la otra publicación es un problema con una simple conexión desde el socket.
e-info128
Intenta eliminar si existe el ~/.my.cnfarchivo.
e-info128
11
Sé que esto es viejo, pero quiero decirlo para futuros visitantes. No ingrese su contraseña mysql, especialmente para root, en el comando mismo, o se almacenará en su historial de shell. Simplemente deje la -popción sola y mysql le pedirá una contraseña.
Scotty C.

Respuestas:

358
  1. Abrir y editar /etc/my.cnfo /etc/mysql/my.cnf, según su distribución.
  2. Añadir skip-grant-tablesdebajo[mysqld]
  3. Reiniciar Mysql
  4. Debería poder iniciar sesión en mysql ahora usando el siguiente comando mysql -u root -p
  5. correr mysql> flush privileges;
  6. Establecer nueva contraseña por ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPassword';
  7. Regrese a /etc/my.cnf y elimine / comente skip-grant-tables
  8. Reiniciar Mysql
  9. Ahora podrá iniciar sesión con la nueva contraseña mysql -u root -p
Kishore Venkataramanan
fuente
66
Hola, tuve el mismo problema. Hice lo anterior y solucionó el problema, pero cada vez que reinicio CentOS, necesito hacer todos los pasos nuevamente (recibí el mensaje: Acceso denegado para el usuario 'root' @ 'localhost' (usando la contraseña: NO) - cuando ejecuto el comando mysql (o cualquier comando sql) y lo hago una y otra vez como se indica arriba en cada reinicio.
Eitan
19
Lástima que esto no funcione con MariaDB:You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'USER 'root'@'localhost' IDENTIFIED BY 'NewPassword'' at line 1
Philipp Ludwig
11
Encontré que esto funcionaba @PhilippLudwig set PASSWORD FOR 'root'@'localhost' = PASSWORD('root');Hice esto después del paso 5. Así es como se veía mi salida del símbolo del sistema:MariaDB [(none)]> MariaDB [(none)]> set PASSWORD FOR 'root'@'localhost' = PASSWORD('root'); Query OK, 0 rows affected (0.00 sec)
therobyouknow
3
Para el paso 3, reinicie MariaDB: Encontré los siguientes trabajos:sudo systemctl restart mariadb
therobyouknow
77
Algunos pueden encontrar el archivo en /etc/mysql/my.cnf
DSinghvi
590

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 o iniciarlo con privilegios especiales.

sudo mysql

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root';

Con una sola consulta, estamos cambiando auth_plugin a mysql_native_password y configurando la contraseña de root a root (no dude en cambiarla en la consulta)

Ahora debería poder iniciar sesión con root. Se puede encontrar más información en la documentación de mysql

(salga de la consola mysql con Ctrl + D o escribiendo exit )

usuario1878906
fuente
41
No puedo hacer esto ... "Tiene un error en su sintaxis SQL; consulte el manual que corresponde a la versión de su servidor MariaDB para obtener la sintaxis correcta para usar cerca de ...".
TCB13
2
Esta respuesta funcionó, accidentalmente agregué que no es útil la respuesta voto, disculpe!
taher
25
Funcionó muy bien en Ubuntu 18.04
Almino Melo
2
@ TCB13 y cualquier otra persona que se enfrente a este problema. "No puedo hacer esto ..." Tiene un error en su sintaxis SQL; consulte el manual que corresponde a la versión de su servidor MariaDB para conocer la sintaxis correcta para usar cerca de ... ". Use FLUSH PRIVILEGES antes de ejecutar el comando alter
codificador
3
me salvas el día :)
xger86x
50

Intenté muchos pasos para corregir este problema. Hay tantas fuentes de posibles soluciones a este problema que es difícil filtrar el sentido del sinsentido. Finalmente encontré una buena solución aquí :

Paso 1: identificar la versión de la base de datos

$ mysql --version

Verás algunos resultados 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 bases de datos

Para cambiar la contraseña de root, debe cerrar el servidor de la base de datos de antemano.

Puede hacer eso para MySQL con:

$ sudo systemctl stop mysql

Y para MariaDB con:

$ sudo systemctl stop mariadb

Paso 3: reiniciar el servidor de base de datos sin verificación de 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á obtener acceso 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 de usuario. Debido a que este es un riesgo de seguridad, también debe omitir las redes para evitar que otros clientes se conecten.

Inicie la base de datos sin cargar las tablas de concesión o habilitar la conexión en red:

$ sudo mysqld_safe --skip-grant-tables --skip-networking &

El ampersand al final de este comando hará que este proceso se ejecute en segundo plano para que pueda seguir utilizando su terminal.

Ahora puede conectarse a la base de datos como usuario root, que no debe solicitar una contraseña.

$ mysql -u root

Inmediatamente verá un indicador de shell de la base de datos.

Mensaje de MySQL

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

mysql>

Mensaje 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 MariaDB 10.1.20 y posteriores , use 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 , use:

mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('new_password');

Asegúrese de reemplazar new_passwordcon su nueva contraseña de elección.

Nota: Si el ALTER USERcomando no funciona, generalmente es indicativo de un problema mayor. Sin embargo, puede intentar UPDATE ... SETrestablecer la contraseña de root en su lugar.

[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 volver a cargar las tablas de concesión después de esto.

En cualquier caso, debería ver la confirmación de que el comando se ha ejecutado correctamente.

Query OK, 0 rows affected (0.00 sec)

La contraseña se ha cambiado, por lo que ahora puede detener la instancia manual del servidor de la base de datos y reiniciarla como estaba antes.

Paso 5: reinicie el servidor de la base de datos normalmente

El tutorial entra en algunos pasos adicionales para reiniciar la base de datos, pero la única pieza que usé fue esta:

Para MySQL, use: $ sudo systemctl start mysql

Para MariaDB, use:

$ sudo systemctl start mariadb

Ahora puede confirmar que la nueva contraseña se ha aplicado correctamente ejecutando:

$ mysql -u root -p

El comando ahora debe solicitar la contraseña recién asignada. Introdúzcalo y debería obtener acceso a la solicitud de la base de datos como se esperaba.

Conclusión

Ahora tiene acceso administrativo al servidor MySQL o MariaDB restaurado. Asegúrese de que la nueva contraseña de root que elija sea segura y segura y manténgala en un lugar seguro.

Blairg23
fuente
1
La declaración ALTER USER se introdujo en MariaDB 10.2.0.
Benoit Desrosiers
2
Guauu ! ¡Esta misma línea me mysql> UPDATE mysql.user SET authentication_string = PASSWORD('new_password') WHERE User = 'root' AND Host = 'localhost';ha salvado la vida!
lucyjosef
36

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 root 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 facilidad de uso 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

Luego, verifique qué método de autenticación utiliza cada una de sus cuentas de usuario MySQL con el siguiente comando:

SELECT user,authentication_string,plugin,host FROM mysql.user;

Salida

+------------------+-------------------------------------------+-----------------------+-----------+
| 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 raíz de hecho se autentica usando 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 a una contraseña segura de su elección, y tenga en cuenta que este comando cambiará la contraseña raíz que estableció en el Paso 2:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

Luego, ejecute FLUSH PRIVILEGES que le dice al servidor que vuelva a cargar las tablas de concesión y ponga en práctica sus nuevos cambios:

FLUSH PRIVILEGES;

Verifique nuevamente los métodos de autenticación empleados por cada uno de sus usuarios para confirmar que la raíz ya no se autentica utilizando el complemento auth_socket:

SELECT user,authentication_string,plugin,host FROM mysql.user;

Salida

+------------------+-------------------------------------------+-----------------------+-----------+
| 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 de salida que el usuario raíz de MySQL ahora se autentica usando una contraseña. Una vez que confirme esto en su propio servidor, puede salir del shell de MySQL:

exit

sonrad10
fuente
27

Para usuarios de Ubuntu / Debian

( puede funcionar en otras distribuciones, especialmente las basadas en Debian)

Ejecute lo siguiente para conectarse como root(sin ninguna contraseña)

sudo /usr/bin/mysql --defaults-file=/etc/mysql/debian.cnf

Si no desea agregar --defaults-filecada vez que desea conectarse root, puede copiar /etc/mysql/debian.cnfen su directorio de inicio:

sudo cp /etc/mysql/debian.cnf ~/.my.cnf

y entonces:

sudo mysql
Fabuloso
fuente
2
Esto fue todo lo que tomó. 'root' no es 'root' en Ubuntu por defecto, aparentemente.
Chaim Eliyah
21

Después de probar todas las otras respuestas, esto fue lo que finalmente funcionó para mí.

sudo mysql -- It does not ask me for any password

-- Then in MariaDB/MySQL console:
update mysql.user set plugin = 'mysql_native_password' where User='root';
FLUSH PRIVILEGES;
exit;

Encontré la respuesta en esta publicación: https://medium.com/@chiragpatel_52497/solved-error-access-denied-for-user-root-localhost-of-mysql-programming-school-6e3611838d06

Pico12
fuente
1
ESTA LÍNEA DE PLUGIN ES REALMENTE ÚTIL. Probé muchas compilaciones pero esta es la única que funcionó para la versión 14.14 Distrib 5.7.27, para Linux (x86_64)
AlexNikonov
2
Esto también me ayudó con mysql 5.7. Tan aplicable no solo para mariadb
podarok
Acabo de usar esto en MySQL 8 Ubuntu 20.04 y funcionó. Otras respuestas usando skip-grant-table(my.conf o en mysqlcomando) no funcionaron. Podría ingresar usando una cuenta de servicio ( askubuntu.com/a/120769/169836 ) pero UPDATE mysql.user SET Password=PASSWORD('') WHERE User='root';no funcionó. Solo cuando se usa la parte del complemento las cosas funcionaron. Gracias ~
hamx0r
16

Para los nuevos usuarios de Linux, esta podría ser una tarea desalentadora. Permítanme actualizar esto con mysql 8 (la última versión disponible en este momento es 8.0.12 como el 12-sep-2018)

  1. Abra el archivo de configuración "mysqld.cnf" en "/etc/mysql/mysql.conf.d/".
  2. Agregue skip-grant-tables a la siguiente línea de texto [mysql] y guárdelo.
  3. Reinicie el servicio mysql como "sudo service mysql restart". Ahora su mysql está libre de cualquier autenticación.
  4. Conéctese al cliente mysql (también conocido como mysql-shell) como mysql -u root -p . No hay una contraseña para ingresar a partir de ahora.
  5. ejecutar privilegios de descarga de comandos sql ;
  6. Restablezca la contraseña ahora como ALTERAR USUARIO 'root' @ 'localhost' IDENTIFICADO POR 'MyNewPassword';
  7. Ahora volvamos al estado normal; elimine esa línea "skip-grant-tables" de "mysqld.cnf" y reinicie el servicio.

Eso es.

Amit Kr
fuente
5

En su banco de trabajo MySQL, puede ir a la barra lateral izquierda, en Administración seleccione "Usuarios y privilegios", haga clic en raíz en Cuentas de usuario, en la sección derecha, haga clic en la pestaña "Límites de cuenta" para aumentar las consultas máximas, actualizaciones, etc. luego haga clic en la pestaña "Roles administrativos" y marque las casillas para dar acceso a la cuenta. ¡Espero que ayude!

Colleen Purcell
fuente
4

Hice esto para establecer mi contraseña de root en la configuración inicial de MySQL en OSx. Abre una terminal.

sudo sh -c 'echo /usr/local/mysql/bin > /etc/paths.d/mysql'

Cierre la terminal y abra una nueva terminal. Y los siguientes se trabajan en Linux, para establecer la contraseña de root.

sudo /usr/local/mysql/support-files/mysql.server stop
sudo mysqld_safe --skip-grant-tables

(sudo mysqld_safe --skip-grant-tables: Esto no funcionó para mí la primera vez. Pero el segundo intento fue el éxito).

Luego inicie sesión en MySQL

mysql -u root

FLUSH PRIVILEGES;

Ahora cambie la contraseña:

ALTER USER 'root'@'localhost' IDENTIFIED BY 'newpassword';

Reiniciar MySQL:

sudo /usr/local/mysql/support-files/mysql.server stop
sudo /usr/local/mysql/support-files/mysql.server start
Sadee
fuente
3

En mi caso bajo Debian 10, el error

ERROR 1698 (28000): Access denied for user 'root'@'localhost'

fue resuelto por (BUENA MANERA)

sudo mysql -u root -p mysql

MAL CAMINO:

mysql -u root -p mysql
klor
fuente
3

Ugh, nada funcionó para mí! Tengo una máquina CentOS 7.4 que ejecuta mariadb 5.5.64.

Lo que tuve que hacer fue esto, justo después de la instalación de mariadb de yum;

# systemctl restart mariadb
# mysql_secure_installation

Luego mysql_secure_installationlo guiará por una serie de pasos, incluido "¿Establecer contraseña de root? [S / n]". Solo di "y" y dale una contraseña. Responda las otras preguntas como desee.

Luego puede ingresar con su contraseña, utilizando

# mysql -u root -p

Sobrevivirá

# systemctl restart mariadb

La clave

Luego, verifiqué el /bin/mysql_secure_installationcódigo fuente para descubrir cómo fue mágicamente capaz de cambiar la contraseña de root y ninguna de las otras respuestas aquí pudo. El bit de importación es:

do_query "UPDATE mysql.user SET Password=PASSWORD('$esc_pass') WHERE User='root';"

... Dice SET Password=...y no SET authentication_string = PASSWORD.... Entonces, el procedimiento adecuado para esta versión (5.5.64) es:

login using mysql -u root -p , using the password you already set.
Or, stop the database and start it with:
mysql_safe --skip-grant-tables --skip-networking &

Desde el indicador mysql>:

use mysql;
select host,user,password from user where user = 'root';
(observe your existing passwords for root).
UPDATE mysql.user set Password = PASSWORD('your_new_cleartext_password') where user = 'root' AND host = 'localhost';
select host,user,password from user where user = 'root';
flush privileges;
quit;

matar a la ejecución mysqld_safe. reiniciar mariadb. Iniciar sesión como root: mysql -u -p. Usa tu nueva contraseña.

Si lo desea, puede configurar todas las contraseñas raíz a la vez. Creo que esto es sabio:

mysql -u root -p
(login)
use mysql;
select host,user,password from user where user = 'root';
UPDATE mysql.user set Password = PASSWORD('your_new_cleartext_password') where user = 'root';
select host,user,password from user where user = 'root';
flush privileges;
quit;

Esto realizará actualizaciones en todas las contraseñas raíz: es decir, para "localhost", "127.0.0.1" y ":: 1"

En el futuro, cuando vaya a RHEL8 o lo que sea que tenga, trataré de recordar revisar la / bin / mysql_secure_installation y ver cómo lo hicieron los chicos, quienes fueron los que configuraron mariadb para este sistema operativo.

Mike S
fuente
2

Si es como yo y todas las sugerencias anteriores fallaron, proceda a desinstalar todas las versiones de mysql en su máquina, busque todos los archivos mysql restantes con este comando sudo find / -name "mysql"y rm -rfcada archivo o directorio con el nombre de mysql adjunto (debe omitir los archivos relacionados a las bibliotecas de lenguaje de programación). Ahora instale una versión nueva de MySQL y disfrute. NB: perderá todos sus datos, así que primero evalúe sus opciones.

Michael Ogala
fuente
1

Puede suceder si no tienes suficientes privilegios. Escriba su, ingrese la contraseña de root e intente nuevamente.

vitaly goji
fuente
1

De acuerdo, sé que este es un hilo viejo, pero si llegaste a esta página a través de Google como lo hice y ninguna de las soluciones anteriores funcionó, lo que resultó ser el error fue un 100% de tonterías por mi parte. No me conecté al servidor. Una vez conectado, todo fue fácil.

En caso de que me ayude a conocer mi configuración, estoy usando Sequel Pro y estoy tratando de conectarme con Node usando el paquete NPM, mysql. No pensé que realmente necesitaba conectarme (aparte de ejecutar Sequel Pro) porque ya lo estaba haciendo desde mi aplicación.

ingrese la descripción de la imagen aquí

Mix Master Mike
fuente
0

Solución: ¡Ríndete!

Escúchame, pasé unos dos días enteros tratando de hacer que MySQL funcionara en vano, siempre atascado con errores de permiso, ninguno de los cuales fue resuelto por las respuestas en este hilo. Llegué al punto en que pensé que si continuaba me volvería loco.

Por paciencia para hacerlo funcionar, envié el comando para instalar SQLite, solo usando 450 KB, y funcionó perfectamente desde el principio.

¡Si no tienes la paciencia de un santo, ve con SQLite y ahorra mucho tiempo, esfuerzo, dolor y espacio de almacenamiento ...!

ArraysStartAt1
fuente