MySQLのエラー『エラー1045: Access Denied』の解決方法

MySQLのエラー『エラー1045: Access Denied』の解決方法

MySQLの「ERROR 1045 (28000): Access denied for user」は、ユーザーがMySQLにログインしようとした際に認証に失敗したときに表示されるエラー。ユーザー名・パスワードの間違いやホスト制限、ユーザー権限の設定ミスなどが原因で発生する。正しい資格情報を使ってもアクセスできない場合、ユーザーの作成方法や接続先のホスト情報を再確認する必要がある。

1. エラーメッセージの確認と意味

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

このメッセージには以下の情報が含まれる:

  • ユーザー名(例:’user’)
  • 接続元ホスト(例:’localhost’)
  • パスワード使用の有無(YES/NO)

2. パスワードの誤り

最も多い原因は、単純にパスワードが間違っているケース。

mysql -u user -p

再入力の際は、Caps Lockや全角英数などの入力ミスも注意。

3. ホスト制限による拒否

MySQLでは、同じユーザーでも接続元ホストごとに別ユーザーとみなされる。

-- user@localhost と user@'%' は別ユーザーとして管理される
SELECT user, host FROM mysql.user;

リモート接続を許可したい場合:

GRANT ALL PRIVILEGES ON *.* TO 'user'@'%' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;

4. ユーザーが存在しない

対象のユーザーがそもそも作成されていない場合もある。

SELECT user, host FROM mysql.user WHERE user = 'user';

なければ以下のように作成する:

CREATE USER 'user'@'localhost' IDENTIFIED BY 'password';

5. 権限が不十分

ユーザーに接続権限が与えられていない場合にもこのエラーは発生する。

GRANT ALL PRIVILEGES ON *.* TO 'user'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;

必要な範囲で権限を絞ることも重要。

6. MySQLの認証プラグインの違い

MySQL 8.0以降では `caching_sha2_password` がデフォルト認証方式になっており、古いクライアントからの接続でエラーが出ることがある。

ALTER USER 'user'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
FLUSH PRIVILEGES;

7. rootユーザーでのログインに失敗する場合

初期インストール直後や環境構築中に、rootでログインできなくなるケース。

Linuxの場合、`–skip-grant-tables` オプションで起動してパスワードを再設定する:

  1. MySQLを停止
  2. 以下で起動:
mysqld_safe --skip-grant-tables &
  1. パスワードの再設定:
UPDATE mysql.user SET authentication_string = PASSWORD('newpass') WHERE user = 'root';
FLUSH PRIVILEGES;
  1. MySQLを再起動し、通常ログイン可能か確認。

8. クライアントライブラリの違い

古いMySQLクライアント(PHP 5系やMySQL Connector 5系)では、MySQL 8.0の認証に対応していないことがある。その場合はMySQL側の認証方式を変更するか、クライアント側をアップデートする。

9. DockerやWAMP/MAMP環境での注意点

ローカル環境で `localhost` ではなく `127.0.0.1` を指定しないと接続できない場合もある。

mysql -u root -p -h 127.0.0.1

Dockerでは以下のように `network` オプションの確認も必要。

10. パスワードを忘れた場合のリセット方法

サーバー管理権限がある場合、以下の手順で再設定できる:

  1. MySQLを停止
  2. --skip-grant-tables で起動
  3. 任意のユーザーのパスワードを変更:
UPDATE mysql.user SET authentication_string=PASSWORD('newpass') WHERE User='user';
FLUSH PRIVILEGES;

11. 特定のアプリケーションからのみ失敗する場合

CLIからの接続は成功しても、アプリケーション(例:Laravel, WordPress)からは失敗することがある。その場合は設定ファイル(`.env` や `wp-config.php`)の資格情報、ポート、ソケットなどを確認。

12. 設定ファイルの再確認

`my.cnf` や `.my.cnf` に記載された設定が間違っていることもある。

[client]
user=root
password=yourpassword

自動ログインを避けるため、設定ファイルの内容や権限も確認しておく。