MySQL「Access denied for user ‘root’@’localhost’」の原因と解決方法|パスワードリセット完全ガイド

MySQL「Access denied for user ‘root’@’localhost’」の原因と解決方法|パスワードリセット完全ガイド

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

MySQL に root でログインしようとしたときに出るこのエラー。パスワードが本当に間違っているのか、認証方式の問題なのかで対処が大きく変わります。

本記事では以下の疑問に答えます。

  • using password: YESNO の違い
  • パスワードを忘れた場合のリセット手順
  • auth_socket 認証が原因のケースの見分け方と対処
  • Docker・Ubuntu・macOS それぞれでの対処法
  • root パスワードを二度と忘れないための運用


目次

結論:先に答えを出す

# ① まずパスワードなしでログインを試す(auth_socket の可能性)
sudo mysql -u root

# ② ログインできたらパスワード認証に変更
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新しいパスワード';
FLUSH PRIVILEGES;

# ③ パスワードを忘れてログインもできない場合:skip-grant-tables でリセット
sudo systemctl stop mysql
sudo mysqld_safe --skip-grant-tables --skip-networking &
mysql -u root
-- リセット用 SQL(MySQL 5.7以降)
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY '新しいパスワード';
FLUSH PRIVILEGES;
EXIT;
# skip-grant-tables を解除して再起動
sudo systemctl stop mysql
sudo systemctl start mysql
mysql -u root -p

エラーメッセージの読み方

Access denied for user 'root'@'localhost' (using password: YES)
                                            ^^^^^^^^^^^^^^^^^^^^^
                                            パスワードを入力した(が間違っている)

Access denied for user 'root'@'localhost' (using password: NO)
                                            ^^^^^^^^^^^^^^^^^^^^
                                            パスワードを入力していない
                                            (`mysql -u root` で接続を試みた)
メッセージ意味主な原因
using password: YESパスワードを送信したが拒否されたパスワード間違い・ユーザー設定の問題
using password: NOパスワードなしで接続を試みて拒否された-p を付け忘れた・認証方式の誤解

原因パターン一覧

パターン1:単純にパスワードを間違えている
パターン2:パスワードを完全に忘れた
パターン3:auth_socket 認証になっていて -p では入れない(Ubuntu に多い)
パターン4:root@localhost と root@% の混同
パターン5:MySQL のインストール直後(初期パスワードの取得忘れ)
パターン6:権限テーブル(mysql.user)の破損

Step 1:まず原因を切り分ける

auth_socket 認証かどうかを確認する(Ubuntu で最頻出)

Ubuntu の MySQL(特に apt install mysql-server でインストールした場合)は、root ユーザーがデフォルトで auth_socket 認証になっていることが多く、パスワードではなく Linux の OS ユーザーで認証します。

# sudo を付けて OS の root(または対象ユーザー)として接続してみる
sudo mysql -u root
# ログインできれば auth_socket 認証が原因

ログインできた場合:

-- 認証方式を確認
SELECT user, host, plugin FROM mysql.user WHERE user='root';
+------+-----------+-----------------------+
| user | host      | plugin                |
+------+-----------+-----------------------+
| root | localhost | auth_socket            |  ← これが原因
+------+-----------+-----------------------+

auth_socket の場合、mysql -u root -p でパスワードを使ってログインすることはできません。sudo mysql -u root で OS のroot権限を使ってログインするか、認証方式をパスワード認証に変更する必要があります。


パターン1・2:パスワードが分からない・忘れた場合

方法A:sudo でログインできる場合(auth_socket)

sudo mysql -u root
-- パスワード認証に変更
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新しいパスワード';
FLUSH PRIVILEGES;
EXIT;
# 確認
mysql -u root -p
# パスワードを入力してログインできれば成功

方法B:sudo でもログインできない場合(skip-grant-tables)

最も確実なパスワードリセット方法です。

# Step 1:MySQL を停止
sudo systemctl stop mysql
# または
sudo systemctl stop mysqld    # CentOS/RHEL系

# Step 2:権限チェックを無効化して起動
sudo mysqld_safe --skip-grant-tables --skip-networking &

