MySQL(MariaDB)のrootパスワードをリセットできません


33

今日は、PMAでデータベースを作成したいと思いました。それは言った: "MySQLサーバーにログインできません"。私は端末を介して試してみた、同じ問題、そしてそれは私のパスワードが間違っているためです。そして、私はその理由が理解できません。

私は通常の方法でrootのパスワードをリセットすることを試みました(付与テーブルのマウントをスキップしてパスワードをリセットする)が、うまくいかないようです。

それを参照してください。

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'

回答:


51

問題自体と同じくらい奇妙な解決策を見つけました。

を使用してMySQL / MariaDBを再起動します。 --skip-grant-tables (Web上のチュートリアルを検索)。 (まったく必要ない、投稿の最後に私の編集を読む)

を見て plugin にフィールド mysql.user 表:

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

各エントリのプラグインフィールドを空白の文字列にリセットする必要がありました。

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

また、パスワードが定義されていることを確認してください。 user, password フィールド)。そうでなかったら、それを更新して下さい:

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

特権パラメータは明示的に保存する必要があります。

FLUSH PRIVILEGES;

その後、MySQLを通常モードで再起動すると、rootアカウントに接続できるはずです。

これは必ずしもUnixソケット経由の接続を無効にするわけではありません。 MySQL vaを修復した後、PMAで、接続がUnixソケットを介して確立されたことがわかります。

編集 数ヶ月後、私は今この問題が頻繁に戻ってくるのを慣れています、私はMariaDB(またはそのようなもの)の各更新で考えるとします。それで、私は問題のより良い理解を得ました。 UNIX_SOCKETプラグインがあり、パスワードを作成しなくてもMariaDBアカウントにログインできます。パスワードを入力しなくても、シェルの資格情報を使用して信頼できるからです。実際、このプラグインは 認証プラグイン SQLサーバーとの通信方法ではありません。あなたがログイン方法としてunixソケットを使わないのであれば、あなたはそれを安全に無効にすることができます。 説明できない唯一のことは、UNIX_SOCKETプラグインがデータベースの各アカウントに定期的に設定されていることです。

これは良い副作用があります、それが起こると、あなたがでMariaDBを再起動する必要なしにSQLサーバにログインできるということです。 --skip-grant-tables:システムのrootアカウントにログインするだけで接続できます mysql -u root パスワードなしで、それから上記で説明されている方法でプラグインフィールドをリセットします。

編集2: 確認しました、それはUbuntuの各MariaDBアップグレードで起こります。


1
これはUbuntu 16.04のメンテナンスクーロンジョブを中断します(少なくとも)。そのスクリプトはソケットプラグインを使用してパスワードなしでログインすることを期待しているからです。見る superuser.com/questions/957708/… 詳細については。
colan

わかりました、おもしろい、しかしこれはもう起こりません(私の従来のパスワード設定は今ランダムに壊れません)。たぶん、Unixソケットプラグインはrootユーザーだけに設定されているのでしょうか。今すぐ確認できませんでした。しかし、OSがどの認証設定を使用するかを決定するという考えは嫌いです。
Morgan Touverey Quilling

この問題は、Debian 9で起こりました、MariaDBをインストールしたときにrootパスワードが要求されず、リセットすることすらできないということです。アップグレード後も二度と起こらないことを願っています。そのような問題を避けるために、MariaDBをMySQLに置き換えるべきですか?
baptx

それがまだ起こるかどうかわからない、それは今修正されているかもしれません(誰かが知っていれば私は記事を編集することができます)。たぶんそれはインストール時にのみ起こるでしょう、それは良いデフォルト設定になるでしょう。
Morgan Touverey Quilling

1
rootユーザーにunixソケットプラグインを使用しないと、phpmyadminパッケージを最新のDebianにインストールできないことに気付きました。 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)。そのため、最善の解決策は、デフォルトのUNIXソケット認証をコマンドで使い続けることです。 sudo mysql -u rootこれはまた、より安全でパフォーマンスが高いと思います。
baptx

4

この答えから、 http://ubuntuforums.org/showthread.php?t=2275033&p=13272227#post13272227

MySQLはパスワードではなくプラグインを使用してrootを認証しようとします。 rootのプラグイン使用を無効にする必要があります。

shell$ sudo mysql -u root

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

2
それがまさに私が答えとして投稿したものです。
Morgan Touverey Quilling

これはあなたのアップデートでもう少し簡潔にまとめたものです。
ponies

0

前述のように接続します。

mysqld_safe --skip-grant-tables

ログファイルが表示されます。

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

正しいソケットの検索ログ(この場合は/usr/local/mysql/data/ab123456.domain.com.err):

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

そしてMySQL接続でそれを使用します。

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

0

デフォルトでmarriadbはパスワードを設定するために "unix_socket"認証プラグインを使います これは "mysql_native_password"であるはずです

データベースを切り替えます。

use mydatabase;

最初に魔女プラグインが設定されているのを見てください。

SELECT user, plugin FROM user;

"mysql_native_password"に設定してください。

UPDATE user SET plugin="mysql_native_password"; 

新しいパスワードを設定してください...

update user set authentication_string=password('My@Password'), plugin='mysql_native_password' where user='root';
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.