Oracle 11g默认启用FAILED_LOGIN_ATTEMPTS=10的自动锁定策略,但实际生效需确认用户所用profile及其对应限制值;若PASSWORD_LIFE_TIME过期,仅解锁仍无法登录,须重置密码或禁用过期机制。

Oracle 11g 默认就启用了登录失败自动锁定策略,无需额外开启——关键在于它默认启用的 FAILED_LOGIN_ATTEMPTS 限制是生效的,但常被误认为“没起作用”,其实是没查对 profile 或用户没关联到 default。
确认当前 FAILED_LOGIN_ATTEMPTS 实际生效值
很多人执行 SELECT * FROM dba_profiles WHERE resource_name = 'FAILED_LOGIN_ATTEMPTS'; 后看到结果为 10,就以为锁定了,但实际是否生效,还要看该 profile 是否被目标用户使用。常见错误是:用户创建时指定了非 default 的 profile,而你只改了 default。
- 先查用户用的哪个 profile:
SELECT username, profile FROM dba_users WHERE username = 'YOUR_USER'; - 再查该 profile 的限制值:
SELECT resource_name, limit FROM dba_profiles WHERE profile = 'YOUR_PROFILE' AND resource_name = 'FAILED_LOGIN_ATTEMPTS'; - 注意大小写:profile 名默认大写,
DEFAULT是字符串,不是关键字 - 如果 limit 是
UNLIMITED或空(NULL),那这个用户永远不会因输错密码被锁
修改 FAILED_LOGIN_ATTEMPTS 限制值(含生产建议)
直接改 DEFAULT profile 最省事,但要注意:所有未显式指定 profile 的新用户都会继承它。设成 UNLIMITED 虽解一时之急,却绕过安全基线(等保要求通常不允许无限制)。
- 设为 5 次锁定(比默认 10 更严格):
ALTER PROFILE DEFAULT LIMIT FAILED_LOGIN_ATTEMPTS 5; - 设为永久不锁(仅测试环境建议):
ALTER PROFILE DEFAULT LIMIT FAILED_LOGIN_ATTEMPTS UNLIMITED; - 若用户用了自定义 profile(如
APP_USER_PROF),必须明确改它:ALTER PROFILE APP_USER_PROF LIMIT FAILED_LOGIN_ATTEMPTS 3; - 修改立即生效,**不需要重启数据库或重连会话**
为什么解锁后还是登不上?别漏了 PASSWORD_LIFE_TIME
ORA-28000 常被当成纯“锁定”问题,但 Oracle 11g 中,PASSWORD_LIFE_TIME 过期也会导致 ACCOUNT_STATUS 显示为 EXPIRED(GRACE) 或 EXPIRED & LOCKED,此时仅 ALTER USER ... ACCOUNT UNLOCK 不够。
- 查状态:
SELECT username, account_status, lock_date, expiry_date FROM dba_users WHERE username = 'YOUR_USER'; - 如果
expiry_date已过期,需重置密码:ALTER USER YOUR_USER IDENTIFIED BY newpass; - 长期方案是禁用过期机制:
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED; - 注意:
PASSWORD_LOCK_TIME控制锁定持续天数(默认 1 天),不是锁定触发条件
验证锁定行为是否真实触发
手动模拟 3 次失败登录来验证,比查配置更可靠。但注意:每次失败必须是独立连接,且不能用 / as sysdba(它绕过 profile 检查)。
- 用普通用户尝试:
sqlplus your_user/wrongpass@your_db,连续输错 3 次(按你设的值) - 第 N+1 次应报:
ORA-28000: the account is locked - 检查状态:
SELECT account_status FROM dba_users WHERE username = 'YOUR_USER';应返回LOCKED - 若仍能登录,大概率是用户 profile 不匹配,或客户端缓存了旧连接(比如 PL/SQL Developer 保持长连接)
真正容易被忽略的是 profile 关联关系和密码过期的叠加效应——一个用户可能同时被 FAILED_LOGIN_ATTEMPTS 锁定、又被 PASSWORD_LIFE_TIME 标记为过期,此时只执行解锁命令不会恢复可用状态。











