Oracleでログインに失敗し続けたり、パスワードが期限切れになるとアカウントがロックされます。本記事ではロック状態の確認・解除・原因調査・パスワードポリシーの見直しまで一連の手順を体系的に解説します。
ACCOUNT_STATUSの種類
DBA_USERSのACCOUNT_STATUS列は以下の値をとります。
| ACCOUNT_STATUS |
意味と対処 |
| OPEN |
正常。ログイン可能 |
| LOCKED |
ロック中。ACCOUNT UNLOCKで解除 |
| LOCKED(TIMED) |
一定時間後に自動解除されるロック(PASSWORD_LOCK_TIME経過後) |
| EXPIRED |
パスワード期限切れ。次回ログイン時にパスワード変更を求められる |
| EXPIRED & LOCKED |
期限切れ+ロックの複合状態。UNLOCK後にパスワード変更が必要 |
| EXPIRED(GRACE) |
猶予期間中。まだログイン可能だがパスワード変更を促される |
ロック状態のユーザーを確認する
SQL — ロック・期限切れユーザーを一覧確認
-- ロックまたはEXPIREDのユーザーを一覧表示
SELECT username,
account_status,
lock_date,
expiry_date
FROM dba_users
WHERE account_status NOT IN ('OPEN')
ORDER BY account_status, username;
-- 特定ユーザーのステータスを確認
SELECT username, account_status, lock_date, expiry_date
FROM dba_users
WHERE username = 'HR';
アカウントのロックを解除する
SQL — ACCOUNT UNLOCK でロック解除
-- ロック解除(DBA権限が必要)
ALTER USER hr ACCOUNT UNLOCK;
-- 解除後にOPENになったか確認
SELECT username, account_status
FROM dba_users
WHERE username = 'HR';
接続方法: ロック解除には ALTER USER 権限または DBA権限が必要です。SQL*Plus で接続する場合は sqlplus / as sysdba(OS認証)または sqlplus sys/パスワード as sysdba で接続します。
パスワード期限切れ(EXPIRED)の場合
ステータスが EXPIRED または EXPIRED & LOCKED の場合は、ロック解除に加えてパスワードの再設定が必要です。
SQL — ロック解除+パスワード再設定を同時に行う
-- パスワード再設定(EXPIREDを解除)
ALTER USER hr IDENTIFIED BY "NewP@ssword2024";
-- ロック解除とパスワード変更を1文で
ALTER USER hr
IDENTIFIED BY "NewP@ssword2024"
ACCOUNT UNLOCK;
-- パスワードを期限切れにして次回ログイン時に変更を強制
ALTER USER hr PASSWORD EXPIRE;
ロックの原因を調査する
失敗ログイン回数の上限を確認する
ユーザーに適用されているプロファイルの FAILED_LOGIN_ATTEMPTS 設定を確認します。
SQL — プロファイルの失敗回数上限とロック時間を確認
-- ユーザーが使用しているプロファイルを確認
SELECT username, profile
FROM dba_users
WHERE username = 'HR';
-- プロファイルのパスワードポリシーを確認
SELECT profile, resource_name, limit
FROM dba_profiles
WHERE resource_type = 'PASSWORD'
AND profile = 'DEFAULT'
ORDER BY resource_name;
| RESOURCE_NAME |
意味 |
| FAILED_LOGIN_ATTEMPTS |
連続失敗でロックされるまでの回数(Oracleデフォルト: 10) |
| PASSWORD_LOCK_TIME |
ロック継続時間(UNLIMITED の場合は手動解除が必要) |
| PASSWORD_LIFE_TIME |
パスワードの有効期限(日数。デフォルト: 180日) |
| PASSWORD_GRACE_TIME |
期限切れ後の猶予期間(日数) |
| PASSWORD_REUSE_TIME |
同じパスワードを再使用できるまでの日数 |
プロファイルのポリシーを変更する
SQL — FAILED_LOGIN_ATTEMPTS と PASSWORD_LOCK_TIME の変更
-- DEFAULTプロファイルの失敗許容回数を変更
ALTER PROFILE DEFAULT LIMIT
FAILED_LOGIN_ATTEMPTS 5 -- 5回失敗でロック
PASSWORD_LOCK_TIME 1/24; -- 1時間後に自動解除
-- パスワード有効期限を無制限に(変更不要な環境向け)
ALTER PROFILE DEFAULT LIMIT
PASSWORD_LIFE_TIME UNLIMITED;
-- 失敗回数上限を無制限(ロックしない設定)
ALTER PROFILE DEFAULT LIMIT
FAILED_LOGIN_ATTEMPTS UNLIMITED;
注意: FAILED_LOGIN_ATTEMPTS UNLIMITED や PASSWORD_LIFE_TIME UNLIMITED は管理の簡便さのために使われますが、セキュリティポリシーに反する場合があります。本番環境では組織のセキュリティ基準に従って設定してください。
ロック解除の全体フロー
| 手順 |
操作 |
コマンド |
| 1 |
SYSDBAで接続 |
sqlplus / as sysdba |
| 2 |
ステータスを確認 |
SELECT username, account_status FROM dba_users WHERE username = ‘対象’; |
| 3 |
ロック解除 |
ALTER USER 対象 ACCOUNT UNLOCK; |
| 4 |
EXPIRED の場合はPW変更 |
ALTER USER 対象 IDENTIFIED BY "新パスワード"; |
| 5 |
解除確認 |
SELECT username, account_status FROM dba_users WHERE username = ‘対象’; |
❓ よくある質問(FAQ) ▲ クリックで開閉
Q. ACCOUNT UNLOCKしたのにすぐまたロックされる。なぜか?
A. アプリケーションが古いパスワードで自動接続を試み続けているケースが多いです。アプリ側の接続設定(DataSource, connection pool等)のパスワードを更新してから再試行してください。それでも繰り返す場合は FAILED_LOGIN_ATTEMPTS の値を増やすか、UNLIMITED に変更することも検討します。
Q. SYSDBAに接続できない場合はどうすればよいか?
A. OS認証(sqlplus / as sysdba)が利用できない場合は、oracleOS ユーザーでログインしてから試みるか、リスナーが起動しているか確認してください。また REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE 設定があれば sqlplus sys/パスワード@接続文字列 as sysdba で接続できます。
Q. LOCKED(TIMED)は手動解除不要か?
A. PASSWORD_LOCK_TIME で設定した時間が経過すれば自動的に解除されます。ただし、自動解除を待たずに今すぐアクセスさせたい場合は ALTER USER ユーザー名 ACCOUNT UNLOCK で手動解除できます。