16.

MySQL ERROR 1045 Access denied の 6 つの原因と GRANT / 認証プラグイン対処

編集
この記事の要点
  • ERROR 1045 (28000): Access denied for user は MySQL 認証失敗エラー
  • 主な原因 6 つ: パスワード誤り / ホスト不一致 / ユーザー未作成 / 認証プラグイン差異 / 権限不足 / my.cnf の設定誤り
  • 対処: GRANT ALL ON db.* TO "user"@"%" IDENTIFIED BY "pw"; + FLUSH PRIVILEGES;
  • caching_sha2_password(MySQL 8 既定)と mysql_native_password(旧クライアント)の互換性問題に注意
  • 確認: SELECT user, host FROM mysql.user; で実在ユーザーとホスト範囲を確認

このエラーの概要

MySQL / MariaDB に接続しようとしたときに次のメッセージが返ります:

ERROR 1045 (28000): Access denied for user 'username'@'localhost' (using password: YES)

SQLSTATE 28000 は 「無効な認可指定」を意味し、認証フェーズでサーバーがログインを拒否したことを示します。CSV エクスポートツール、phpMyAdmin、アプリケーションからの接続、いずれの場面でも発生します。

原因の切り分け

原因確認方法対処
パスワード誤りメッセージ末尾 (using password: YES)正しいパスワードで接続、リセット
ユーザー未作成SELECT user, host FROM mysql.user;CREATE USER で作成
ホスト不一致同上、host 列確認'user'@'%' で全ホスト許可、または特定 IP 指定
認証プラグイン違いSELECT user, plugin FROM mysql.user;ALTER USER ... IDENTIFIED WITH mysql_native_password
権限不足SHOW GRANTS FOR 'user'@'host';GRANT で追加
パスワードファイル誤りmy.cnf の [client] セクション正しいパスワードに書換え

対処1: ユーザー / ホストを確認

-- root で接続して確認(root 自体が拒否される場合は対処5参照)
mysql -u root -p

-- 全ユーザー一覧
SELECT user, host, plugin FROM mysql.user ORDER BY user, host;

-- 'app_user'@'localhost' で接続できないが、'app_user'@'%' は存在する場合
-- → クライアント側で別ホストから接続しているのに 'localhost' エントリでログインしようとしている

-- ホスト '%' は「任意のホスト」だが localhost を含まない MySQL 8.x の挙動に注意

対処2: ユーザー作成 / 権限付与

-- ユーザー新規作成(localhost からのみ)
CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'StrongP@ssw0rd!';

-- 任意ホストから接続可能なユーザー
CREATE USER 'app_user'@'%' IDENTIFIED BY 'StrongP@ssw0rd!';

-- 権限付与(特定 DB の全権限)
GRANT ALL PRIVILEGES ON mydb.* TO 'app_user'@'localhost';
GRANT ALL PRIVILEGES ON mydb.* TO 'app_user'@'%';

-- 反映
FLUSH PRIVILEGES;

-- 確認
SHOW GRANTS FOR 'app_user'@'localhost';

対処3: パスワードを変更(リセット)

-- MySQL 5.7+ / 8.x
ALTER USER 'app_user'@'localhost' IDENTIFIED BY 'NewP@ssw0rd!';

-- 同じ user を別ホストごとに変更
ALTER USER 'app_user'@'%' IDENTIFIED BY 'NewP@ssw0rd!';

-- 旧式
SET PASSWORD FOR 'app_user'@'localhost' = PASSWORD('NewP@ssw0rd!');  -- MySQL 5.6 まで

FLUSH PRIVILEGES;

対処4: 認証プラグインの違い(MySQL 8 でハマる)

MySQL 8.0 から既定の認証プラグインが caching_sha2_password に変わりました。古いクライアント / ライブラリは未対応で 1045 が出ます:

-- 現在のプラグイン確認
SELECT user, host, plugin FROM mysql.user WHERE user = 'app_user';
-- user      | host       | plugin
-- app_user  | localhost  | caching_sha2_password   ← これだと旧クライアントから繋がらない

-- 旧式プラグインに変更
ALTER USER 'app_user'@'localhost'
  IDENTIFIED WITH mysql_native_password BY 'StrongP@ssw0rd!';

FLUSH PRIVILEGES;

または my.cnf でサーバー既定を変更(影響範囲大):

# /etc/mysql/my.cnf または /etc/my.cnf
[mysqld]
default_authentication_plugin = mysql_native_password

対処5: root パスワード忘れ / root 自体がはじかれる

# MySQL を停止
sudo systemctl stop mysql

