シェルターミナルからパスワードなしでログインできますがmysql -uroot
、mariadbエラーの場合はNavicatでログインします。1698 - Access denied for user 'root'@'localhost'
Server version: 10.1.38-MariaDB-0+deb9u1 Debian 9.8
MariaDB [mysql]> select user,host,plugin from user where user='root'\G;
*************************** 1. row ***************************
user: root
host: %
plugin: unix_socket
1 row in set (0.00 sec)
rootはローカルのunixソケットログインのみを許可していることがわかります。
unix_socketの紹介について:
unix_socketの認証プラグインのローカルUnixソケットファイルを経由してMariaDBへの接続時に、ユーザーがオペレーティングシステムの資格情報を使用することができます。このUnixソケットファイルは、ソケットシステム変数によって定義されます。unix_socketの認証プラグインは、それがソケットに接続されているプロセスのUIDを取得することができますSO_PEERCREDソケットオプションとgetsockoptのシステムコールを呼び出すことで動作します。その後、そのuidに関連付けられたユーザー名を取得できます。ユーザー名を取得すると、接続しているユーザーを同じユーザー名のMariaDBアカウントとして認証します。差出人:https://mariadb.com/kb/en/authentication-plugin-unix-socket/
この問題を解決するために、mysql.userテーブルのrootユーザーの行のプラグインフィールドを空に変更できます。変更後、シェルターミナルからのrootログインにもパスワードが必要です。rootパスワードを忘れる手間を省くために、新しいデータベースユーザーを作成することにしました。
# myql -uroot
MariaDB [(none)]> use mysql;
Database changed
MariaDB [mysql]> create user 'sure'@'%' identified by '1234567'
Query OK, 0 rows affected (0.00 sec)
MariaDB [mysql]> select user,host,plugin from user;
+------+------+-------------+
| user | host | plugin |
+------+------+-------------+
| root | % | unix_socket |
| sure | % | |
+------+------+-------------+
MariaDB [mysql]> flush privileges;
Query OK, 0 rows affected (0.00 sec)
ご覧のとおり、新しく作成されたユーザーのプラグインフィールド値はデフォルトで空であり、問題はここで解決されます。
プラグイン列が空の場合、MariaDBはデフォルトでmysql_native_passwordまたはmysql_old_passwordプラグインのいずれかを使用してアカウントを認証します。[パスワード]列の値で使用されているハッシュに基づいて、どちらを決定します。パスワードが設定されていない場合、または4.1パスワードハッシュ(41文字の長さ)が使用されている場合、MariaDBはmysql_native_passwordプラグインを使用します。mysql_old_passwordプラグインは、4.1より前のパスワードハッシュ(16文字の長さ)で使用されます。
差出人:https://mariadb.com/kb/en/mysqluser-table/#authentication-plugin
一般的に、プラグインフィールドが空の場合、デフォルトのパスワードベースのログイン方法がデフォルトで使用されます。
mysql.userテーブルのフィールドの意味:https://mariadb.com/kb/en/mysqluser-table/
mariadbがユーザーパスワードを更新します:https://www.techonthenet.com/mariadb/change_password.php