FAILED_LOGIN_ATTEMPTS是profile级参数,非数据库实例参数,故ALTER SYSTEM SET会报ORA-02095错误;必须用ALTER PROFILE在同一条语句中同步设置FAILED_LOGIN_ATTEMPTS和PASSWORD_LOCK_TIME,否则账户可能永久锁定。
必须用 alter profile 设置 failed_login_attempts 和 password_lock_time 两个参数,缺一不可;只设前者会导致账户永久锁定。
为什么 ALTER SYSTEM SET failed_login_attempts = 3 一定失败?
因为 FAILED_LOGIN_ATTEMPTS 不是数据库实例参数,而是 profile 级配置。Oracle 会直接报错 ORA-02095: specified initialization parameter cannot be modified。
-
ALTER SYSTEM只能改sga_target、db_name这类全局参数 -
FAILED_LOGIN_ATTEMPTS必须绑定到 profile(如DEFAULT)上才生效 - 所有新创建用户默认使用
DEFAULTprofile,但已有用户可能指定了其他 profile(查dba_users.profile确认)
怎么安全地设置“输错3次就锁”?
关键是一条语句同时设置两个参数,单位和取值要准确:
- 执行:
ALTER PROFILE DEFAULT LIMIT FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LOCK_TIME 1/24;(锁 1 小时) -
PASSWORD_LOCK_TIME单位是“天”,1/24表示 1 小时,0表示锁住但不自动解锁,UNLIMITED表示永久锁定 - 不能分两次执行:先设
FAILED_LOGIN_ATTEMPTS再设PASSWORD_LOCK_TIME,中间若被其他语句覆盖,就会出问题 - 如果用户用了非
DEFAULTprofile(比如app_profile),得改成ALTER PROFILE app_profile LIMIT ...
怎么验证真的生效了?
别信 SQL*Plus 显示 “Statement processed”,要动手查、动手试:
- 查落地结果:
SELECT resource_name, limit FROM dba_profiles WHERE profile = 'DEFAULT' AND resource_name IN ('FAILED_LOGIN_ATTEMPTS', 'PASSWORD_LOCK_TIME'); - 用目标用户(如
scott)在 SQL*Plus 或 JDBC 中连续输错 3 次密码,第 4 次必须立即报ORA-28000: the account is locked - 常见失效原因:用户实际用的不是
DEFAULTprofile;连接工具(Navicat/PLSQL Dev)缓存旧 session;后续有其他ALTER PROFILE覆盖了设置
账号被锁后,等时间到了会自动恢复吗?
不会。哪怕你设了 PASSWORD_LOCK_TIME 1/24,锁住后账户状态仍是 LOCKED,仍需 DBA 手动执行 ALTER USER scott ACCOUNT UNLOCK 才能登录。
PASSWORD_LOCK_TIME 控制的是“从锁定开始算起,多久之后允许再次尝试”,不是“自动解锁倒计时”。它只影响后续登录行为是否被拒绝,不改变账户的 ACCOUNT_STATUS 字段值。


















