◀ 10.

MySQL ERROR 1820・1862|期限切れパスワードの安全な更新と確認

▶

ERROR 1820は、失効したパスワードで接続した制限付きセッションが通常のSQLを実行しようとしたときのエラーです。ログイン直後に必ず出るものではなく、クライアントが制限付き接続に対応しなければ1862で接続を拒否される場合もあります。

期限切れ時の1862接続拒否と1820制限付き接続、期限ポリシーとパスワード更新を区別する図

期限の設定と、今のパスワード失効を分ける

状態/設定意味と確認点
ERROR 1862期限切れパスワードの接続が拒否された。8.0でも発生するため、旧版特有と扱わない
ERROR 1820接続後の制限付きセッションで許可外のSQLを実行した。通常SQLで情報収集できるとは限らない
PASSWORD EXPIRE手動で失効させる設定。再接続が必要なアプリへの影響も確認する
NEVER / DEFAULT / INTERVAL将来の自動期限の方針。手動で失効したパスワードをそのまま復旧する操作と混同しない

安全に復旧する確認順

  1. サーバー版、クライアント、対象User/Hostと影響するアプリを確認する。通常SQLを実行できない場合は承認済み管理経路を使う。
  2. 許可された管理者はpassword_expired、password_last_changed、個別/グローバルの期限を確認する。ログやアカウント情報をそのまま公開しない。
  3. 承認された更新手順で新しい秘密値へ変更する。CLIの履歴/画面/SQLログや設定ファイルへの露出を避け、公開記事の値を使わない。
  4. アプリの秘密情報保管先を更新し、新規接続と必要な処理を検証する。既存の管理接続は代替経路の確認前に閉じない。
  5. 1819が出た場合は実効ポリシーへ適合させる。LOW/無期限化/コンポーネント削除でエラーだけを消さない。

非対話のmysqlクライアントでは、--connect-expired-passwordで制限付きセッションへ入れる場合があります。ただし通常SQLが使えるようになるオプションではなく、他ドライバの対応や接続設定は個別確認が必要です。

一次資料: 1820/1862と制限付きセッション、ALTER USERの期限オプションと自分の更新、validate_passwordの導入方式、SET PASSWORDの対象指定。

この記事の要点
  • ERROR 1820 (HY000) は失効したパスワードの制限付きセッションで、許可されないSQLを実行した場合のエラー
  • 原因: 初期パスワード / 期限切れパスワード / 管理者が password_expired 設定したアカウント
  • 対処: 正しい対象アカウントを確認し、許可された手順で新しい秘密値へ更新する。掲載の例示パスワードは使用しない
  • 有効な認証/検証方式とポリシーを確認。validate_passwordは導入元によってコンポーネント/旧プラグイン/未導入が異なる
  • ポリシー緩和やコンポーネント削除を解除手順にしない。有効期限の設定変更と失効済みパスワードの更新を分ける

このエラーの概要

MySQL に接続したあと、SHOW DATABASES; 等の最初の SQL を実行しようとするとこのメッセージが出ます:

mysql> SHOW DATABASES;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement
before executing this statement.

これはエラーというよりも、MySQL からの「パスワードを変更してから使え」という強制要求です。

発生する 3 つの状況

状況詳細
MySQL 初回インストール後一時パスワードを失効状態で発行する導入方式がある。全配布物/全初期化方法が同じではない
新規ユーザー作成時CREATE USER ... PASSWORD EXPIRE; で作成された
パスワード有効期限グローバル既定またはアカウント個別の有効期限で失効した

対処1: 対象を確認して自分のパスワードを更新する

下のALTER USERは実際に資格情報を変更します。例示パスワードは使用せず、組織の安全な発行/更新手順とクライアントの履歴・ログへの残り方を確認してください。アプリ依存がある場合は保管先/接続設定/再接続の調整が別途必要です。

-- ログイン中のユーザー自身を変更
ALTER USER USER() IDENTIFIED BY 'NewP@ssw0rd!';

-- これでエラー解除、SQL が実行可能になる
SHOW DATABASES;

