mysql wie man den Zugriff für Benutzer 'root' @ 'localhost' verweigert

123

Bevor ich etwas vermassle, wenn ich mich mit anmelde $ mysql -u root -pund Datenbanken zeige:

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

Dann habe ich versucht, einen neuen Benutzer anzulegen und festgestellt, dass mit den PRIVILEGES etwas nicht stimmt.

Also habe ich die neuen Benutzer gelöscht, und ich glaube, ich habe versehentlich 'root' und 'Admin' entfernt.

Dann versuche ich erneut, "root" zu erstellen, erhalte jedoch den Fehler "Zugriff verweigert", wenn alle Berechtigungen gewährt werden.

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)

Wenn ich mich erneut mit MySQL anmelde $ mysql -u root -pund Datenbanken zeige,

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

Alle anderen Datenbanken sind weg.

Wie behebe ich MySQL jetzt?

Ich kann die Datenbank 'mysql' nicht finden, kann keine Datenbank erstellen, keinen Benutzer erstellen, alles, was ich versuche, wird einen Fehler bekommen.

FEHLER 1045 (28000): Zugriff für Benutzer 'root' @ 'localhost' verweigert (mit Kennwort: JA).

Sollte ich MySQL mit MacPorts neu installieren? Bei einer Neuinstallation verliere ich die Datenbank game_data, oder?

Vogelsire
quelle
Versuchen Sie, auf den Server mit 'root'@'127.0.0.1' zuzugreifen, was sich von 'root' @ 'localhost' unterscheidet. Setzen Sie dann einen Befehl ab, um den Benutzer 'root' @ 'localhost' zu erstellen und ihm alle Berechtigungen zu erteilen.
Gimmy
Siehe auch Wie kann MySQL den Root-Benutzer berechtigen? auf Super User. Es wird versucht, das Zurücksetzen von Kennwörtern zu vermeiden.
Jww
Ich hatte gerade ein Leerzeichen zwischen -pund dem Passwort. Ich weiß, dass es albern ist, könnte aber jemandem helfen.
Vinay Wadhwa

Antworten:

132

Folgen Sie den unteren Schritten.

  1. Starten Sie die MySQL Server-Instanz oder den Daemon mit der --skip-grant-tablesOption (Sicherheitseinstellung).

    $ mysqld --skip-grant-tables
    
  2. Führen Sie diese Anweisungen aus.

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

Wenn Sie auf das unbekannte Feld Passwortfehler stoßen, verwenden Sie:

update user set authentication_string=password('my_password') where user='root';
  1. Starten Sie abschließend die Instanz / den Daemon ohne die --skip-grant-tablesOption neu.

    $ /etc/init.d/mysql restart
    

Sie sollten nun in der Lage sein, sich mit Ihrem neuen Passwort zu verbinden.

$ mysql -u root -p

Passwort eingeben: my_password

Behebung des MySQL-Fehlers "ibdata1 kann nicht gesperrt werden"

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
quelle
1
"$ mysqld --skip-grant-tables" und "InnoDB: Sperren von ./ibdata1 nicht möglich, Fehler: 35 InnoDB: Stellen Sie sicher, dass Sie noch keinen anderen mysqld-Prozess haben. InnoDB: Verwenden derselben InnoDB-Daten oder -Protokolldateien."
siehe mein Update oben
Yogus
Ich habe festgestellt, dass das Stoppen von mysql vor der Ausgabe des ersten Befehls den
Sperrfehler
7
Anscheinend existiert die Spalte 'password' nicht mehr ... sie wurde durch 'authentication_string' ersetzt. Die Zeichenfolge für die Kennwortaktualisierung lautet jetzt: UPDATE user SET authentication_string = PASSWORD ('my_password') wobei USER = 'root';
Jdmcnair
1
Danke! Und jetzt bin ich gespannt: Was könnte das verursacht haben? Unter Windows?
Ilia Andrienko
64

Keines der oben genannten war hilfreich für mich. Ich musste die Plugin-Methode löschen. In 5.6 konnte ich Folgendes tun:

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

In 5.7 musste ich Folgendes tun:

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

Laut Dokumentation sollte das Plug-in bei einer leeren Zeichenfolge standardmäßig mysql_native_password haben, wird jedoch möglicherweise durch einen leeren Kennwort-Hash verwirrt. Weitere Informationen finden Sie in der Dokumentation hier: https://dev.mysql.com/doc/refman/5.7/en/native-authentication-plugin.html

