ERROR 1820は、失効したパスワードで接続した制限付きセッションが通常のSQLを実行しようとしたときのエラーです。ログイン直後に必ず出るものではなく、クライアントが制限付き接続に対応しなければ1862で接続を拒否される場合もあります。
期限の設定と、今のパスワード失効を分ける
| 状態/設定 | 意味と確認点 |
|---|---|
| ERROR 1862 | 期限切れパスワードの接続が拒否された。8.0でも発生するため、旧版特有と扱わない |
| ERROR 1820 | 接続後の制限付きセッションで許可外のSQLを実行した。通常SQLで情報収集できるとは限らない |
| PASSWORD EXPIRE | 手動で失効させる設定。再接続が必要なアプリへの影響も確認する |
| NEVER / DEFAULT / INTERVAL | 将来の自動期限の方針。手動で失効したパスワードをそのまま復旧する操作と混同しない |
安全に復旧する確認順
- サーバー版、クライアント、対象User/Hostと影響するアプリを確認する。通常SQLを実行できない場合は承認済み管理経路を使う。
- 許可された管理者はpassword_expired、password_last_changed、個別/グローバルの期限を確認する。ログやアカウント情報をそのまま公開しない。
- 承認された更新手順で新しい秘密値へ変更する。CLIの履歴/画面/SQLログや設定ファイルへの露出を避け、公開記事の値を使わない。
- アプリの秘密情報保管先を更新し、新規接続と必要な処理を検証する。既存の管理接続は代替経路の確認前に閉じない。
- 1819が出た場合は実効ポリシーへ適合させる。LOW/無期限化/コンポーネント削除でエラーだけを消さない。
非対話のmysqlクライアントでは、--connect-expired-passwordで制限付きセッションへ入れる場合があります。ただし通常SQLが使えるようになるオプションではなく、他ドライバの対応や接続設定は個別確認が必要です。
一次資料: 1820/1862と制限付きセッション、ALTER USERの期限オプションと自分の更新、validate_passwordの導入方式、SET 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 BY | 5.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とは条件を分けて調べます。
子ページはありません
- 1071 Specified key was too long; max key length is 767 bytes
- ERROR 1063 (42000): Incorrect column specifier for column '~'
- mysqld: Can't change dir to '...\MySQL\MySQL Server X.X\data\' (OS errno 2 - No such file or directory)
- Install/Remove of the Service Denied!
- Datetime 型が NULL に見える
- Warning: World-writable config file '/etc/mysql/my.cnf' is ignored
- ERROR 1698 (28000): Access denied for user 'root'@'localhost'
- Exception: Wrong MySQL configuration
- [Warning] TIMESTAMP with implicit DEFAULT value is deprecated.
- ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
- ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
- Incorrect column specifier for column 'カラム名'
- BLOB/TEXT column 'description' used in key specification without a key length
- ERROR: /bin/sh: mysql_config: コマンドが見つかりません
- Host '...' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'
- CSVエクスポート時に「ERROR 1045 (28000): Access denied for user 'username'@'localhost'」エラーが表示される
- Cannot execute statement: impossible to write to binary log since BINLOG_FORMAT = STATEMENT
- SQLSTATE[22007]: Invalid datetime format: 1366 Incorrect string value: ~
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスのソフト一覧|Blender・Metasequoiaと用途別の選び方
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- Visual Studio「デザイナーを表示できません」エラーの原因と対処 2026-10-28 12:06:00
- SSH 認証に失敗しました。再試行してください の対処 2026-10-28 12:06:00
- SSH2 秘密鍵の読み込みに失敗しました の原因と対処 2026-10-28 12:06:00
- TeraTerm のよくあるエラーと対処法完全ガイド — Connection refused / 2026-10-28 12:06:00
- Visual Studio エラー一覧|コンパイルエラー・警告の確認方法と対処 2026-10-28 11:39:57
- Whitelabel Error Page の原因と消し方|Spring Boot のエラーページ 2026-10-28 11:39:57
- Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法 2026-10-28 11:39:57
- SQL WHERE 句完全ガイド 2026-10-28 11:39:57
- SQL JOIN 完全ガイド (INNER/LEFT/RIGHT/FULL OUTER) 2026-10-28 11:39:57
- tomcat の起動 / 停止ログと catalina.log・catalina.out の違い 2026-10-28 10:24:23
- Tomcat の起動確認方法 5 つ|localhost:8080・ポート・プロセス・ログ 2026-10-28 10:24:23
- Oracle 19c COMMITの使い方: 暗黙コミット・自動確定・応答不明時の確認 2026-10-28 09:59:09
- Oracle 19c DELETE文|削除対象の確認・COMMIT前の判断・ROLLBACKの条件 2026-10-28 09:59:09
- Oracle 19c INSERT文|INSERT ALL・SELECT・RETURNINGとMERGEの使い分け 2026-10-28 09:59:09
- Oracle 19cのトランザクション制御|COMMIT・ROLLBACK・分離レベルと接続設定 2026-10-28 09:59:09