前置き
mysqlコマンドではちゃんとログインできるのに、何故かphpMyAdminではPermission deniedでログインできないことがありました。(勿論、同じユーザ + パスワードを利用)
さらに言うとmysqld.sockもちゃんとあるし、
mysqld.sockの所有者、パーミッションも適切(660)な状態。
# ls -l /var/run/mysqld/mysqld.sock
srwxrwxrwx 1 mysql mysql 0 Sep 13 08:35 /var/run/mysqld/mysqld.sock
切り分けとして、mysqlではログインできてるということから、phpMyAdminの設定がおかしいぞ、という予測は立てられたけど、結構ハマったので解決法をメモ。
phpMyAdminの設定を変更
phpMyAdmin設定ファイルを変更します。
設定ファイルは、自分の環境の場合、以下にありました。
/etc/phpmyadmin/config.inc.php
このファイルの以下要素を変更。
/* Authentication type */
$cfg['Servers'][$i]['auth_type'] = 'cookie';
/* Server parameters */
$cfg['Servers'][$i]['host'] = '127.0.0.1';
$cfg['Servers'][$i]['port'] = '3306';
auth_type
の設定元々コメントアウトされてたので解除。
クッキーを使って認証情報を保存し、セッションを管理する指定のようです。
この設定は、最も一般的なphpMyAdminの認証方式らしいので改めて指定。
phpMyAdminが意図したMySQLサーバーに接続するための指定。
値を明示した方がより確実っぽいので指定。
上記実行の上、再度phpMyAdminに接続すると「サーバの選択:」プルダウン項目が出現。
「127.0.0.1:3306」を選択して、ユーザ名、パスワードを入れることで無事ログイン…!!
Access denied for user ‘ユーザ名’@‘localhost’
もしかしたらこれでもログインできず、だけど、エラーの種類が変わる場合があります。
Access denied for user ‘ユーザ名’@‘localhost’と出てます。
このエラーの場合、ユーザー(上記キャプチャでいうrootユーザ)の認証方式を確認する必要があります。
どうやらMySQL 8.0以降では、 auth_socket プラグインを使用していることがあり、このプラグインは、ユーザ認証をパスワードではなく、システムのUNIXソケットを使って認証されるようになっているそうです。
その場合、phpMyAdmin のような外部ツールからパスワードを使ってログインすることができなくなっているようです。
なので、対象のユーザに対し、パスワードで認証できるような設定が必要です。
mysqlにコマンドでログインして確認します
mysql -u ユーザ名 -p
で、以下クエリで対象ユーザの状態を確認します。
mysql> SELECT user, host, plugin FROM mysql.user WHERE user = 'ユーザ名';
+------+-----------+-------------+
| user | host | plugin |
+------+-----------+-------------+
| ユーザ名 | localhost | auth_socket |
+------+-----------+-------------+
1 row in set (0.00 sec)
auth_socketになってました。。
認証方式を以下クエリで変更、更新します。
ALTER USER 'ユーザ名'@'localhost' IDENTIFIED WITH mysql_native_password BY 'ユーザ名';
FLUSH PRIVILEGES;
これで改めて確認してみると、、、
mysql> SELECT user, host, plugin FROM mysql.user WHERE user = 'ユーザ名';
+------+-----------+-----------------------+
| user | host | plugin |
+------+-----------+-----------------------+
| ユーザ名 | localhost | mysql_native_password |
+------+-----------+-----------------------+
mysql_native_passwordになってることが確認できます。
この状態で改めてphpMyAdminにログインしてみてください。(きっとログインできるようになっているはず)