Mario Olivio Flores
quelle
5
Das hat es für mich gelöst. Als ich mir den Status des mysql-Daemons ansah, sah ich folgende Warnung: "[Warnung] Der Benutzer-Eintrag 'root @ localhost' hat sowohl ein Passwort als auch ein Authentifizierungs-Plugin angegeben. Das Passwort wird ignoriert." Durch Setzen des Plugins auf "" konnte ich mich erneut anmelden. Vielen Dank, @ Mario Flores
SpacePope
Mein Plugin war leer. Das lustige daran ist, dass es automatisch auf leer gesetzt wird. Bitte beachten Sie, dass es sich um eine Installation auf meinem PC handelt, bei der ich Dist-Upgrades verwende. Dies könnte der Grund sein, warum der Root-Benutzer pleite ist.
Freund von Kim
2
set plugin='mysql_native_password'habe es für mich getan, danke! Als Referenz: dev.mysql.com/doc/refman/5.7/en/…
Koen.
Warum ist dies immer noch ein Problem bei Grundinstallationen von Paketen für 2018?
McKenzm
1
Ubuntu 18, und es hat funktioniert
Rahal Kanishka
8

Stellen Sie außerdem sicher, dass der benötigte Datensatz in der Tabelle userein leeres pluginFeld enthält (dies kann beispielsweise sein "unix_socket").

Seit Version 5.5.7 unterstützt mysql verschiedene Auth-Plugins: https://dev.mysql.com/doc/refman/5.6/en/authentication-plugins.html

Wenn Sie also ein nicht leeres pluginFeld haben, wird das Passwort ignoriert und es wird eine Warnung im MySQL-Fehlerprotokoll angezeigt (für mich ist es das /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
quelle
1
Für jemanden, der auf diesem Server läuft, wird der Benutzer beim Ausführen von mysql server 5.7.15 tatsächlich gesperrt, wenn Sie kein Plug-in bereitstellen. Wahrscheinlich ist das, wonach Sie suchen, eines pluginvon mysql_native_password.
Jonathan Cantrell
8
grep 'temporary password' /var/log/mysqld.log
Sort date (newest date)

Sie können so etwas sehen;

[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

Sichern der MySQL Server-Bereitstellung.

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:

Wenn du siehst, heißt es

... 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)

Sehen Sie sich die letzten 10 Minuten dieses Videos an und erfahren Sie, wie Sie es tun.

Tadeh
quelle
Obwohl dies die Frage möglicherweise beantwortet, sollten Sie den verlinkten Inhalt genauer beschreiben und erläutern, wie er mit der Frage zusammenhängt. Auf diese Weise wird sichergestellt, dass diese Antwort für den Fall nützlich bleibt, dass die verknüpfte Seite entfernt wird oder offline geschaltet wird. Weitere Informationen finden Sie in diesem Meta Stack Exchange-Beitrag .
bwDraco
Dies ist der Anwendungsfall, den ich gesehen habe. Ich installiere mysql unter RHEL7 in AWS mit Ansible und erhalte das gleiche Verhalten, nachdem ich die Datenbank neu konfiguriert und neu gestartet habe. Wissen Sie, warum dies an erster Stelle geschieht, Ansible daran hindert, auf das lokale mysqld zuzugreifen und es zu konfigurieren? Dies dient nur zu Testzwecken.
Einarc
Anscheinend hängt es davon ab, wie Sie den Server initialisieren. Sehen Sie sich Schritt 4 hier an: dev.mysql.com/doc/refman/5.7/en/…
einarc
3

Versuch es:

mysql --no-defaults --force --user=root --host=localhost --database=mysql 
UPDATE user SET Password=PASSWORD('NEWPASSWORD') where USER='root';
FLUSH PRIVILEGES;
Gustavo Duarte
quelle
6
Können Sie beschreiben, was die --no-defaults --forceSchalter tun? Andernfalls handelt es sich um ein VLQ-Duplikat der oben angegebenen, akzeptierten Antwort.
Canadian Luke
@CanadianLuke no defaults überspringt alle Konfigurationsdateien, die andernfalls enthalten wären, und erzwingt die Fortsetzung des Betriebs, auch wenn einer der ausgegebenen SQL-Befehle fehlschlägt. Überprüfen Sie im Zweifelsfall das Handbuch
Deucalion
3
Es muss in die Antwort bearbeitet werden
Kanadier Luke
2
Ich bekommeERROR 1054 (42S22): Unknown column 'Password' in 'field list'
Jonathan
1
@ JonathanLeaders aussehen: stackoverflow.com/questions/30692812/…
Gustavo Duarte
3

In meinem Fall hatte ich eine Datenbankbeschädigung, nach dem Neustart von mysql unter Debian war der root-Login ohne Passwort. Die Lösung war:

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

Einige andere Antworten haben auch das native_password-Plugin erwähnt, aber so können Sie es tun, ohne umständlich herumzuspielen. So soll es geändert werden.

John
quelle