# 起動に少し時間がかかる場合があるので数秒待つ
sleep 3
# Step 3:パスワードなしで接続
mysql -u root
-- Step 4:権限テーブルをリロード(必須)
FLUSH PRIVILEGES;

-- Step 5:パスワードを再設定
-- MySQL 5.7.6 以降
ALTER USER 'root'@'localhost' IDENTIFIED BY '新しいパスワード';

-- MySQL 5.7.5 以前・MariaDB の場合
-- SET PASSWORD FOR 'root'@'localhost' = PASSWORD('新しいパスワード');

FLUSH PRIVILEGES;
EXIT;
# Step 6:MySQL を通常モードで再起動
sudo mysqladmin -u root -p shutdown
# または skip-grant-tables のプロセスを直接終了
sudo pkill mysqld
sleep 2

sudo systemctl start mysql

# Step 7:新しいパスワードでログイン確認
mysql -u root -p

MySQL 8.0 でよくあるエラー:ALTER USER が失敗する場合

-- ❌ skip-grant-tables モードでは ALTER USER が失敗することがある
ALTER USER 'root'@'localhost' IDENTIFIED BY 'newpassword';
-- ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option

-- ✅ 先に FLUSH PRIVILEGES を実行してから ALTER USER する
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY 'newpassword';

MariaDB での違い

# MariaDB の場合はサービス名が異なることがある
sudo systemctl stop mariadb
sudo mysqld_safe --skip-grant-tables --skip-networking &

mysql -u root
-- MariaDB 10.4 以降
ALTER USER 'root'@'localhost' IDENTIFIED BY '新しいパスワード';
FLUSH PRIVILEGES;

パターン3:root@localhost と root@% の混同

MySQL のユーザーは ユーザー名@ホスト の組み合わせで管理されます。root@localhost(ローカル接続用)と root@%(リモート接続用)は別のユーザーとして扱われ、別々のパスワードを持つことがあります。

確認方法

-- root に紐づくすべてのホストパターンを確認
SELECT user, host, plugin FROM mysql.user WHERE user='root';
+------+-----------+-----------------------+
| user | host      | plugin                |
+------+-----------+-----------------------+
| root | localhost | mysql_native_password  |
| root | %         | mysql_native_password  |
+------+-----------+-----------------------+

localhost での接続と 127.0.0.1 での接続も別ユーザー扱いになることがあるため注意が必要です。

# これらは内部的に異なるユーザーとして扱われる可能性がある
mysql -u root -h localhost -p   # root@localhost
mysql -u root -h 127.0.0.1 -p   # root@127.0.0.1(別ユーザー扱いのことがある)

解決方法

-- root@localhost のパスワードを変更
ALTER USER 'root'@'localhost' IDENTIFIED BY 'パスワード';

-- root@% のパスワードも別途変更が必要な場合がある
ALTER USER 'root'@'%' IDENTIFIED BY 'パスワード';

FLUSH PRIVILEGES;

パターン4:MySQL インストール直後(初期パスワード)

MySQL 5.7以降は、インストール時にランダムな初期パスワードが自動生成されます。

初期パスワードを確認する

# Ubuntu/Debian でログファイルから初期パスワードを取得
sudo grep 'temporary password' /var/log/mysql/error.log

# 出力例
2026-06-01T12:00:00.123456Z 1 [Note] A temporary password is generated for root@localhost: aB3#xY9!kLmN

# RHEL/CentOS の場合
sudo grep 'temporary password' /var/log/mysqld.log
# 初期パスワードでログイン
mysql -u root -p
# Enter password: (ログから取得したパスワードを入力)
-- 初回ログイン後は必ずパスワードを変更する(変更しないと多くの操作がエラーになる)
ALTER USER 'root'@'localhost' IDENTIFIED BY '新しいパスワード';

Docker での MySQL Access denied

# docker-compose.yml の MYSQL_ROOT_PASSWORD と実際に使うパスワードが一致しているか確認
docker exec -it mysql-container mysql -u root -p
# docker-compose.yml
services:
  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: "your_password"  # ← これと一致させる

