Das Root-Passwort für MySQL (MariaDB) kann nicht zurückgesetzt werden


35

Heute wollte ich eine Datenbank in PMA erstellen. Es hieß: "Anmeldung am MySQL-Server nicht möglich". Ich habe über ein Terminal das gleiche Problem versucht, und es liegt daran, dass mein Passwort falsch ist. Und ich kann nicht verstehen warum.

Ich habe die übliche Methode zum Zurücksetzen des Root-Passworts verwendet (das Einhängen von Grant-Tabellen überspringen und das Passwort zurücksetzen), aber es scheint, als ob es nicht funktioniert.

Siehst du das:

morgan@rakija:~$ sudo mysqld_safe --skip-grant-tables &
[1] 14016
morgan@rakija:~$ 150802 19:07:25 mysqld_safe Can't log to error log and syslog at the same time.  Remove all --log-error configuration options for --syslog to take effect.
150802 19:07:25 mysqld_safe Logging to '/var/log/mysql/error.log'.
150802 19:07:25 mysqld_safe A mysqld process already exists

[1]+  Terminé 1               sudo mysqld_safe --skip-grant-tables
morgan@rakija:~$ mysql -u root
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 2
Server version: 10.0.20-MariaDB-0ubuntu0.15.04.1 (Ubuntu)

Copyright (c) 2000, 2015, Oracle, MariaDB Corporation Ab and others.

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

MariaDB [(none)]> use mysql;
Database changed
MariaDB [mysql]> update user set password=PASSWORD("newPass") where user='root';
Query OK, 4 rows affected (0.00 sec)
Rows matched: 4  Changed: 4  Warnings: 0

MariaDB [mysql]> flush privileges;
Query OK, 0 rows affected (0.00 sec)

MariaDB [mysql]> exit
Bye
morgan@rakija:~$ sudo service mysql restart
morgan@rakija:~$ mysql -uroot -pnewPass
ERROR 1698 (28000): Access denied for user 'root'@'localhost'

Antworten:


56

Ich habe eine Lösung gefunden, die so seltsam ist wie das Problem selbst.

Starten Sie MySQL / MariaDB mit neu --skip-grant-tables(suchen Sie im Web nach Tutorials). (überhaupt nicht notwendig, lies meine Änderungen am Ende des Beitrags)

Schau dir das pluginFeld in der mysql.userTabelle an:

MariaDB [mysql]> SELECT user, plugin FROM user;
+------+-------------+
| user | plugin      |
+------+-------------+
| root | unix_socket |
| root | unix_socket |
| root | unix_socket |
| root | unix_socket |
+------+-------------+

Ich musste das Plugin-Feld jedes Eintrags auf eine leere Zeichenfolge zurücksetzen.

UPDATE user SET plugin="";   // without WHERE clause

Stellen Sie außerdem sicher, dass ein Kennwort definiert ist, da es manchmal gelöscht zu sein scheint (in den user, passwordFeldern auswählen ). Wenn nicht, aktualisiere es mit:

UPDATE user SET password=PASSWORD("my_password") WHERE user="root";

Berechtigungsparameter müssen explizit gespeichert werden:

FLUSH PRIVILEGES;

Starten Sie dann MySQL im normalen Modus neu und Sie sollten in der Lage sein, eine Verbindung zum Root-Konto herzustellen.

Dadurch wird die Verbindung über den Unix-Socket nicht unbedingt deaktiviert. Nach der Reparatur von MySQL kann ich in PMA sehen, dass die Verbindung über einen Unix-Socket hergestellt wird.

BEARBEITEN , einige Monate später: Ich bin jetzt daran gewöhnt, dass dieses Problem häufig auftritt, denke ich bei jedem Update von MariaDB (oder so ähnlich). So habe ich ein besseres Verständnis für das Problem; Es gibt ein UNIX_SOCKET-Plugin, mit dem Sie sich in einem MariaDB-Konto anmelden können, ohne ein Kennwort erstellen zu müssen, da es die Anmeldeinformationen der Shell verwendet, um Ihnen zu vertrauen, ohne ein Kennwort eingeben zu müssen. Tatsächlich handelt es sich bei diesem Plugin um ein Authentifizierungs-Plugin und nicht um eine Kommunikationsmethode mit dem SQL Server. Sie können es also sicher deaktivieren, wenn Sie Unix-Socket nicht als Anmeldemethode verwenden. Das einzige, was ich nicht erklären kann, ist, warum das UNIX_SOCKET-Plugin regelmäßig für jedes Konto der Datenbank festgelegt wird, ohne dass ich etwas dagegen tun muss.

Dies hat den netten Nebeneffekt, dass Sie sich in diesem Fall beim SQL Server anmelden können, ohne MariaDB neu starten zu müssen --skip-grant-tables: Melden Sie sich einfach beim Root-Konto des Systems an, stellen Sie dann eine Verbindung mit mysql -u rootohne Kennwort her und setzen Sie das Plugin-Feld im zurück wie es oben erklärt ist.

