- MySQL
- データベース
MySQL Access denied for user rootの直し方
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期連続の黒字決算。