よくある原因:ボリュームに古いデータが残っている

Docker で MySQL コンテナを再作成しても、永続化ボリュームに古いパスワードのデータが残っていると環境変数が反映されないことがあります。

# ボリュームを確認
docker volume ls | grep mysql

# 環境変数の MYSQL_ROOT_PASSWORD は初回起動時のみ有効
# 一度初期化されたデータベースには反映されない

# 解決策1:ボリュームを削除して再作成(データが消えるので注意)
docker-compose down -v
docker-compose up -d

# 解決策2:コンテナ内でパスワードを変更する
docker exec -it mysql-container bash
mysql -u root -p  # 現在のパスワードでログイン
ALTER USER 'root'@'localhost' IDENTIFIED BY '新しいパスワード';
FLUSH PRIVILEGES;

macOS(Homebrew)での対処

# Homebrew で入れた MySQL の場合
brew services list | grep mysql

# 初回はパスワードなしでログインできることが多い
mysql -u root

# パスワードを設定
mysql_secure_installation
# パスワードを忘れた場合
brew services stop mysql

# safe mode で起動
mysqld_safe --skip-grant-tables &
mysql -u root
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY '新しいパスワード';
FLUSH PRIVILEGES;
EXIT;
# 通常起動に戻す
brew services restart mysql

アプリケーション(PHP/Python/Node.js)からの接続エラー

アプリのコードから接続する際に発生する場合は、接続情報の確認も必要です。

# コマンドラインで同じ認証情報を使って接続できるか確認
mysql -u アプリのユーザー名 -p -h ホスト名

# アプリ用の専用ユーザーを作る(root を直接使うのは避ける)
-- root でログイン後、アプリ専用ユーザーを作成
CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'app_password';
GRANT ALL PRIVILEGES ON appdb.* TO 'appuser'@'localhost';
FLUSH PRIVILEGES;
# Python(PyMySQL)の接続例
import pymysql

conn = pymysql.connect(
    host='localhost',
    user='appuser',          # root ではなく専用ユーザーを使う
    password='app_password',
    database='appdb'
)
// Node.js(mysql2)の接続例
const mysql = require('mysql2');

const conn = mysql.createConnection({
  host: 'localhost',
  user: 'appuser',
  password: 'app_password',
  database: 'appdb',
});

権限テーブルが破損している場合

まれに mysql.user テーブル自体が壊れていて Access denied が出ることがあります。

# MySQL を安全に停止してテーブルをチェック
sudo systemctl stop mysql

# テーブルの修復を試みる
sudo mysqlcheck --repair mysql

# それでも直らない場合は mysql_upgrade を試す
sudo mysql_upgrade -u root -p

sudo systemctl start mysql

チェックリスト

□ sudo mysql -u root でログインできるか確認(auth_socket かどうか)
□ using password: YES / NO のどちらか確認
□ root@localhost と root@% を両方確認
  SELECT user, host, plugin FROM mysql.user WHERE user='root';
□ インストール直後なら初期パスワードをログから確認
  sudo grep 'temporary password' /var/log/mysql/error.log
□ Docker の場合:ボリュームに古いデータが残っていないか確認
□ MySQL のバージョンを確認(5.7 と 8.0 で ALTER USER の挙動が違う場合あり)
  mysql --version
□ 大文字小文字・特殊文字がコピペで化けていないか確認

トラブルシューティング

mysqld_safe --skip-grant-tables が起動しない

# プロセスが既に動いている可能性
ps aux | grep mysql
sudo pkill -9 mysqld
sudo pkill -9 mysqld_safe

# ソケットファイルが残っている場合
sudo rm -f /var/run/mysqld/mysqld.sock
sudo rm -f /var/run/mysqld/mysqld.sock.lock

# 再度試す
sudo mysqld_safe --skip-grant-tables --skip-networking &

「Your password does not satisfy the current policy requirements」が出る