EDIT 2: Bestätigt, es passiert bei jedem MariaDB-Upgrade auf Ubuntu.


1
Dies unterbricht den Wartungs-Cron-Job unter Ubuntu 16.04 (zumindest), da dieses Skript erwartet, dass es sich ohne Kennwort mit dem Socket-Plug-In anmeldet. Weitere Informationen finden Sie unter superuser.com/questions/957708/… .
Colan

Okay, interessant, aber das passiert nicht mehr (mein Setup für Legacy-Passwörter funktioniert jetzt nicht mehr nach dem Zufallsprinzip). Vielleicht ist das Unix-Socket-Plugin jetzt nur auf den Root-Benutzer eingestellt? Konnte das jetzt nicht überprüfen. Die Idee, dass das Betriebssystem für mich entscheidet, welches Authentifizierungssetup verwendet werden soll, gefällt mir jedoch nicht.
Morgan Touverey Quilling

Dieses Problem ist zum Kotzen, es ist unter Debian 9 passiert, bei der Installation von MariaDB wurde kein Root-Passwort abgefragt und ich konnte es nicht einmal zurücksetzen. Ich hoffe, dass es nach einem Upgrade nicht wieder vorkommt. Sollten wir MariaDB durch MySQL ersetzen, um solche Probleme zu vermeiden?
Taufe

Ich bin mir nicht sicher, ob es immer noch passiert, es wurde möglicherweise behoben (ich kann den Beitrag bearbeiten, wenn jemand weiß). Vielleicht passiert es nur bei der Installation, was eine gute Standardeinstellung wäre.
Morgan Touverey Quilling

1
Ich habe gerade bemerkt , dass , wenn wir für den Benutzer root das Plugin nicht Buchse Unix verwenden, wird es scheitern phpmyadmin - Paket auf neuesten Debian zu installieren: ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO). Die beste Lösung ist es, weiterhin die standardmäßige Unix-Socket-Authentifizierung mit Befehl zu verwenden sudo mysql -u root, die meiner Meinung nach auch sicherer und performanter ist.
Taufe

5

Aus dieser Antwort http://ubuntuforums.org/showthread.php?t=2275033&p=13272227#post13272227 .

Mysql versucht, root mit dem Plugin zu authentifizieren, nicht mit dem Passwort. Sie müssen die Plugin-Verwendung für root deaktivieren.

shell$ sudo mysql -u root

[mysql] use mysql;
[mysql] update user set plugin='' where User='root';
[mysql] flush privileges;
[mysql] \q

2
Genau das habe ich als Antwort gepostet.
Morgan Touverey Quilling

1
Es ist ein etwas präziseres Rollup mit Ihrem Update.
Ponys

Ich kann nicht einmal eine MySQL-Shell bekommen, so dass dies in meinem Fall nicht funktioniert, obwohl ich Could not open mysql.plugin table.im Fehlerprotokoll sehe .
Dave Everitt

0

Verbinden Sie wie zuvor beschrieben:

mysqld_safe --skip-grant-tables

Protokolldatei wird angezeigt:

160518 23:21:01 mysqld_safe Logging to '/usr/local/mysql/data/ab123456.domain.com.err'.
160518 23:21:01 mysqld_safe Starting mysqld daemon with databases from /usr/local/mysql/data

Durchsuchen Sie das aufgelistete Protokoll (in diesem Fall: /usr/local/mysql/data/ab123456.domain.com.err) nach dem richtigen Socket:

cat /usr/local/mysql/data/ab123456.domain.com.err | grep "socket: "
Version: '5.5.49-MariaDB'  socket: '/tmp/mysql.sock'  port: 3306  MariaDB Server

und benutze es in MySQL Verbindung:

mysql --socket /tmp/mysql.sock -u root
root@ab123456:~# /usr/local/mysql/bin/mysql --socket /tmp/mysql.sock -u root

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 1
Server version: 5.5.49-MariaDB MariaDB Server

Ich bekomme nur, werde $ mysqld_safe --skip-grant-tables 190818 14:13:35 mysqld_safe Logging to '/usr/local/var/mylaptop.local.err'. 190818 14:13:35 mysqld_safe Starting mysqld daemon with databases from /usr/local/varaber einfach zur Bash-Eingabeaufforderung zurückgeworfen.
Dave Everitt

0

Standardmäßig verwendet marriadb das Authentifizierungs-Plugin "unix_socket", um Passwörter festzulegen. Dies sollte also "mysql_native_password" sein

Datenbank wechseln ..

use mydatabase;

erst mal sehen was das plugin setzt ..

SELECT user, plugin FROM user;

setze es auf "mysql_native_password"

UPDATE user SET plugin="mysql_native_password"; 

neues Passwort setzen ...

update user set authentication_string=password('My@Password'), plugin='mysql_native_password' where user='root';
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.