本手順は、MySQLのrootパスワードを紛失し、通常の方法でログインできなくなった場合に実施する「非常時用」のリカバリ手順です。
作業の前に
この作業は本来ならばあってはならない作業です。パスワード失念はセキュリティ事故の筆頭。ましてやWebシステムの神に等しいDBを司る通行証が消えた。なので、
- 事前にアカウント情報を記したファイルを保存する
- 適切な場所、適切なアクセス権で保管する
は必須ですが
往々にしてこの事故は起きます。なので、「マジで起きてしまった。取り敢えずの迅速な復旧」を望んでいる(つまり今回の私のような)方へのメモとなります。
この手順が笑える状況
- 構築中
- 検証作業中
のいずれかのみ。本番稼働中だったらまず笑えませんし、許可を得るための政治力・交渉力は甚大なものになります。筆者は「構築中」のパターンです。
環境
- RHEL9系(RockyLinux9系)
- MySQL 8
注記:RHEL 9系での注意点
- 従来の
mysqld_safeコマンドは廃止されているため、systemctl set-environmentを使用して起動オプションを制御します。 - MySQL 8.0以降は
skip-grant-tablesモード中でもFLUSH PRIVILEGESを実行しない限りALTER USERコマンドが受け付けられない仕様となっています。
作業影響
- 作業中にMySQLが止まる
これに尽きますが、「起きてしまったことは仕方ない。潔くサパッと止めてサクッと終わらせる」を心がけます。
さっくりとした手順
- MySQLサービスを停止します。
- 認証をスキップするための環境変数をセットします。
- 認証スキップ状態でMySQLを起動します。
- rootパスワードのリセットを行います。
- 認証を有効化してMySQLサービスを起動します。
- リセットされたパスワードでMySQLに入れることを確認します。
MySQLサービスの停止
- MySQL停止
sudo systemctl stop mysqld
- MySQL停止確認
systemctl status mysld
inactive(dead)を確認します。
認証をスキップするための環境変数をセットします。
- 認証スキップのオプションを環境変数に一時セット
systemctl set-environment MYSQLD_OPTS="--skip-grant-tables --skip-networking"
(--skip-networkingを付けることで、作業中の外部接続を遮断し安全を確保します。)
認証スキップ状態でMySQLを起動します。
sudo systemctl start mysqld
- MySQL起動確認
systemctl status mysld
active(running)を確認します。
rootパスワードのリセットを行います。
認証がスキップされている状態でログインし、権限テーブルを強制ロードしてからパスワードを書き換えます。
- パスワードなしでrootログイン
mysql -u root
これでログインできたらひとまず成功です。ここからはSQL捜査を行います。
- 権限テーブルをリロード (ALTER USER を実行可能にするために必須)
FLUSH PRIVILEGES;
- パスワードの変更を実施します。
ALTER USER 'root'@'localhost' IDENTIFIED BY 'your_strong_password';
- 変更を確定して終了
FLUSH PRIVILEGES;
exit
認証を有効化してMySQLサービスを起動します。
一時的な環境変数を削除し、通常の認証が有効な状態で再起動します。
- MySQLを一旦停止
systemctl stop mysqld
- MySQL停止確認
systemctl status mysld
inactive(dead)を確認します。
- セットした環境変数を必ず解除 (これを忘れると誰でも入れる状態が続くため重要)
systemctl unset-environment MYSQLD_OPTS
- 通常どおりサービスを起動
sudo systemctl start mysqld
- MySQL起動確認
systemctl status mysld
リセットされたパスワードでMySQLに入れることを確認します。
mysql -u root -p
新しいパスワードでログインできたことを確認します。
まとめ
「起きないことが第一」とは言いますが、本当にくだらない理由でこういう事象は発生します。なので
- 起きてしまったことは潔く認める
- そこから原状の復旧を目指す。
- 責任の追及とか誰がイモを引くかはその後で考える
の三段活用。“全裸大佐”が言う
過ちを気に病むことはない。ただ認めて、次の糧にすればいい
という「大人の特権」をフル活用しましょう。