ERROR 1698 (28000) と ERROR 1045 (28000) の「Access denied for user」は、MySQL がユーザーを認証できなかったときに出るエラーです。 番号で原因の系統が分かれます。

エラー 意味 多い原因
ERROR 1698 (28000): Access denied for user 'root'@'localhost' パスワードではなく、OSのユーザーで認証する方式(auth_socket)のアカウントに、合わない方法で接続した Ubuntu・Debian の apt で入れた MySQL の root。sudo mysql なら入れる
ERROR 1045 (28000): Access denied for user 'app'@'localhost' (using password: YES) パスワードが合わない パスワード違い、別のホストのアカウントと取り違えている
ERROR 1045 (28000): ... (using password: NO) パスワードを渡していない -p の付け忘れ、設定ファイルの書き漏れ
Host '...' is not allowed to connect to this MySQL server 接続元のホストに合うアカウントが1つも無い アカウントを 'app'@'localhost' だけで作っている

エラー文の 'ユーザー'@'ホスト' は、MySQL から見た「誰が、どこから」接続しようとしたかです。ここを読むと、ほとんどの原因が分かります。

確認環境:Ubuntu 24.04、MySQL 8.0.46(apt でインストール)(確認日 2026年10月10日)。OS の root ユーザーと一般ユーザー、ローカル接続と TCP 接続、別のネットワークからの接続で再現しました。

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「MySQL Access denied for user rootの直し方」

まずアカウントの一覧と認証方式を見る

-- sudo mysql で入って実行
SELECT user, host, plugin FROM mysql.user ORDER BY user, host;
+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| debian-sys-maint | localhost | caching_sha2_password |
| root             | localhost | auth_socket           |   ← パスワードではなく OS のユーザーで認証
+------------------+-----------+-----------------------+
plugin の値 認証のしかた
auth_socket OS のユーザー名と MySQL のユーザー名が同じなら、パスワードなしで入れる(ソケット接続のみ)
caching_sha2_password パスワード(MySQL 8.0 の既定)
mysql_native_password パスワード(以前の方式。MySQL 8.4 では既定で無効、9.0 で削除)

ERROR 1698:Ubuntu の root は「sudo mysql」で入る

Ubuntu・Debian の apt で入れた MySQL では、root が auth_socket になっています。同じ mysql -u root でも、誰が・どう接続したかで結果が変わりました。

== OS の root ユーザー(sudo)で、ソケット接続
$ sudo mysql -u root
mysql> SELECT USER(), CURRENT_USER();
| root@localhost | root@localhost |          ← 入れた

== OS の一般ユーザー(dev)で
$ mysql -u root
ERROR 1698 (28000): Access denied for user 'root'@'localhost'

== パスワードを付けても
$ mysql -u root -pxxx
ERROR 1698 (28000): Access denied for user 'root'@'localhost'

== OS の root でも TCP(-h 127.0.0.1)で接続すると
$ sudo mysql -u root -h 127.0.0.1
ERROR 1698 (28000): Access denied for user 'root'@'localhost'

auth_socket は、OS のユーザー名で本人を確認する方式なので、OS の root(sudo)で、ソケット(-h なし)で接続したときだけ通ります。アプリや DB ツール(TCP で接続する)からは、root では入れません。

直し方:root は変えずに、管理用のユーザーを作る(おすすめ)

-- sudo mysql で入って
CREATE USER 'admin'@'localhost' IDENTIFIED BY '強いパスワード';
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost' WITH GRANT OPTION;

-- アプリ用は、使う DB だけに権限を絞る
CREATE USER 'app'@'localhost' IDENTIFIED BY '強いパスワード';
GRANT ALL PRIVILEGES ON appdb.* TO 'app'@'localhost';
$ mysql -u admin -p      ← 一般ユーザーからパスワードで入れた
mysql> SELECT CURRENT_USER();
| admin@localhost |

