タイトル: ERROR 1698 (28000): Access denied for user 'root'@'localhost'
SEOタイトル: ERROR 1698 (28000): Access denied for user 'root'@'localhost' 対処
| この記事の要点 |
|
エラー内容
mysql -u root -p でログインしようとすると、正しいパスワードを入力しても次のエラーで弾かれます。
ERROR 1698 (28000): Access denied for user 'root'@'localhost'
phpMyAdmin や Laravel・Django などのアプリから root で接続しようとした場合も、同じ理由で接続できません。
原因: root の認証方式が auth_socket になっている
MySQL ではユーザーごとに認証プラグイン(認証方式)が設定されています。Ubuntu や Debian のパッケージ(apt)で MySQL をインストールすると、root ユーザーは auth_socket プラグインで作成されます。
auth_socket は「接続してきた OS のユーザー名と MySQL のユーザー名が一致すれば、パスワードなしでログインを許可する」方式です。逆に言えば、一般ユーザー(例: ubuntu)のシェルから -u root を指定しても、OS ユーザー名が root ではないため、パスワードが合っていても拒否されます。
| エラー | 主な原因 |
|---|---|
| ERROR 1698 (28000) | auth_socket(MariaDB では unix_socket)の root に、OS の root 以外からログインしようとした |
| ERROR 1045 (28000) | パスワードの誤り、ユーザーやホストの指定違い、権限不足 |
パスワードの入力ミスであれば通常は 1045 になります。1698 が出る場合は、まず認証方式を疑ってください。
対処法 1: sudo でログインする(最短)
OS の root 権限で mysql コマンドを実行すれば、auth_socket の条件を満たすのでログインできます。
sudo mysql
# または
sudo mysql -u root -p
-p を付けた場合もパスワードを聞かれますが、auth_socket の root では入力内容に関係なくログインできます。サーバーの管理作業だけなら、この運用で問題ありません。
対処法 2: アプリ用のユーザーを作る(推奨)
アプリや phpMyAdmin からパスワードで接続したい場合は、root を使わず専用ユーザーを作るのが安全です。sudo mysql でログインしてから実行します。
CREATE USER 'appuser'@'localhost' IDENTIFIED BY '強力なパスワード';
GRANT ALL PRIVILEGES ON mydb.* TO 'appuser'@'localhost';
付与する権限は、アプリが使うデータベース(この例では mydb)に限定するのが基本です。phpMyAdmin で全 DB を管理したい場合は ON *.* に WITH GRANT OPTION を付けた管理用ユーザーを作ります。
対処法 3: root をパスワード認証に変更する
どうしても root にパスワードでログインしたい場合は、認証プラグインを変更します。MySQL 8.0 以降では既定の caching_sha2_password を指定します。
ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY '新しいパスワード';
古い解説記事では mysql_native_password を指定する例が多く見られますが、このプラグインは MySQL 8.0.34 で非推奨になり、8.4 では既定で無効、9.0 で削除されています(2026 年時点)。古いクライアントライブラリとの互換性が必要な場合を除き、使わない方がよいでしょう。
MariaDB(10.4 以降)では root が unix_socket 認証になっており、ソケット認証とパスワード認証を併用する設定もできます。
ALTER USER 'root'@'localhost' IDENTIFIED VIA unix_socket OR mysql_native_password USING PASSWORD('新しいパスワード');
なお、root をパスワード認証に変えると、sudo mysql だけではログインできなくなり、OS の保守スクリプトが root でのソケット接続を前提にしている場合に影響が出ることがあります。対処法 2 で済むなら、そちらを優先してください。
確認方法
各ユーザーの認証方式は次の SQL で確認できます。
SELECT user, host, plugin FROM mysql.user;
+------------------+-----------+-----------------------+
| user | host | plugin |
+------------------+-----------+-----------------------+
| root | localhost | auth_socket |
| appuser | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+
root の plugin が auth_socket なら sudo でのログインが必要です。設定を変えたあとは、一度ログアウトして一般ユーザーのシェルから mysql -u appuser -p のように接続できるか確かめます。
よくある質問
インストール直後で root のパスワードを設定した覚えがない
apt でインストールした場合、root はパスワードなしの auth_socket で作られているため、設定した覚えがないのが正常です。sudo mysql でログインしてください。mysql_secure_installation を実行しても、root の認証方式は auth_socket のまま変わらないことがあります。
Docker の MySQL でも出る?
公式の Docker イメージでは root は環境変数 MYSQL_ROOT_PASSWORD で指定したパスワード認証になるため、通常このエラーは出ません。出る場合は 1045 側の原因(パスワードやホスト指定)を確認してください。