ALTER USER USER() IDENTIFIED BYは自分のパスワードを変える専用の構文です。通常のUSER()の戻り値をそのままアカウント名と扱う説明ではありません。接続できる管理者はUser/Hostと対象を照合し、複数のHostエントリを無差別に変えません。

対処2: 管理者が他ユーザーをリセット

次の旧ブロックには誤ったコメントがあります。 PASSWORD EXPIRE NEVERは将来の自動期限を無効化し、DEFAULTはグローバル期限へ従う設定です。手動で失効したフラグを、既存パスワードのまま解除する手順ではありません。初行のmysqlはシェルコマンドでSQLではなく、まとめてSQL実行しないでください。通常のALTER USER後のFLUSH PRIVILEGESは不要です。対象と権限を確認した管理者だけが更新を計画します。

-- root で接続
mysql -u root -p

-- 期限切れユーザーを確認
SELECT user, host, password_expired, password_last_changed
FROM mysql.user;

-- パスワード変更
ALTER USER 'app_user'@'localhost' IDENTIFIED BY 'NewP@ssw0rd!';

-- 期限切れフラグを解除(既存パスワードのまま)
ALTER USER 'app_user'@'localhost' PASSWORD EXPIRE NEVER;

-- パスワード変更要求を解除
ALTER USER 'app_user'@'localhost' PASSWORD EXPIRE DEFAULT;

FLUSH PRIVILEGES;

対処3: validate_password ポリシーを満たす

validate_passwordの導入状態と実効ポリシーは配布元/移行履歴で異なります。有効な検証方式の条件に違反すると1819が出ます。下は旧例で、LOWへの変更、length=6、UNINSTALL COMPONENTは保護を弱める操作のため対処として実行しません。記載した既定値を実際の設定と決めつけないでください:

-- 現在のポリシー確認
SHOW VARIABLES LIKE 'validate_password%';

-- 既定の MEDIUM ポリシー
-- validate_password.length            = 8     最低 8 文字
-- validate_password.mixed_case_count  = 1     大文字・小文字各 1
-- validate_password.number_count      = 1     数字 1
-- validate_password.special_char_count= 1     記号 1
-- validate_password.policy            = MEDIUM

-- ポリシーを LOW に緩和(開発環境のみ)
SET GLOBAL validate_password.policy = LOW;
SET GLOBAL validate_password.length = 6;

-- 完全に無効化(本番禁止)
UNINSTALL COMPONENT 'file://component_validate_password';

旧記事の公開例P@ssw0rd! / MyS3cret! / Aa1!Bb2@を実パスワードには使用しません。実効ポリシーに適合する、他と共用しない新しい秘密値を安全な方法で発行してください。

対処4: 有効期限ポリシーの変更は別途計画する

下のGLOBAL変更やNEVERは期限管理の方針を変える旧例です。1820の一律解決として無期限化しません。グローバル既定、個別期限、手動のpassword_expiredを区別し、将来のローテーションと停止影響を確認します。設定ファイル例も既存ファイルへ無条件に追記しないでください。

-- 現在の既定有効期限
SHOW VARIABLES LIKE 'default_password_lifetime';
-- value = 0 なら無期限、それ以外は日数

-- 無期限に変更(my.cnf で永続化)
SET GLOBAL default_password_lifetime = 0;

-- 個別ユーザーの有効期限
ALTER USER 'app_user'@'%' PASSWORD EXPIRE INTERVAL 180 DAY;
ALTER USER 'app_user'@'%' PASSWORD EXPIRE NEVER;
ALTER USER 'app_user'@'%' PASSWORD EXPIRE DEFAULT;
# /etc/mysql/my.cnf に永続化
[mysqld]
default_password_lifetime = 0

初期 root パスワードの調べ方

次は一時パスワードをログへ発行する導入方式の旧例で、全Linux配布物の共通手順ではありません。ログ行には資格情報が含まれ得るため公開/転送せず、表示済みの例示値も使用しません。mysqlはシェル、ALTER USERは接続後のSQLで、混在ブロックを一括実行しないでください。