root をパスワード認証にする方法と、その副作用

root そのものをパスワードで入れるようにもできます。

ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY '強いパスワード';

確認環境では、これで一般ユーザーから mysql -u root -p で入れるようになりましたが、代わりに sudo mysql(パスワードなし)では入れなくなりました(ERROR 1045 ... (using password: NO))。サーバーの保守の手順やスクリプトが sudo mysql を前提にしていることがあるため、root は auth_socket のまま、管理用ユーザーを別に作るほうが安全です。

ERROR 1045:パスワード違いと、アカウントの取り違え

$ mysql -u app -pwrong
ERROR 1045 (28000): Access denied for user 'app'@'localhost' (using password: YES)
$ mysql -u app
ERROR 1045 (28000): Access denied for user 'app'@'localhost' (using password: NO)

using password: NO なら、パスワードを渡していません。-p の付け忘れのほか、設定ファイル(~/.my.cnf など)に書いたパスワードが使われている・使われていないことも原因になります。設定ファイルを読まずに試すなら、mysql --no-defaults -u app -p です。

'app'@'%' と 'app'@'localhost' は別のアカウント

MySQL のアカウントは「ユーザー名」と「ホスト」の組です。同じ app でも、'app'@'%' と 'app'@'localhost' は別のアカウントで、パスワードも別です。両方あるとき、ローカルから接続するとより具体的な 'app'@'localhost' が選ばれます。

CREATE USER 'app'@'%'         IDENTIFIED BY 'Pass-Percent1';
CREATE USER 'app'@'localhost' IDENTIFIED BY 'Pass-Local1';
$ mysql -u app -pPass-Percent1          ← '%' のパスワードでローカルから
ERROR 1045 (28000): Access denied for user 'app'@'localhost' (using password: YES)

$ mysql -u app -pPass-Local1
mysql> SELECT USER(), CURRENT_USER();
| app@localhost | app@localhost |

「'app'@'%' を作ったのに入れない」の多くは、このパターンです。SELECT user, host FROM mysql.user で同じユーザー名が複数ないかを確認します。

関数 返すもの
USER() 接続しようとした「ユーザー名@接続元」
CURRENT_USER() 実際に使われたアカウント(mysql.user の行)。app@% なら '%' のアカウントで入っている

接続元のホストがずれている

別のマシン(ここでは Docker のネットワーク経由)から接続すると、エラー文のホストの部分が localhost ではなく、MySQL から見た接続元の IP アドレスになりました。

$ mysql -h 172.17.0.1 -u onlylocal -px          ← 'onlylocal'@'localhost' しか無いユーザー
ERROR 1045 (28000): Access denied for user 'onlylocal'@'192.0.2.2' (using password: YES)

$ mysql -h 172.17.0.1 -u app -pPass-Percent1
mysql> SELECT USER(), CURRENT_USER();
| app@192.0.2.2 | app@% |                       ← '%' のアカウントで入った

エラー文のホスト(192.0.2.2)に合うアカウントがあるかを確認します。アプリのサーバーやコンテナから接続するなら、そのホスト(またはネットワークの範囲)のアカウントを作ります。

CREATE USER 'app'@'192.168.10.%' IDENTIFIED BY '強いパスワード';   -- 社内ネットワークの範囲だけ
GRANT ALL PRIVILEGES ON appdb.* TO 'app'@'192.168.10.%';

'%'(どこからでも)は手軽ですが、どこからでもパスワードを試せる状態になります。接続元を絞り、ファイアウォールとあわせて使います。どのホストのアカウントも無いときは、Host '...' is not allowed to connect to this MySQL server という別の表示になります。

パスワードを忘れたとき

管理用のユーザーでも入れない場合は、MySQL を「権限の確認をしないモード」で一時的に起動して、パスワードを設定し直します(MySQL 公式マニュアルの手順)。

