MySQL ERROR 1045: ユーザー'root'のアクセス拒否を修正する方法

intermediate🗄️ MySQL2026-03-16| Linux (Ubuntu/Debian, CentOS/RHEL), MySQL 5.x, 8.x, MariaDB

Error Message

ERROR 1045 (28000): Access denied for user 'root'@'localhost'
#mysql#root#パスワード#アクセス

ERROR 1045 (28000): Access denied for user 'root'@'localhost'に遭遇すると、いら立ちを感じるかもしれません。この一般的な問題は、MySQLまたはMariaDBインスタンスに接続しようとした際に、サーバーの再起動、更新、または設定変更後に発生することがよくあります。

基本的に、このエラーはrootユーザーの認証が失敗したことを意味し、通常はパスワードの誤りまたはホスト権限の不正確さが原因です。このガイドでは、データベースへのアクセスを迅速に回復するのに役立つ即座の修正と詳細なトラブルシューティング手順を提供します。

要約: rootパスワードをリセットするクイック修正

ほとんどの場合、このエラーはrootユーザーのパスワードが間違っていることに起因します。これを解決する最も速い方法は、rootパスワードをリセットすることです。このプロセスでは、MySQLサービスを停止し、認証をバイパスするための特別なモードで再起動し、パスワードを更新し、その後サービスを通常通りオンラインに戻す必要があります。

Ubuntu/Debianベースのシステムの場合:

# 1. MySQL/MariaDBサービスを停止します
sudo systemctl stop mysql

# 2. セーフモードでMySQLを起動します (grant tablesをスキップ)
# MySQLソケット用の一時ディレクトリが存在しないか、権限が拒否されている場合は作成します
sudo mkdir -p /var/run/mysqld
sudo chown -R mysql:mysql /var/run/mysqld
sudo mysqld_safe --skip-grant-tables --skip-networking &

# サービスが起動するまで数秒待ちます
sleep 5

# 3. パスワードなしでrootとしてMySQLに接続します
mysql -u root

# MySQLプロンプト内で、パスワードを更新します:
# MySQL 8.xの場合:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourNewSecurePasswordHere';
FLUSH PRIVILEGES;

# MySQL 5.7+またはMariaDBの場合 (authentication_stringを使用):
UPDATE mysql.user SET authentication_string=PASSWORD('YourNewSecurePasswordHere') WHERE User='root' AND Host='localhost';
FLUSH PRIVILEGES;

# 古いMySQL (5.6以下) または特定のMariaDBセットアップの場合 (Passwordカラムを使用):
# UPDATE mysql.user SET Password=PASSWORD('YourNewSecurePasswordHere') WHERE User='root' AND Host='localhost';
# FLUSH PRIVILEGES;

# 4. MySQLを終了し、セーフモードプロセスを停止します
exit
sudo pkill mysqld_safe

# 5. 通常通りMySQLサービスを開始します
sudo systemctl start mysql

# 6. 修正を確認します
mysql -u root -p
# プロンプトが表示されたら「YourNewSecurePasswordHere」を入力します。

CentOS/RHELベースのシステムの場合:

# 1. MySQL/MariaDBサービスを停止します
sudo systemctl stop mysqld

# 2. セーフモードでMySQLを起動します
sudo mkdir -p /var/run/mysqld
sudo chown -R mysql:mysql /var/run/mysqld
sudo mysqld_safe --skip-grant-tables --skip-networking &

# 数秒待ちます
sleep 5

# 3. パスワードなしでrootとしてMySQLに接続します
mysql -u root

# MySQLプロンプト内 (上記と同じ):
# MySQL 8.xの場合:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourNewSecurePasswordHere';
FLUSH PRIVILEGES;

# MySQL 5.7+またはMariaDBの場合 (authentication_stringを使用):
UPDATE mysql.user SET authentication_string=PASSWORD('YourNewSecurePasswordHere') WHERE User='root' AND Host='localhost';
FLUSH PRIVILEGES;

