タイトル: CSVエクスポート時に「ERROR 1045 (28000): Access denied for user 'username'@'localhost'」エラーが表示される
SEOタイトル: MySQL ERROR 1045 Access denied の 6 つの原因と GRANT / 認証プラグイン対処
| この記事の要点 |
|
このエラーの概要
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 エクスポート系ツール(mysqldump、mysqlpump)は ~/.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— ホスト到達不可、ファイアウォール