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: YESとNOの違い- パスワードを忘れた場合のリセット手順
auth_socket認証が原因のケースの見分け方と対処- Docker・Ubuntu・macOS それぞれでの対処法
- root パスワードを二度と忘れないための運用
- 1. 結論:先に答えを出す
- 2. エラーメッセージの読み方
- 3. 原因パターン一覧
- 4. Step 1:まず原因を切り分ける
- 5. パターン1・2:パスワードが分からない・忘れた場合
- 6. パターン3:root@localhost と root@% の混同
- 7. パターン4:MySQL インストール直後(初期パスワード)
- 8. Docker での MySQL Access denied
- 9. macOS(Homebrew)での対処
- 10. アプリケーション(PHP/Python/Node.js)からの接続エラー
- 11. 権限テーブルが破損している場合
- 12. チェックリスト
- 13. トラブルシューティング
- 14. よくある質問(FAQ)
- 15. まとめ
- 16. 参考リンク
結論:先に答えを出す
# ① まずパスワードなしでログインを試す(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 root と mysql -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@localhost と root@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@localhost と root@% で挙動が違う | 両方のユーザーのパスワードを確認 |
パスワードリセットの基本手順:
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
参考リンク
公式ドキュメント
関連記事(本サイト)
- PostgreSQL「current transaction is aborted」エラーの解決方法 – DB関連のエラー
- Linux「command not found」エラーの解決方法 – よくあるLinuxエラー
- apt vs apt-get 徹底比較 – パッケージ管理
本記事は2026年6月時点の情報をもとに、MySQL 8.0・MySQL 5.7・MariaDB 10.x・Ubuntu 24.04 LTS での動作確認に基づき作成しています。バージョンによって挙動が異なる場合があるため、最新情報は各公式ドキュメントをご確認ください。
-
前の記事
【完全版】Rails「ActionController::RoutingError」エラーの原因と対処法|No route matches を徹底解説 2026.07.02
-
次の記事
【完全比較】Linux kill vs pkill vs killall の違いと使い分け 2026.07.03
コメントを書く