今日は、PMAでデータベースを作りたいと思いました。と書いてあったのですが”MySQLサーバにログインできません “と書いてあった。ターミナル経由で試してみましたが、同じ問題で、パスワードが間違っているのが原因だそうです。そして、私は理由を理解することができません
rootパスワードをリセットするいつもの方法(グラントテーブルのマウントをスキップしてpassordをリセットする)を試してみましたが、うまくいかないようです
See that:
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'
37 Morgan Touverey Quilling 2015-08-02
問題そのものと同じくらい不思議な解決策を見つけました
(全く必要ありません。投稿の最後に私の編集を読んでください)--skip-grant-tables
を使用してMySQL/MariaDBを再起動する(ウェブ上でチュートリアルを検索).
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
また、パスワードが消されてしまうことがあるようなので、パスワードが定義されているか確認してください。定義されていない場合は、次のように更新してください
UPDATE user SET password=PASSWORD("my_password") WHERE user="root";
特権パラメータを明示的に保存する必要があります
FLUSH PRIVILEGES;
その後、通常モードでMySQLを再起動すれば、ルートアカウントに接続できるはずです
これは、必ずしもUnixソケットを介して接続を無効にすることはできません。MySQLが修復された後、PMAでは、Unixソケットを介して接続が確立されていることがわかります
EDIT、数ヶ月後。MariaDBのアップデートの度にこの問題が頻繁に発生するようになりました。UNIX_SOCKETというプラグインがあり、これを使うとパスワードを入力しなくてもシェルの認証情報を使って信用してくれるので、パスワードを作成しなくてもMariaDBアカウントにログインできるようになります。実はこのプラグインは認証プラグインであり、SQLサーバーとの通信手段ではありません。なので、ログイン方法にunixソケットを使わない場合は、安全に無効にしても問題ありません。ただ、私の側では何もしなくても、データベースの各アカウントにUNIX_SOCKETプラグインが定期的に設定されているのが不思議でなりません
これは、それが起こったときに、--skip-grant-tables
でMariaDBを再起動しなくてもSQLサーバーにログインできるという良い副作用があります:システムのルートアカウントにログインして、パスワードなしでmysql -u root
で接続するだけで、上で説明した方法でプラグインフィールドをリセットします
EDIT 2: 確認したところ、UbuntuでMariaDBをアップグレードするたびに発生します
59 Morgan Touverey Quilling 2015-08-03
From this answer, 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
5 ponies 2016-01-18
前述のように接続します
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 wiesia.stachanczyk 2016-05-18
デフォルトではmarriadbはパスワードを設定するために “unix_socket “認証プラグインを使用していますが、これは “mysql_native_password “でなければなりませんので
switch database..
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';
0 André Verwijs 2017-08-12