# セーフモード(認証スキップ)で起動
sudo mysqld_safe --skip-grant-tables --skip-networking &

# パスワード無しで root 接続
mysql -u root

# パスワード再設定
mysql> FLUSH PRIVILEGES;
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewRootPass!';
mysql> EXIT;

# 通常起動に戻す
sudo killall mysqld
sudo systemctl start mysql

# 新パスワードで接続
mysql -u root -p

対処6: クライアント設定 (my.cnf / .my.cnf) を確認

CSV エクスポート系ツール(mysqldumpmysqlpump)は ~/.my.cnf/etc/mysql/my.cnf[client] / [mysqldump] セクションを参照します:

# ~/.my.cnf  ← 個人用
[client]
user     = app_user
password = StrongP@ssw0rd!
host     = localhost

[mysqldump]
user     = backup_user
password = BackupP@ss!
# パーミッション 600 が必須
chmod 600 ~/.my.cnf

# 設定ファイルを明示指定
mysqldump --defaults-file=~/.my.cnf mydb > backup.sql

# 設定ファイル無視
mysqldump --no-defaults -u app_user -p mydb > backup.sql

typical な接続例

# 基本
mysql -u app_user -p mydb
# Enter password: ********

# ホスト・ポート指定
mysql -h 192.168.1.10 -P 3306 -u app_user -p mydb

# SSL 接続
mysql --ssl-mode=REQUIRED -u app_user -p -h db.example.com

# SOCKET 経由(localhost のみ)
mysql -S /var/run/mysqld/mysqld.sock -u root -p

FAQ

Q: 'user'@'%' を作ったのに localhost から繋がらない
A: MySQL では 'user'@'localhost''user'@'%' は別エントリ扱い。localhost 接続では UNIX ソケット経由で localhost エントリが優先されます。両方作るか、明示的に -h 127.0.0.1 を使うと TCP 経由となり % がマッチします。

Q: パスワード正しいのに 1045 が出続ける
A: 1) パスワード末尾のスペース、2) 認証プラグインの違い、3) ホスト名解決の失敗(DNS)、4) MySQL の skip-name-resolve 設定、を順に確認。

Q: phpMyAdmin で 1045
A: config.inc.php$cfg['Servers'][$i]['host']['user']['password'] を確認。host = 'localhost''127.0.0.1' で挙動が変わるので注意。

関連エラー

  • ERROR 1044 (42000): Access denied for user ... to database — DB 単位の権限不足、GRANT で対処
  • ERROR 2002 (HY000): Can't connect to local MySQL server through socket — MySQL 自体が起動していない
  • ERROR 2003 (HY000): Can't connect to MySQL server — ホスト到達不可、ファイアウォール
編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. 1071 Specified key was too long; max key length is 767 bytes
  2. ERROR 1063 (42000): Incorrect column specifier for column '~'
  3. mysqld: Can't change dir to '...\MySQL\MySQL Server X.X\data\' (OS errno 2 - No such file or directory)
  4. Install/Remove of the Service Denied!
  5. Datetime 型が NULL に見える
  6. Warning: World-writable config file '/etc/mysql/my.cnf' is ignored
  7. ERROR 1698 (28000): Access denied for user 'root'@'localhost'
  8. Exception: Wrong MySQL configuration
  9. [Warning] TIMESTAMP with implicit DEFAULT value is deprecated.
  10. ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
  11. ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
  12. Incorrect column specifier for column 'カラム名'
  13. BLOB/TEXT column 'description' used in key specification without a key length
  14. ERROR: /bin/sh: mysql_config: コマンドが見つかりません
  15. Host '...' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'
  16. CSVエクスポート時に「ERROR 1045 (28000): Access denied for user 'username'@'localhost'」エラーが表示される
  17. Cannot execute statement: impossible to write to binary log since BINLOG_FORMAT = STATEMENT
  18. 1
  19. 1
  20. 1)
  21. 1
  22. 1
  23. 1
  24. 1
  25. 1
  26. 1
  27. 1
  28. 1
  29. 1
  30. 1
  31. 1
  32. 1
  33. 1"'`--
  34. 1
  35. 1
  36. 1
  37. 1
  38. 1
  39. 1
  40. 1
  41. 1
  42. 1
  43. 1)
  44. 1
  45. 1
  46. 1
  47. 1
  48. 1
  49. 1
  50. 1
  51. 1
  52. 1
  53. 1"'`--
  54. 1
  55. 1
  56. SQLSTATE[22007]: Invalid datetime format: 1366 Incorrect string value: ~