- 「ORA-28001:パスワードが期限切れです。」エラーの原因
- ロックされたユーザー・アカウントの現状確認
- 「ORA-28001:パスワードが期限切れです。」エラーの対処・解決方法
- 「ORA-28001:パスワードが期限切れです。」について学んだこと
久しぶりに勉強用のOracle Database12cに接続しようとしたところ「ORA-28001:パスワードが期限切れです。」エラーでログインできなくなっていました。
今回は「ORA-28001:パスワードが期限切れです。」エラーの対処・解決方法を記事にします。
「ORA-28001:パスワードが期限切れです。」エラーの原因
Oracle12cのパスワードポリシーは以下のようになっています。
- パスワードは180日で自動的に期限切れとなります
- パスワードは期限切れの7日後にユーザー・アカウントがロックされます
- 10回ログインに失敗すると、ユーザーが1日ロックされます
※11gも180日でデフォルトはパスワードが期限切れとなります。
私も180日、パスワードを変更しなかったことが原因でユーザー・アカウントがロックされてしまいました。
ロックされたユーザー・アカウントの現状確認
勉強もかねて、現在のユーザーの状態を確認します。
管理者で接続し、dba_usersテーブルを確認する
1.コマンドプロンプトで以下を入力して、SQLPLUSで管理者として接続します。
sqlplus / as sysdba
2.以下SQLを入力してEnterを押下
SELECT USERNAME, ACCOUNT_STATUS, LOCK_DATE from dba_users;
もしくは、以下のようにWHEREでユーザー名に絞って
SELECT USERNAME, ACCOUNT_STATUS, LOCK_DATE FROM DBA_USERS WHERE USERNAME = 'ユーザー名';
※ユーザー名は大文字で入力。
ユーザー名はTESTUSERで、『ACCOUNT_STATUS』はパスワード期限切れの「EXPIRED」になっています。LOCK_DATEは空でした。
DBA_USERSテーブルのACCOUNT_STATUSの説明
dba_usersの詳細情報の確認、対象ユーザのProfileの確認
以下SQLでカラムを絞らずに*(アスタリスク)でdba_usersの情報を確認してみる。
select * from dba_users;
アカウント期限切れの日付が入る『EXPIRY_DATE』は「2020-10-30」。
ユーザー作成日の『CREATED』は「2020-02-24」。
ProfileがDefaultであることが確認できます。
ユーザーの最終ログインの『LAST_LOGIN』は「2020-10-23」。
単純計算で「2020-02-24」の180日後は「2020-08-22」ごろだと思うのですが、最終ログインが「2020-10-23」なので180日前の「2020-04-26」ごろに、パスワードを変更しているようです。全く覚えてませんが。。。
最終ログイン(2020-10-23)の7日後(2020-10-30)にアカウント期限切れ(EXPIRY_DATE)になっていることも分かります。
LOCK_DATEが空なのは、「ACCOUNT_STATUS」が「EXPIRED & LOCKED」ではなく「EXPIRED」だからだと思います。アカウント自体はロックされておらず、あくまでも期限切れのステータスって状態のようです。
パスワードの有効期限の確認
SELECT * FROM DBA_PROFILES
WHERE RESOURCE_NAME = 'PASSWORD_LIFE_TIME';
DEFAULTのプロファイルの「RESOURCE_LIMIT」をみると「180」となっており、パスワードの有効期限は180日であることが確認できました。
「ORA-28001:パスワードが期限切れです。」エラーの対処・解決方法
対処・解決方法としては、以下のような方法があります。
【1】ユーザーのパスワードを再設定し、アカウントのロックを解除する方法
【2】デフォルトプロファイルのパスワード有効期限を無期限や180日より長い日に設定し、パスワードを再設定、アカウントのロックを解除する方法
【3】ユーザーのパスワードを再設定する
※今回の私の状態は期限きれでユーザー・アカウントはロックされていなかったので、パスワードの変更だけで解決しました。(EXPIRED & LOCKEDではなく、EXPIREDのみの状態はパスワード再設定のみで良い)
では、対処・解決方法の手順を以下に記載します。
1.コマンドプロンプトで以下を入力して、SQLPLUSで管理者として接続します。
sqlplus / as sysdba
2.パスワードの有効期限を変更する (やってもやらなくても良いです)
--パスワードの有効期限を無期限にするSQL
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;
UNLIMITEDを日数に変更するだけで、有効期限の日数を変更するSQLになります。
--パスワードの有効期限を300日にするSQL
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME 300;
3.パスワードを変更する
ALTER USER ユーザ名 IDENTIFIED BY 新パスワード
※今回の私の状態では、パスワードを変更するだけで接続できるようになりました。パスワード再設定により、DBA_USERSテーブルのACCOUNT_STATUSも「OPEN」となり接続可能でした。
4.ユーザーアカウントのロックの解除
ALTER USER ユーザ名 ACCOUNT UNLOCK
以下SQLで
SELECT USERNAME, ACCOUNT_STATUS, LOCK_DATE from dba_users;
対象ユーザの「ACCOUNT_STATUS」が「OPEN」であれば接続ができます。
「ORA-28001:パスワードが期限切れです。」について学んだこと
「ACCOUNT_STATUS」が「EXPIRED」の場合はパスワードの再設定のみで解決します。
「ACCOUNT_STATUS」が「EXPIRED & LOCKED」の場合は、パスワードの再設定とロックの解除が必要です。