# 4. MySQLを終了し、セーフモードプロセスを停止します
exit
sudo pkill mysqld_safe

# 5. 通常通りMySQLサービスを開始します
sudo systemctl start mysqld

# 6. 修正を確認します
mysql -u root -p
# プロンプトが表示されたら「YourNewSecurePasswordHere」を入力します。

重要: YourNewSecurePasswordHere を強力でユニークなパスワードに置き換えてください。セキュリティを最大限に高めるため、大文字と小文字、数字、記号を組み合わせた12〜16文字以上のパスワードを目指してください。

詳細な根本原因

MySQLサーバーがERROR 1045 (28000): Access denied for user 'root'@'localhost'に遭遇した場合、それは明示的に接続試行を拒否しています。これは通常、クライアントが提供した認証情報(ユーザー名、パスワード、接続ホストなど)が、MySQLの許可テーブル内のアクセスを許可するエントリと一致しないために発生します。

一般的な原因は次のとおりです:

  • パスワードの誤り: これが圧倒的に最も頻繁な原因です。多くの場合、rootユーザーのパスワードが間違っているだけかもしれません。これは、入力ミス、最近変更したパスワードを忘れた、またはパスワードの更新がアプリケーションの接続文字列に正しく反映されなかった場合に発生する可能性があります。
  • ホスト用にユーザーが設定されていない: MySQLのユーザーアカウントは、ユーザー名とホストの両方で識別されます。root@localhostは、root@192.168.1.100またはroot@%(任意のホスト)とは異なるユーザーです。リモートマシンから接続しようとしているが、rootユーザーがlocalhostにのみ定義されている場合、このエラーが発生します。
  • 破損したグラントテーブル: 頻度は低いですが、これも可能性としてはあります。mysql.userテーブル、またはその他の関連するグラントテーブルが破損しているか、重要なrootエントリが欠落している可能性があります。

修正アプローチ

パスワードのリセットが最も一般的な修正ですが、他のシナリオでもこのエラーが発生する可能性があります。これらの状況に対するより堅牢なソリューションを探ってみましょう。

1. rootパスワードのリセット (詳細)

これは、各ステップの説明を詳述した主要な修正です。

ステップ1: MySQL/MariaDBサービスを停止する

データベースサービスがクリーンに停止していることを確認してください。

# systemdベースのシステムの場合 (Ubuntu, Debian, CentOS 7+, RHEL 7+)
sudo systemctl stop mysql   # または mariadb, mysqld

# 古いシステム (SysVinit) の場合
sudo service mysql stop    # または mariadb, mysqld

ステップ2: セーフモードでMySQLを起動する (認証をバイパス)

アクセスするには、MySQLを--skip-grant-tablesオプション付きで起動する必要があります。この特別なモードでは、パスワードなしでrootとして接続できます。また、データベースがこの脆弱な状態にある間、外部からの接続を防ぐための重要なセキュリティ対策として--skip-networkingを追加します。

# /var/run/mysqld が正しいパーミッションで存在することを確認します
sudo mkdir -p /var/run/mysqld
sudo chown -R mysql:mysql /var/run/mysqld
sudo mysqld_safe --skip-grant-tables --skip-networking &

# サービスが初期化されるまで数秒待ちます
sleep 5

ステップ3: rootとしてMySQLに接続し、パスワードを更新する

パスワードなしで接続し、適切なALTER USERまたはUPDATEコマンドを実行します。

mysql -u root

MySQLプロンプト内で:

MySQL 8.0+の場合:

ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourNewSecurePassword!';
FLUSH PRIVILEGES;

MySQL 5.7+およびMariaDBの場合 (authentication_stringを使用):

UPDATE mysql.user SET authentication_string=PASSWORD('YourNewSecurePassword!') WHERE User='root' AND Host='localhost';
FLUSH PRIVILEGES;

古いMySQLバージョン (5.6以下) または特定のMariaDBセットアップの場合 (Passwordカラムを使用):

UPDATE mysql.user SET Password=PASSWORD('YourNewSecurePassword!') WHERE User='root' AND Host='localhost';
FLUSH PRIVILEGES;

