MySQL で「Access denied for user」でログインできない
Access denied はユーザー・ホスト・パスワードの組み合わせが権限テーブルの定義と一致しないと出る。
localhost と 127.0.0.1 が別扱いになる点やソケット接続の落とし穴を確認して合わせる。
公開:
要約
「ERROR 1045 (28000): Access denied for user」は、指定したユーザー・ホスト・パスワードの組み合わせが権限テーブルの定義と一致しないと出る。
パスワード誤りだけが原因ではない。'app'@'localhost' と 'app'@'%' は別アカウント扱いになる点、localhost 指定時はソケット接続になる点が大きな落とし穴。
よくある原因
- パスワード誤り、または期待と違うアカウントに接続している。
- ホスト部の不一致:
'user'@'localhost'と'user'@'127.0.0.1'/'user'@'%'は別物。 - ソケット経由の接続で、想定と違うアカウント(匿名ユーザー等)に当たっている。
解決策
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 公式の接続トラブルシュート(新しいタブで開く) が詳しい。