mysql cómo arreglar el acceso denegado para el usuario 'root' @ 'localhost'

123

Antes de fastidiar algo, cuando inicio sesión usando $ mysql -u root -p, y muestro bases de datos:

+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| game_data          |
| test               |
+--------------------+

Luego intenté crear un nuevo usuario y noté que algo anda mal con los PRIVILEGIOS.

Así que eliminé los nuevos usuarios, y supongo que eliminé la 'raíz' y el 'Administrador' accidentalmente.

Luego trato de crear 'root' nuevamente, pero obtengo un error de acceso denegado al otorgar todos los privilegios.

mysql> CREATE USER 'root'@'localhost' IDENTIFIED BY 'password';
mysql> grant all privileges on *.* to 'root'@'localhost' identified by 'password' with grant option;
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

Si vuelvo a iniciar sesión en MySQL usando $ mysql -u root -py muestro bases de datos,

+--------------------+
| Database           |
+--------------------+
| information_schema |
+--------------------+

Todas las otras bases de datos se han ido.

¿Cómo soluciono MySQL ahora?

No puedo encontrar la base de datos 'mysql', no puedo crear una base de datos, crear un usuario, cualquier cosa que intente hacer obtendrá un error.

ERROR 1045 (28000): acceso denegado para el usuario 'root' @ 'localhost' (usando la contraseña: YES).

¿Debo reinstalar MySQL usando MacPorts? Si reinstalo, perderé la base de datos game_data, ¿verdad?

Vogelsire
fuente
Intente acceder al servidor con 'root'@'127.0.0.1', que es diferente de 'root' @ 'localhost'. Luego emita un comando para crear el usuario 'root' @ 'localhost' y otorgarle todos los privilegios.
Gimmy
Consulte también ¿Cómo hacer que MySQL autorice al usuario root? en Super Usuario. Intenta evitar restablecer las contraseñas.
jww
Acabo de tener un espacio entre -py la contraseña. Sé que es tonto, pero podría ayudar a alguien.
Vinay Wadhwa

Respuestas:

132

Sigue los pasos a continuación.

  1. Inicie la instancia del servidor MySQL o daemon con la --skip-grant-tablesopción (configuración de seguridad).

    $ mysqld --skip-grant-tables
    
  2. Ejecute estas declaraciones.

    $ mysql -u root mysql
    $mysql> UPDATE user SET Password=PASSWORD('my_password') where USER='root';
    $mysql> FLUSH PRIVILEGES;
    

Si enfrenta el campo desconocido Error de contraseña anterior use:

update user set authentication_string=password('my_password') where user='root';
  1. Finalmente, reinicie la instancia / daemon sin la --skip-grant-tablesopción.

    $ /etc/init.d/mysql restart
    

Ahora debería poder conectarse con su nueva contraseña.

$ mysql -u root -p

Introducir la contraseña: my_password

Solución para el error de MySQL "No se puede bloquear ibdata1"

sudo mv /usr/local/mysql/data/ibdata1 /usr/local/mysql/data/ibdata1.bak
sudo mv /usr/local/mysql/data/ib_logfile0 /usr/local/mysql/data/ib_logfile0.bak
sudo mv /usr/local/mysql/data/ib_logfile1 /usr/local/mysql/data/ib_logfile1.bak
sudo cp -a /usr/local/mysql/data/ibdata1.bak /usr/local/mysql/data/ibdata1
sudo cp -a /usr/local/mysql/data/ib_logfile0.bak /usr/local/mysql/data/ib_logfile0
sudo cp -a /usr/local/mysql/data/ib_logfile1.bak /usr/local/mysql/data/ib_logfile1
sudo /etc/init.d/mysql restart
Yogus
fuente
1
"$ mysqld --skip-grant-tables" e "InnoDB: no se puede bloquear ./ibdata1, error: 35 InnoDB: compruebe que todavía no tiene otro proceso mysqld InnoDB: utilizando los mismos datos de InnoDB o archivos de registro".
ver mi actualización anterior
Yogus
Descubrí que detener mysql antes de emitir el primer comando detiene el error de bloqueo - servicio mysql stop
Frank Tzanabetis
77
Aparentemente, la columna 'contraseña' ya no existe ... ha sido reemplazada por 'autenticación_cadena'. Por lo tanto, la cadena de actualización de contraseña ahora es: ACTUALIZAR usuario SET autenticación_cadena = CONTRASEÑA ('mi_contraseña') donde USUARIO = 'raíz';
jdmcnair
1
¡Gracias! Y ahora tengo curiosidad: ¿qué pudo haber causado esto? En Windows
Ilia Andrienko
64

Ninguno de los anteriores fue útil para mí. Descubrí que necesitaba borrar el método del complemento. En 5.6, podría hacer:

sudo mysql -u root
use mysql;
[mysql] update user set plugin='' where User='root';
[mysql] flush privileges;

En 5.7, descubrí que necesitaba:

sudo mysql -u root
use mysql;
[mysql] update user set plugin='mysql_native_password' where User='root';
[mysql] flush privileges;

De acuerdo con los documentos, con el complemento configurado en una cadena vacía, debería haberse configurado de manera predeterminada como mysql_native_password, pero puede confundirse con un hash de contraseña vacío. Para obtener más matices, puede leer la documentación aquí: https://dev.mysql.com/doc/refman/5.7/en/native-authentication-plugin.html

