できない.dev

MySQL で「Access denied for user」でログインできない

Access denied はユーザー・ホスト・パスワードの組み合わせが権限テーブルの定義と一致しないと出る。
localhost と 127.0.0.1 が別扱いになる点やソケット接続の落とし穴を確認して合わせる。

公開: 更新:

実行例あり(2026-09-20 に実環境で検証)

要約

「ERROR 1045 (28000): Access denied for user」は、指定したユーザー・ホスト・パスワードの組み合わせが権限テーブルの定義と一致しないと出る。

パスワード誤りだけが原因ではない。'app'@'localhost' と 'app'@'%' は別アカウント扱いになる点、localhost 指定時はソケット接続になる点が大きな落とし穴。

実行例

mysql:8.4 で試すと、同じパスワードでも -h 127.0.0.1 を付けたときだけ接続でき、省いたときは 'app'@'localhost' として拒否された。
ホスト部分ごとに別のアカウントとして扱われていることは、ユーザー一覧と CURRENT_USER() の値から読み取れる。'app'@'localhost' を作って権限を付けた後は、-h を省いた同じ接続も app@localhost として通っている。

$ mysql -u app -pwrongpass -h 127.0.0.1 mydb -e 'SELECT 1'
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'app'@'127.0.0.1' (using password: YES)
$ echo $?
1
$ mysql -u app -pyourpassword mydb -e 'SELECT 1'
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'app'@'localhost' (using password: YES)
$ echo $?
1
$ mysql -u root -t < list_users.sql
+------+-----------+-----------------------+
| user | host      | plugin                |
+------+-----------+-----------------------+
| app  | 127.0.0.1 | caching_sha2_password |
| root | localhost | caching_sha2_password |
+------+-----------+-----------------------+
$ mysql -u app -pyourpassword -h 127.0.0.1 -P 3306 mydb -t -e 'SELECT CURRENT_USER()'
mysql: [Warning] Using a password on the command line interface can be insecure.
+----------------+
| CURRENT_USER() |
+----------------+
| app@127.0.0.1  |
+----------------+
$ echo $?
0
$ mysql -u root -v < grant_localhost.sql
--------------
CREATE USER 'app'@'localhost' IDENTIFIED BY 'yourpassword'
--------------
 
--------------
GRANT ALL PRIVILEGES ON mydb.* TO 'app'@'localhost'
--------------
 
--------------
FLUSH PRIVILEGES
--------------
$ mysql -u app -pyourpassword mydb -t -e 'SELECT CURRENT_USER()'
mysql: [Warning] Using a password on the command line interface can be insecure.
+----------------+
| CURRENT_USER() |
+----------------+
| app@localhost  |
+----------------+
$ echo $?
0

— 2026-09-20 時点の出力

検証環境

検証日
実行環境
mysql:8.4 Oracle Linux Server 9.8

この記事の「実行例」は、上記の環境で実際にコマンドを実行して得られた出力をそのまま掲載しています。 再現手順はリポジトリの検証スクリプトとして管理し、定期的に再実行して出力を更新しています。

よくある原因

  1. パスワード誤り、または期待と違うアカウントに接続している。
  2. ホスト部の不一致: 'user'@'localhost' と 'user'@'127.0.0.1' / 'user'@'%' は別物。
  3. ソケット経由の接続で、想定と違うアカウント(匿名ユーザー等)に当たっている。

解決策

1. 定義済みアカウントを確認する

root で入り、実際のアカウント一覧を見る。

SELECT user, host, plugin FROM mysql.user;

接続したいホスト表現(localhost / 127.0.0.1 / %)に一致する行があるか確認する。

2. 権限を付与し直す

不足していれば作成して権限を与える。

CREATE USER 'app'@'%' IDENTIFIED BY 'yourpassword';
GRANT ALL PRIVILEGES ON mydb.* TO 'app'@'%';
FLUSH PRIVILEGES;

3. 接続経路を明示する

localhost はソケット、127.0.0.1 は TCP になる。
意図した経路を指定して切り分ける。

mysql -u app -p -h 127.0.0.1 -P 3306 mydb

切り分けの手順は MySQL 公式の接続トラブルシュート(新しいタブで開く) が詳しい。

この記事は役立ちましたか?