ora-28000 表示用户账户被锁定,需用dba权限执行alter user ... account unlock;确认方式是查dba_users中account_status为locked或locked(timed)且lock_date非空。

ORA-28000 不是密码错、连不上或配置问题,而是 Oracle 明确将该用户状态设为 LOCKED 或 LOCKED(TIMED) —— 解锁必须用 DBA 权限执行 ALTER USER ... ACCOUNT UNLOCK,其他操作全无效。
怎么确认用户真被锁了(不是猜)
别凭报错就动手解锁。先连 DBA 账号(如 sys 或 system),查 dba_users 看真实状态:
-
account_status是LOCKED(人工锁)或LOCKED(TIMED)(输错触发)才对应 ORA-28000 -
lock_date非空 = 已锁;为空 = 没锁 -
expiry_date若已过期,解锁后仍会报ORA-28001,得同步重置密码
执行:
SELECT username, account_status, lock_date, expiry_date FROM dba_users WHERE username = 'YOUR_USER';
用 ALTER USER ... ACCOUNT UNLOCK 解锁的实操要点
这条语句本身极简,但踩坑点集中:
- 必须用有
ALTER ANY USER或DBA角色的账号执行(sqlplus / as sysdba最稳) - 用户名大小写敏感:若建库时用了双引号(如
"MyUser"),这里也得写ALTER USER "MyUser" ACCOUNT UNLOCK - 不需
COMMIT—— DDL 立即生效,执行完就解锁了 - 如果同时要改密码,写成一条:
ALTER USER your_user IDENTIFIED BY new_pass ACCOUNT UNLOCK
图形工具(Navicat / PL/SQL Dev)里容易漏掉的关键动作
点几下看似简单,但失效率高:
- 登录工具时,角色必须选
Sysdba或Sysoper;用Normal模式根本看不到 Users 列表 - 编辑用户后,“账户被锁住”勾选框取消 ≠ 生效 —— 必须点
Apply(不是OK或Close) - 某些 PL/SQL Developer 版本(如 14+)在改密码时,若 profile 启用了密码过期策略,还得额外勾选“强制修改密码”,否则下次登录仍卡在
ORA-28001
为什么刚解锁 5 分钟又锁了?重点查这些地方
真正麻烦的从来不是那条 ALTER USER 命令,而是背后持续刷错密码的源头:
-
DBLINK的密码没更新:CREATE DATABASE LINK ... CONNECT TO user IDENTIFIED BY "old_pass" - Java 应用、ETL 脚本、连接池配置里硬编码了旧密码,重启前没改
- 监控脚本或定时任务在后台静默重连,错误日志藏在
$ORACLE_HOME/diag/tnslsnr/*/listener/trace/listener.log里 - 临时放宽
FAILED_LOGIN_ATTEMPTS可辅助排查(ALTER PROFILE DEFAULT LIMIT FAILED_LOGIN_ATTEMPTS 30),但生产环境绝不设UNLIMITED
锁住本身是安全机制,反复锁住说明下游依赖没同步——这比命令多敲十遍都关键。











