MySQLがクエリをブロックする理由
MySQL 8.0のインストールが完了した直後や、rootの認証情報を手動でリセットした際、複雑な一時パスワードでログインするところまでは問題ないかもしれません。しかし、簡単な SHOW DATABASES; コマンドを実行しようとすると、次のようなストレスの溜まるメッセージが表示されることがあります。
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
MySQLがこのロックをトリガーするのは、セキュリティ上の理由から、初期パスワードやリセットされたパスワードを「期限切れ(expired)」としてマークするためです。これは強制的な安全確認だと考えてください。恒久的なパスワードを設定するまで、サーバーは制限されたサンドボックスモードのままとなり、ほぼすべての管理タスクが実行できなくなります。
デバッグプロセス
サーバーは、アカウントが安全であることを証明するための特定のコマンドを待機している状態です。UbuntuやCentOSなどのLinuxディストリビューションでは、おそらく次のコマンドを使用してエラーログから初期パスワードを取得したはずです。
sudo grep 'temporary password' /var/log/mysqld.log
その一時的な文字列は、1回限りのログインのためのものです。内部的には、MySQLは mysql.user システムテーブルの password_expired カラムをチェックしています。その値が 'Y' の場合、認証情報を更新するまで、この制限されたシェルから抜け出すことはできません。
解決策
この問題の修正には1分もかかりません。MySQLに対して、新しく設定する恒久的なパスワードを明示的に伝える必要があります。
ステップ1:ALTER USERコマンドの実行
MySQLシェルの内部で、以下のステートメントを実行します。'YourNewStrongPassword123!' の部分は、任意で決めた安全な文字列に置き換えてください。
ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourNewStrongPassword123!';
この構文は、MySQL 5.7や8.0を含むすべてのモダンなバージョンで動作します。実行されると、「期限切れ」フラグは即座に解除されます。
ステップ2:パスワードポリシーエラーのトラブルシューティング
設定したパスワードがMySQLのデフォルトのセキュリティプラグインの基準を満たしていない場合、次のようなエラーが表示されることがあります。
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
デフォルトでは、MySQL 8.0は、大文字、小文字、数字、特殊文字をそれぞれ1つ以上含む、8文字以上のパスワードを要求します。要件を満たす文字列がすぐに必要な場合は、ToolCraftのパスワード生成ツールを試してみてください。これらのチェックを確実にパスする高エントロピーなパスワードを作成できます。
ローカルの開発環境などで、よりシンプルなパスワードを使用したい場合は、一時的にポリシーの厳格さを下げることができます。
-- MySQL 8.xの場合
SET GLOBAL validate_password.policy=LOW;
-- MySQL 5.7の場合
SET GLOBAL validate_password_policy=LOW;
ステップ3:仕上げと確認
通常、ALTER USER は変更を即座に適用しますが、念のため内部の権限テーブルをリフレッシュしておくと確実です。以下のコマンドを実行してください。
FLUSH PRIVILEGES;
これでアクセスをテストできます。もう一度 SHOW DATABASES; を実行してみてください。システムスキーマのリストが表示されれば、アカウントのロック解除は成功です。シェルを終了し、新しいパスワードで再度ログインして、変更が保持されていることを確認してください。
今後のための教訓
- サンドボックスモード: パスワードが期限切れになると、MySQLはアカウント管理コマンドのみを受け付ける制限状態に入ります。
- 一時的な認証情報: 本番環境のスクリプトで一時パスワードを使用しないでください。これらは初回セットアップ専用に設計されています。
- 自動化のヒント: AnsibleやDockerを使用してデータベースをデプロイする場合は、ブートストラップスクリプトに
ALTER USERのステップを含め、自動化ワークフローがこのエラーで停止しないようにしてください。