sudo systemctl stop mysql
sudo mysqld_safe --skip-grant-tables --skip-networking &   # 権限の確認をせず、ネットワークも閉じて起動
mysql -u root
FLUSH PRIVILEGES;                                    -- 権限の表を読み込み直す(ALTER USER を使うため)
ALTER USER 'admin'@'localhost' IDENTIFIED BY '新しいパスワード';
sudo mysqladmin shutdown      # 止めて
sudo systemctl start mysql    # 通常どおり起動し直す

この間は誰でもパスワードなしで入れる状態なので、作業はすばやく終え、必ず通常の起動に戻します。Ubuntu の root(auth_socket)なら、OS の root で sudo mysql と入れるので、この手順は要りません。

Docker の MySQL で入れないとき

公式の MySQL イメージの MYSQL_ROOT_PASSWORD などの環境変数は、データの保存先に既存のデータベースがあると効きません。一度起動したあとに docker-compose.yml のパスワードを変えても、以前のパスワードのままです。

状況 直し方
環境変数のパスワードを変えた 以前のパスワードで入る。または、データを消してよいならボリュームを削除して作り直す(docker compose down -v)
アプリのコンテナから入れない 接続先のホストは localhost ではなくサービス名。ユーザーは 'app'@'%' など、コンテナのネットワークから入れるホストで作る

確認の手順(チェックリスト)

順番 確認すること 方法
1 エラーの番号 1698 なら認証方式(auth_socket)、1045 ならパスワード・アカウント
2 エラー文の 'ユーザー'@'ホスト' MySQL から見た接続元。localhost か IP アドレスか
3 アカウントの一覧と認証方式 SELECT user, host, plugin FROM mysql.user
4 同じユーザー名が複数ないか 'app'@'%' と 'app'@'localhost'
5 using password: NO なら -p と設定ファイル(--no-defaults で確認)
6 Docker なら 既存のデータで環境変数が効いていないか

よくある質問

Q. インストール直後なのに、root のパスワードを聞かれて入れません。 A. Ubuntu・Debian の apt 版なら、root はパスワードではなく sudo mysql で入ります(ERROR 1698)。インストーラーでパスワードを設定する版(Windows・公式の配布など)なら、そのとき設定したパスワードです。

Q. MySQL Workbench や A5:SQL Mk-2 から root で入れません。 A. これらのツールは TCP で接続するため、auth_socket の root では入れません。管理用のユーザーをパスワード認証で作って接続します。

Q. 権限を変えたのに反映されません。 A. CREATE USER・GRANT・ALTER USER は、すぐに反映されます。mysql.user を INSERT や UPDATE で直接書き換えた場合だけ、FLUSH PRIVILEGES が要ります。

まとめ

  • 1698 は認証方式(auth_socket)。Ubuntu の root は sudo mysql で入る。アプリ用・管理用は別のユーザーを作る
  • 1045 はパスワードかアカウントの取り違え。using password: NO は -p の付け忘れ
  • エラー文の 'ユーザー'@'ホスト' を読む。'app'@'%' と 'app'@'localhost' は別アカウント
  • USER() と CURRENT_USER() で、どのアカウントで入ったかを確かめる
  • root をパスワード認証に変えると sudo mysql が使えなくなる。管理用ユーザーを作るほうが安全
  • Docker の MYSQL_ROOT_PASSWORD は、既存のデータがあると効かない

参考・出典

確認日はいずれも 2026年10月10日です。

  • MySQL 8.0 Reference Manual「Troubleshooting Problems Connecting to MySQL」:https://dev.mysql.com/doc/refman/8.0/en/problems-connecting.html
  • MySQL 8.0 Reference Manual「How to Reset the Root Password」:https://dev.mysql.com/doc/refman/8.0/en/resetting-permissions.html
  • Docker Hub「mysql(Official Image)」:https://hub.docker.com/_/mysql

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「MySQL Access denied for user rootの直し方」

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?