YourNewSecurePassword!を強力でユニークなパスワードに置き換えることを忘れないでください。コマンドを実行後、exitと入力してMySQLプロンプトを終了します。

ステップ4: セーフモードのMySQLプロセスを停止する

安全でないmysqld_safeプロセスを終了します。

sudo pkill mysqld_safe
# 必要に応じて、PIDを検索: ps aux | grep mysql | grep 'skip-grant-tables' | awk '{print $2}' | xargs sudo kill

ステップ5: MySQLサービスを通常通り開始する

sudo systemctl start mysql   # または mariadb, mysqld

2. ホスト固有のアクセス問題への対処

リモートマシンから接続しており、rootユーザーがlocalhostにのみ定義されている場合、「アクセス拒否」エラーが発生します。MySQLのユーザーアカウントは、ユーザー名とホストの両方に紐付けられています。

任意のホスト(本番環境ではセキュリティが低いため、極度の注意を払って使用すべきです)または特定のIPアドレスからのrootアクセスを許可する必要がある場合は、以下の手順に従ってください。

まず、root@localhostとして接続できることを確認してください(必要であればパスワードをリセットしてください)。その後、MySQLクライアント内で:

任意のホスト (%) からのrootアクセスを許可 (MySQL 8.x):

ALTER USER 'root'@'localhost' IDENTIFIED WITH 'mysql_native_password' BY 'YourSuperStrongPassword!'; -- オプション: 互換性のためにプラグインを変更
CREATE USER 'root'@'%' IDENTIFIED BY 'YourSuperStrongPassword!';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;

任意のホスト (%) からのrootアクセスを許可 (MySQL 5.x / MariaDB):

UPDATE mysql.user SET Host='%' WHERE User='root' AND Host='localhost';
FLUSH PRIVILEGES;
-- ホスト変更後にパスワードのリセットが必要な場合:
-- UPDATE mysql.user SET authentication_string=PASSWORD('YourSuperStrongPassword!') WHERE User='root' AND Host='%' ;
-- FLUSH PRIVILEGES;

ベストプラクティス: リモートでrootを使用する代わりに、リモートアクセスおよび特定のアプリケーション用に、専用の、権限の低いユーザーを作成してください。

CREATE USER 'your_admin'@'your_remote_ip' IDENTIFIED BY 'StrongPassword!';
GRANT ALL PRIVILEGES ON *.* TO 'your_admin'@'your_remote_ip' WITH GRANT OPTION;
FLUSH PRIVILEGES;

3. グラントテーブルまたは欠落しているrootユーザーの確認

まれに、mysql.userテーブルが破損しているか、rootユーザーのエントリが欠落している可能性があります。セーフモードで接続し(mysql -u root)、その後:

USE mysql;
SELECT user, host, authentication_string, plugin FROM user WHERE user='root';

rootユーザーが欠落しているか、出力が破損を示している場合は、MySQLインストールのさらなる調査が必要になる可能性があります。完全なバックアップなしでのmysql_install_dbやデータディレクトリの再初期化は、データ損失につながる可能性があるため避けてください。

検証手順

修正を適用したら、正常に接続できることを確認することが不可欠です。以下に検証方法を示します:

  • サーバーからの接続を試行:
mysql -u root -p
# 新しいパスワードを入力します。

成功すると、MySQLプロンプト(mysql>)が表示されます。

  • リモートクライアントからの接続を試行(該当する場合):
mysql -h your_mysql_server_ip -u root -p
# 新しいパスワードを入力します。

  • 簡単なクエリを実行: 接続後、すべてが動作していることを確認するために基本的なクエリを実行します:
SHOW DATABASES;

これにより、接続の成功と基本的なデータベース機能の両方が確認されます。データベースがリスト表示されれば、問題を正常に解決したことになります!

さらに読む

MySQLのユーザー管理とセキュリティに関するより深い理解については、公式ドキュメントを参照してください:

Related Error Notes