16.

MySQL root パスワードの変更方法(ALTER USER / mysqladmin / パスワード忘れ時の復旧)

編集
この記事の要点
  • MySQL 5.7+ / 8.0 標準: ALTER USER 'root'@'localhost' IDENTIFIED BY 'newpass'
  • 外部コマンド: mysqladmin -u root -p password 'newpass'(旧来)
  • パスワード忘れ時: mysqld を --skip-grant-tables --skip-networking で起動 → 直接 user テーブル更新 → 通常起動
  • MySQL 8.0 の caching_sha2_password: 一部古いクライアントは接続不可。WITH mysql_native_password に戻す
  • パスワードポリシー: validate_password プラグインで強度要件。短い pw だと ERROR 1819

方法 1: ALTER USER(MySQL 5.7.6+ / 8.0 標準)

最新の MySQL では ALTER USER を使うのが正式な方法です:

-- 通常: 現パスワード入力で接続済の状態で
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewSecret123!';

-- 認証プラグインも指定(MySQL 8.0 互換性問題対策)
ALTER USER 'root'@'localhost'
    IDENTIFIED WITH mysql_native_password BY 'NewSecret123!';

-- 反映
FLUSH PRIVILEGES;

-- 確認
SELECT User, Host, plugin FROM mysql.user WHERE User = 'root';

方法 2: mysqladmin password(旧来)

シェルから直接変更したい場合:

# 対話入力
mysqladmin -u root -p password
# Enter password: ← 旧パスワード
# New password: ← 新パスワード
# Confirm new password:

# 引数で渡す(履歴に残るので非推奨)
mysqladmin -u root -p'OldPass' password 'NewSecret123!'

方法 3: SET PASSWORD(旧構文・5.7.5 以前)

-- MySQL 5.7.5 以前
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('NewSecret123!');

-- MySQL 5.7.6 以降は ALTER USER 推奨。古い構文は非推奨警告
SET PASSWORD FOR 'root'@'localhost' = 'NewSecret123!';

方法 4: パスワードを忘れた場合の復旧

--skip-grant-tables で起動して権限チェックを無効化し、直接 user テーブルを更新します。

手順 1: MySQL を停止

sudo systemctl stop mysql       # Ubuntu/Debian
sudo systemctl stop mysqld      # RHEL/CentOS
sudo systemctl stop mariadb     # MariaDB

# プロセス残存確認
ps aux | grep mysqld

手順 2: 権限チェックなしで起動

# 安全のためネットワーク接続も無効化
sudo mysqld_safe --skip-grant-tables --skip-networking &

# または直接(systemd 環境)
sudo systemctl set-environment MYSQLD_OPTS="--skip-grant-tables --skip-networking"
sudo systemctl start mysql

手順 3: パスワード変更

-- 認証なしで接続
$ mysql -u root

-- MySQL 5.7+ : ALTER USER は --skip-grant-tables 状態だと動かない
-- 一旦 FLUSH PRIVILEGES してから

FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewSecret123!';
FLUSH PRIVILEGES;
EXIT;

-- 5.6 以前 / 直接更新(最終手段)
UPDATE mysql.user
SET authentication_string = PASSWORD('NewSecret123!')
WHERE User = 'root' AND Host = 'localhost';
FLUSH PRIVILEGES;

手順 4: 通常起動に戻す

# mysqld_safe で起動したプロセスを止める
sudo killall mysqld
# または
sudo systemctl unset-environment MYSQLD_OPTS

# 通常起動
sudo systemctl start mysql

# 新パスワードで接続確認
mysql -u root -p

MySQL 8.0 の認証プラグイン問題

MySQL 8.0 は既定の認証プラグインが caching_sha2_password に変わり、古い PHP / MySQL クライアントから接続できないことがあります:

SQLSTATE[HY000] [2054] The server requested authentication method
unknown to the client
-- 旧プラグインに戻す
ALTER USER 'root'@'localhost'
    IDENTIFIED WITH mysql_native_password BY 'NewSecret123!';

-- 全ユーザー確認
SELECT User, Host, plugin FROM mysql.user;

my.cnf で既定を変更:

[mysqld]
default_authentication_plugin = mysql_native_password

パスワードポリシー(validate_password)

MySQL 5.7+ には validate_password プラグインが既定で有効。短いパスワードは弾かれます:

ERROR 1819 (HY000): Your password does not satisfy the current
policy requirements
-- 現在のポリシー確認
SHOW VARIABLES LIKE 'validate_password%';

-- 主な設定
-- validate_password.policy        LOW / MEDIUM / STRONG
-- validate_password.length        8 (既定)
-- validate_password.mixed_case_count  1
-- validate_password.number_count      1
-- validate_password.special_char_count 1

-- 一時的に緩める(再起動で戻る)
SET GLOBAL validate_password.policy = LOW;
SET GLOBAL validate_password.length = 8;

-- 完全に無効化(非推奨)
UNINSTALL PLUGIN validate_password;

MySQL 8.0 の component_validate_password

8.0 ではプラグインからコンポーネントに変更:

-- 状態確認
SELECT * FROM mysql.component;
SHOW VARIABLES LIKE 'validate_password%';

-- アンインストール
UNINSTALL COMPONENT 'file://component_validate_password';

-- 再インストール
INSTALL COMPONENT 'file://component_validate_password';

Bitnami / Docker 環境での root pw

環境確認方法
Bitnamicat /home/bitnami/bitnami_credentials
Docker official mysql環境変数 MYSQL_ROOT_PASSWORD
MAMP初期: root / root
XAMPP初期: root / 空
AWS RDSマスターパスワードはダッシュボードから変更

FAQ

Q: ALTER USER で「Operation ALTER USER failed」
A: ① パスワードポリシー違反、② --skip-grant-tables 状態で FLUSH PRIVILEGES してない、③ READ ONLY モード。

Q: root@localhost と root@% は別物?
A: 別物です。両方変更が必要ならALTER USER 'root'@'%' ... も実行。

Q: 安全な root pw の生成
A: openssl rand -base64 24pwgen -s 24 1 でランダム生成、パスワードマネージャに保存。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. ダウンロード&インストール方法(Windows)
  2. インストール方法(Linux)
  3. コマンド一覧
  4. SQL
  5. データ型
  6. 関数
  7. 管理ツール
  8. 設定
  9. パフォーマンスチューニング関連
  10. エクスポートおよびインポート
  11. エラー&トラブル
  12. 文字コードの確認
  13. 実行中の SQL の状態確認およびプロセスキルの方法
  14. パスワードの無効化設定
  15. root ユーザーの初期パスワード確認方法
  16. rootユーザーのパスワード変更方法
  17. LIMIT, OFFSET の始まりと挙動
  18. mysqlのバージョン確認方法
  19. 実行計画の表示方法
  20. レプリケーションのステータス確認方法
  21. 中央値の導き方(バージョン8未満)
  22. 階層SQL(バージョン8未満)
  23. パーセンタイルの導き方
  24. 特定スキーマの全テーブルの全カラム情報を取得する方法
  25. MySQLで文字列の置換をする方法