ALTER USER ACCOUNT LOCK仅禁用新登录,不影响已有会话、后台作业、权限及同义词;需显式UNLOCK才能恢复登录,改密码不自动解锁;LOCKED与LOCKED(TIMED)本质不同,后者由PROFILE触发且可超时自动解。
ALTER USER ACCOUNT LOCK 会立即禁用登录,但不阻止已存在的会话
执行 alter user account lock 后,新连接立刻被拒绝(报错 ora-28000: the account is locked),但当前已建立的会话仍可继续运行、提交事务、甚至执行 dml。这不是 bug,是 oracle 的会话隔离设计决定的。
实操建议:
- 锁定前用
SELECT sid, serial#, username, status FROM v$session WHERE username = 'USERNAME'检查活跃会话 - 如需立即终止已有连接,得配合
ALTER SYSTEM KILL SESSION '<code>sid,serial#'(注意加单引号) - 批量杀会话可写脚本:查询
v$session生成 kill 语句,再执行
锁定后密码仍可被修改,ACCOUNT LOCK 不等同于密码失效
ACCOUNT LOCK 只控制认证入口,不影响密码管理权限。DBA 或用户自己(若未禁用 ALTER USER 权限)仍能执行 ALTER USER ... IDENTIFIED BY 修改密码——锁住的账户改完密码后,依然锁着,不会自动解锁。
常见错误现象:运维以为“改了密码就等于解了锁”,结果下次登录还是 ORA-28000。
实操建议:
- 确认账户状态用
SELECT account_status FROM dba_users WHERE username = 'USERNAME',返回值应为LOCKED(不是EXPIRED & LOCKED或LOCKED(TIMED)) - 不要依赖密码修改动作来判断是否解锁,必须显式执行
ALTER USER ... ACCOUNT UNLOCK
LOCKED(TIMED) 和 LOCKED 的区别常被忽略
账户可能因连续登录失败触发 FAILED_LOGIN_ATTEMPTS 限制,此时状态是 LOCKED(TIMED),表示带时间窗口的自动锁定(默认 1 天)。而 ALTER USER ... ACCOUNT LOCK 产生的是永久性 LOCKED,除非人工解锁。
两者行为差异直接影响应急响应:
-
LOCKED(TIMED):等待超时或 DBA 手动UNLOCK;不能靠改密码恢复 -
LOCKED(手动锁):只能由 DBA 显式UNLOCK;即使重置密码也不生效 - 查具体原因看
dba_users.account_status和dba_profiles.limit中对应 profile 的FAILED_LOGIN_ATTEMPTS设置
使用 PROFILE 控制自动锁定比手动 LOCK 更适合长期策略
对需要防暴力破解或定期停用的账户,硬编码 ALTER USER ... ACCOUNT LOCK 容易遗漏、难审计。更稳妥的做法是绑定 PROFILE,例如:
CREATE PROFILE temp_lock_profile LIMIT FAILED_LOGIN_ATTEMPTS 3; ALTER USER scott PROFILE temp_lock_profile;
这样账户在第 4 次输错密码后自动变成 LOCKED(TIMED),符合安全基线要求。
注意点:
- 一个用户只能有一个 PROFILE;切换 PROFILE 会覆盖原有密码策略
- PROFILE 中的
PASSWORD_LOCK_TIME决定锁定时长,设为UNLIMITED则等效于手动 LOCK 的永久效果 - 生产环境修改 PROFILE 前,务必用
SELECT * FROM dba_profiles WHERE profile = '...'确认当前配置,避免误锁大量用户
真正容易被忽略的是:ACCOUNT LOCK 不阻断后台作业(如 DBMS_SCHEDULER job)、不撤销对象权限、也不影响同义词或角色继承——它只关认证门,别的都照常运转。要彻底隔离一个用户,得组合处理会话、作业、权限、甚至应用连接池配置。


















