何が起きたのか
ALTER USER、CREATE USER、または SET PASSWORD を実行すると、MySQLが次のエラーを返します:
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
これは特に、MySQLの新規インストール直後 — mysql_secure_installation を実行して validate_password プラグインを有効化した場合に発生しやすいエラーです。設定しようとしたパスワードは文法的には正しいSQLですが、MySQLのパスワードポリシーによってブロックされています。
MySQLがパスワードを拒否する理由
MySQL 5.7で validate_password がプラグインとして導入されました。MySQL 8.0ではコンポーネントに昇格されています。いずれの場合も、有効化されている場合はパスワード変更のたびに最低強度要件に照らして検証が行われます。
ポリシーレベルは3種類あります:
- LOW — 長さのみチェック(デフォルト:8文字)
- MEDIUM — 長さ+大文字+小文字+数字+特殊文字
- STRONG — MEDIUMの条件すべて+辞書ファイルに含まれていないこと
MySQL 8をインストールしてセキュアインストールウィザードを実行した場合、ポリシーがMEDIUMまたはSTRONGに設定されている可能性が高いです。
ステップ1:現在のポリシーを確認する
rootとしてログインし、以下を実行します:
SHOW VARIABLES LIKE 'validate_password%';
MySQL 8.0の出力は次のようになります:
+-------------------------------------------------+--------+
| Variable_name | Value |
+-------------------------------------------------+--------+
| validate_password.check_user_name | ON |
| validate_password.dictionary_file | |
| validate_password.length | 8 |
| validate_password.mixed_case_count | 1 |
| validate_password.number_count | 1 |
| validate_password.policy | MEDIUM |
| validate_password.special_char_count | 1 |
+-------------------------------------------------+--------+
MySQL 5.7では、変数名はドットではなくアンダースコアを使います:validate_password_policy、validate_password_length などです。
これで何が問題なのかが正確にわかります。
即時対応:ポリシーに準拠したパスワードを使用する
最も手早い方法 — 現在のポリシーを満たすパスワードを選ぶことです。デフォルト設定でMEDIUMポリシーの場合、パスワードに必要な条件は次のとおりです:
- 8文字以上
- 大文字が1文字以上
- 小文字が1文字以上
- 数字が1文字以上
- 特殊文字が1文字以上(
!@#$%^&*など)
例:MyP@ssw0rd! — 見栄えは悪いですが、テスト用には機能します。本番環境ではランダムなパスワードを使用してください。私は ToolCraftのパスワードジェネレーター を使って、ポリシーに準拠したランダムパスワードを即座に生成しています — ブラウザ上で動作し、どこにも送信されません。
コマンドを実行する前に、パスワードが通過するか確認します:
SELECT VALIDATE_PASSWORD_STRENGTH('YourPasswordHere');
0〜100の値が返されます。50以上でMEDIUMポリシーに合格し、STRONGには100が必要です。
次にパスワードを適用します:
ALTER USER 'youruser'@'localhost' IDENTIFIED BY 'YourStr0ng!Pass';
恒久的な対応:ポリシーを用途に合わせて調整する
ローカルの開発環境やステージング環境で使用している場合、STRONGポリシーは過剰です。LOWに下げましょう:
-- MySQL 8.0
SET GLOBAL validate_password.policy = LOW;
SET GLOBAL validate_password.length = 6;
-- MySQL 5.7
SET GLOBAL validate_password_policy = LOW;
SET GLOBAL validate_password_length = 6;
これらの変更は即時に反映されますが、MySQLを再起動すると元に戻ります。永続化するには、MySQLの設定ファイルに追記します — Ubuntu/Debianでは /etc/mysql/mysql.conf.d/mysqld.cnf、RHEL/CentOSでは /etc/my.cnf です:
[mysqld]
validate_password.policy = LOW
validate_password.length = 6
その後、再起動します:
sudo systemctl restart mysql
オプション:validate_passwordを完全に無効化する
外部アクセスのないローカル専用の開発マシンであれば、コンポーネントをアンインストールして検証を完全にスキップできます:
-- MySQL 8.0 (コンポーネント)
UNINSTALL COMPONENT 'file://component_validate_password';
-- MySQL 5.7 (プラグイン)
UNINSTALL PLUGIN validate_password;
ポリシーによる制限がなくなります。任意のパスワードを設定できます。
MySQL 8.0で後から再有効化する場合:
INSTALL COMPONENT 'file://component_validate_password';
確認
ポリシーの変更が適用されましたか?反映されているか確認します:
SHOW VARIABLES LIKE 'validate_password%';
次に、設定するパスワードのスコアを確認します:
SELECT VALIDATE_PASSWORD_STRENGTH('yournewpassword');
実際の ALTER USER または CREATE USER コマンドを実行します。今度はERROR 1819が出なければ完了です。
よくある落とし穴:ドットとアンダースコアの混同
MySQL 8.0はドット記法(validate_password.policy)を使います。MySQL 5.7はアンダースコア(validate_password_policy)を使います。混同すると ERROR 1193: Unknown system variable が発生し、最初のエラーに加えて2つ目のエラーが重なります。コマンドをコピーする前にバージョンを確認してください:
SELECT VERSION();
本番環境でのヒント
本番環境では validate_password を無効化しないでください。MEDIUMポリシーが適切なバランスです — 辞書ファイルを必要とせず、弱いパスワードをブロックできます。すべてのサービスアカウントにポリシー準拠のパスワードを生成し、設定ファイルではなくシークレットマネージャー(Vault、AWS Secrets Manager)に保存してください。
バリデーションに失敗するフォーマットを何度も試すのはすぐに面倒になります。設定可能なジェネレーターをブックマークしておきましょう — ToolCraftのジェネレーター では文字数と使用文字を細かく指定できるため、出力されるパスワードが必ず一発でポリシーを通過します。