Mario Olivio Flores
fuente
55
Esto lo resolvió para mí. Cuando miré el estado del demonio mysql, vi esta advertencia: "[Advertencia] 'user' entry 'root @ localhost' tiene una contraseña y un complemento de autenticación especificado. La contraseña será ignorada". Establecer el complemento en '' me permitió iniciar sesión nuevamente. Gracias, @Mario Flores
SpacePope
Mi complemento estaba en blanco. Lo curioso es que se cambió a blanco automáticamente. Tenga en cuenta que estoy hablando de una instalación en mi computadora personal donde utilizo dist-updates, por lo que esa podría ser la razón por la que el usuario root se rompió.
Amigo de Kim
2
set plugin='mysql_native_password'lo hice por mi, gracias! Para referencia: dev.mysql.com/doc/refman/5.7/en/…
Koen.
¿Por qué sigue siendo un problema para las instalaciones de paquetes desde cero en 2018?
mckenzm
1
ubuntu 18, y funcionó
Rahal Kanishka
8

También asegúrese de que el registro necesario en la tabla usertenga un plugincampo vacío (puede haber, por ejemplo "unix_socket").

Desde la versión 5.5.7 mysql tiene varios complementos de autenticación compatibles con https://dev.mysql.com/doc/refman/5.6/en/authentication-plugins.html

Entonces, si tiene un plugincampo no vacío , la contraseña se ignorará y habrá una advertencia en el registro de errores de mysql (para mí es /var/log/mysql/error.log):

[Warning] 'user' entry 'root@localhost' has both a password and an authentication plugin specified. The password will be ignored.

d9k
fuente
1
Para alguien más que se encuentra con esto, cuando ejecuta mysql server 5.7.15, esto realmente bloquea a su usuario si no proporciona un complemento. Probablemente lo que estás buscando es una pluginde mysql_native_password.
Jonathan Cantrell
8
grep 'temporary password' /var/log/mysqld.log
Sort date (newest date)

Puedes ver algo como esto;

[root@SERVER ~]# grep 'temporary password' /var/log/mysqld.log
2016-01-16T18:07:29.688164Z 1 [Note] A temporary password is generated for root@localhost: O,k5.marHfFu
2016-01-22T13:14:17.974391Z 1 [Note] A temporary password is generated for root@localhost: b5nvIu!jh6ql
2016-01-22T15:35:48.496812Z 1 [Note] A temporary password is generated for root@localhost: (B*=T!uWJ7ws
2016-01-22T15:52:21.088610Z 1 [Note] A temporary password is generated for root@localhost: %tJXK7sytMJV
2016-01-22T16:24:41.384205Z 1 [Note] A temporary password is generated for root@localhost: lslQDvgwr3/S
2016-01-22T22:11:24.772275Z 1 [Note] A temporary password is generated for root@localhost: S4u+J,Rce_0t
[root@SERVER ~]# mysql_secure_installation

Asegurar la implementación del servidor MySQL.

Enter password for user root: 

The existing password for the user account root has expired. Please set a new password.

New password: 

Re-enter new password:

Si ves que dice

... Failed! Error: Your password does not satisfy the current policy requirements
That means your password needs to have a character such as ! . # - etc...
mix characters well, upper case, lower case, ! . , # etc...

New password: 

Re-enter new password: 
The 'validate_password' plugin is installed on the server.
The subsequent steps will run with the existing configuration
of the plugin.
Using existing password for root.

Estimated strength of the password: 100 
Change the password for root ? ((Press y|Y for Yes, any other key for No) : Y

New password: 

Re-enter new password: 

Estimated strength of the password: 100 
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : Y
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) : Y
Success.


Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : Y
Success.

By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.


Remove test database and access to it? (Press y|Y for Yes, any other key for No) : Y
 - Dropping test database...
Success.

 - Removing privileges on test database...
Success.

Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : Y
Success.

All done! 
[root@SERVER ~]# mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 5.7.10 MySQL Community Server (GPL)

Mira los últimos 10 minutos de este video , te enseña cómo lo haces.

Tadeh
fuente
Aunque esto puede responder la pregunta, debe proporcionar una descripción más detallada del contenido vinculado y explicar cómo se relaciona con la pregunta. Esto ayudará a garantizar que esta respuesta siga siendo útil en caso de que la página vinculada se elimine o se desconecte. Para obtener más información, consulte esta publicación de Meta Stack Exchange .
bwDraco
Este es el caso de uso que vi, estoy instalando mysql en RHEL7 en AWS con Ansible y obtengo el mismo comportamiento después de reconfigurar y reiniciar la base de datos. ¿Sabes por qué sucede esto en primer lugar? Bloquea a Ansible para acceder al mysqld local y lo configura. Esto es solo para fines de prueba.
einarc
Al parecer, depende de cómo inicializar el servidor, mira en el paso 4 aquí: dev.mysql.com/doc/refman/5.7/en/...
einarc
3

Intentalo:

mysql --no-defaults --force --user=root --host=localhost --database=mysql 
UPDATE user SET Password=PASSWORD('NEWPASSWORD') where USER='root';
FLUSH PRIVILEGES;
Gustavo Duarte
fuente
66
¿Puedes describir lo que hacen los --no-defaults --forceinterruptores? De lo contrario, es un duplicado VLQ de la respuesta aceptada anterior.
Luke canadiense
@CanadianLuke no omite los archivos de configuración presentes que de otro modo incluiría, forzar la operación continua incluso si alguno de los comandos SQL emitidos falla. En caso de duda, consulte el manual
deucalion
3
Tiene que ser editado en la respuesta
Canadian Luke
2
ObtengoERROR 1054 (42S22): Unknown column 'Password' in 'field list'
Jonathan
1
Look de @JonathanLeaders: stackoverflow.com/questions/30692812/…
Gustavo Duarte
3

En mi caso, tuve un daño en la base de datos, después de reiniciar mysql en Debian, el inicio de sesión raíz no tenía contraseña. La solución fue esta:

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

Algunas otras respuestas también han mencionado el plugin native_password, pero así es como puedes hacerlo sin complicarte la manipulación. Así es como debe ser cambiado.

John
fuente