# MySQL 5.7+ の Linux インストール直後の root パスワード
sudo grep 'temporary password' /var/log/mysqld.log
# 2026-05-15T12:00:00.000Z 6 [Note] [MY-010454] [Server]
#   A temporary password is generated for root@localhost: aBcD;eFg1234!

# このパスワードでログイン
mysql -u root -p
# Enter password: aBcD;eFg1234!

# 即パスワード変更(ERROR 1820 が出るのでこれをやる)
ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyN3wP@ssword!';

SET PASSWORD との違い

構文対象 MySQL備考
ALTER USER ... IDENTIFIED BY5.7.6+推奨、現在の標準
SET PASSWORD = 'pw'8.0+ で 'pw' を平文指定FORを省略すると自分。対象指定と権限の条件は公式構文で確認
SET PASSWORD FOR ... = PASSWORD('pw')旧版の構文。対象版を個別確認MySQL 8.0ではPASSWORD()関数を使用しない
UPDATE mysql.user SET ...5.6 以前絶対に使わない

よくあるトラブル

症状対処
ALTER USER で ERROR 1819 が出る実効ポリシーと認証方式を確認し適合する秘密値を発行。保護を緩和しない
変更したのにまた 1820別ホストエントリ('user'@'%' vs 'user'@'localhost')がある
パスワード再設定後すぐ期限切れ個別/グローバル期限と手動失効・実際の接続アカウントを確認。NEVERを一律併用しない
レプリケーション後に発生レプリケーション構成とアカウントDDLの伝播/除外を確認。両側へ無条件に重複実行しない

FAQ

Q: ALTER USER も実行できない
A: 制限付きセッションでは期限切れパスワードを更新するためのALTER USERやSET PASSWORD等が許されます。すべてのALTER USERが自由に実行できるわけではありません。クライアント/サーバー版を確認し、弱い例示値を使わず安全な更新経路を管理者と調整してください。

Q: アプリから接続すると 1820
A: アプリからの無限再試行や自動の認証弱体化はしません。管理者が対象アカウント/失効状態を確認し、資格情報の安全な更新とアプリ側の切替を計画します。無期限化を標準の解除策にはしません。

Q: validate_password コンポーネントが見つからない
A: MySQL 8.0でも導入/更新経路によりコンポーネント・旧プラグイン・未導入を区別します。許可された管理接続で導入状態を確認し、診断のためにINSTALL/UNINSTALLを実行しません。

関連エラー

  • ERROR 1819 (HY000): Your password does not satisfy the current policy requirements — ポリシー違反
  • ERROR 1862 (HY000): Your password has expired — 期限切れ接続をクライアント/サーバー設定により拒否。MySQL 8.0でも起こる
  • ERROR 1396 (HY000): Operation ALTER USER failed — ユーザー存在せず

ほかの症状はMySQLエラー一覧の子ページから選んでください。ホスト遮断1129、ソケット認証1698とは条件を分けて調べます。

子ページ

子ページはありません

同階層のページ
  1. 1071 Specified key was too long; max key length is 767 bytes
  2. ERROR 1063 (42000): Incorrect column specifier for column '~'
  3. mysqld: Can't change dir to '...\MySQL\MySQL Server X.X\data\' (OS errno 2 - No such file or directory)
  4. Install/Remove of the Service Denied!
  5. Datetime 型が NULL に見える
  6. Warning: World-writable config file '/etc/mysql/my.cnf' is ignored
  7. ERROR 1698 (28000): Access denied for user 'root'@'localhost'
  8. Exception: Wrong MySQL configuration
  9. [Warning] TIMESTAMP with implicit DEFAULT value is deprecated.
  10. ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
  11. ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
  12. Incorrect column specifier for column 'カラム名'
  13. BLOB/TEXT column 'description' used in key specification without a key length
  14. ERROR: /bin/sh: mysql_config: コマンドが見つかりません
  15. Host '...' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'
  16. CSVエクスポート時に「ERROR 1045 (28000): Access denied for user 'username'@'localhost'」エラーが表示される
  17. Cannot execute statement: impossible to write to binary log since BINLOG_FORMAT = STATEMENT
  18. SQLSTATE[22007]: Invalid datetime format: 1366 Incorrect string value: ~

最近更新/作成されたページ