-- パスワードポリシーが厳しすぎる場合
-- 一時的にポリシーを緩和(推奨はしないが緊急時用)
SET GLOBAL validate_password.policy = LOW;
SET GLOBAL validate_password.length = 4;

ALTER USER 'root'@'localhost' IDENTIFIED BY 'simple_pass';

-- 作業後はポリシーを戻す
SET GLOBAL validate_password.policy = MEDIUM;

「ERROR 2002 (HY000): Can’t connect to local MySQL server」も同時に出る場合

これは認証エラーではなく接続自体ができていない状態です。別の問題なので以下を確認します。

# MySQL が起動しているか確認
sudo systemctl status mysql

# 起動していなければ起動
sudo systemctl start mysql

# ソケットファイルの場所を確認
mysql --help | grep -A 1 "Default options"
sudo find / -name "mysqld.sock" 2>/dev/null

Workbench・GUI ツールからは接続できるのに CLI からできない

# 接続している MySQL のホスト・ポートが一致しているか確認
mysql -u root -p -h 127.0.0.1 -P 3306

# .my.cnf に古い接続情報が残っていないか確認
cat ~/.my.cnf

よくある質問(FAQ)

Q1. sudo mysql -u rootmysql -u root -p の違いは?

sudo mysql -u root は Linux の root 権限(auth_socket 認証)で MySQL に接続します。mysql -u root -p は MySQL 独自のパスワード認証でログインします。Ubuntu の MySQL はデフォルトで前者の設定になっていることが多いです。

Q2. root のパスワードを変更したのにまだ Access denied になります

FLUSH PRIVILEGES; を実行し忘れている可能性があります。ALTER USER の後は必ず FLUSH PRIVILEGES; を実行してください。また、root@localhostroot@127.0.0.1 で別々のパスワードになっている可能性も確認してください。

Q3. 本番環境で skip-grant-tables を使っても安全ですか?

--skip-grant-tables はすべての認証を無効化するため、実行中は誰でも root としてアクセスできる危険な状態になります。本番環境で行う場合は必ず --skip-networking を併用し、外部からの接続を遮断した状態で短時間だけ作業してください。作業後はすぐに通常モードに戻します。

Q4. root を直接アプリで使うのは問題ありますか?

セキュリティ上推奨されません。アプリケーションには必要最小限の権限を持つ専用ユーザーを作成して使うべきです。

CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'password';
GRANT SELECT, INSERT, UPDATE, DELETE ON appdb.* TO 'appuser'@'localhost';
FLUSH PRIVILEGES;

Q5. パスワードに特殊文字を使うとエラーになります

シェルでパスワードを直接入力する場合、特殊文字がシェルに解釈されることがあります。

# ❌ シングルクォートで囲まないと $ や ! が解釈される
mysql -u root -pP@ss$word

# ✅ シングルクォートで囲む
mysql -u root -p'P@ss$word'

# ✅ または -p のみ指定してプロンプトで入力(推奨・履歴に残らない)
mysql -u root -p
Enter password: 

まとめ

Access denied for user 'root'@'localhost' の対処をまとめます。

まず切り分け:

# sudo でログインできるか確認
sudo mysql -u root

パターン別の対処:

状況対処
sudo mysql -u root でログイン可能auth_socket が原因。パスワード認証に変更
sudo でもログイン不可・パスワード不明--skip-grant-tables でリセット
インストール直後ログファイルから初期パスワードを取得
Dockerボリュームの古いデータを疑う
root@localhostroot@% で挙動が違う両方のユーザーのパスワードを確認

パスワードリセットの基本手順:

sudo systemctl stop mysql
sudo mysqld_safe --skip-grant-tables --skip-networking &
mysql -u root
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY '新しいパスワード';
FLUSH PRIVILEGES;
EXIT;
sudo systemctl restart mysql

参考リンク

公式ドキュメント

関連記事(本サイト)


本記事は2026年6月時点の情報をもとに、MySQL 8.0・MySQL 5.7・MariaDB 10.x・Ubuntu 24.04 LTS での動作確認に基づき作成しています。バージョンによって挙動が異なる場合があるため、最新情報は各公式ドキュメントをご確認ください。