ORA-28000表示账户真实被锁,非密码错误;须用DBA权限查dba_users确认account_status及lock_date/exiry_date,再执行ALTER USER ... ACCOUNT UNLOCK或带IDENTIFIED BY重置密码,并同步更新所有下游旧凭据。

ORA-28000不是密码错,是账户真被锁了
看到 ORA-28000: the account is locked,别急着改应用配置或重连 JDBC URL——这个错误和网络、驱动、连接串格式全无关系。Oracle 已明确把 account_status 设为 LOCKED、EXPIRED & LOCKED(TIMED) 等非 OPEN 值,后续任何登录(哪怕密码完全正确)都会直接报此错。
常见诱因只有两个:FAILED_LOGIN_ATTEMPTS 被触发(默认 10 次输错就锁),或 DBA 手动执行过 ALTER USER ... ACCOUNT LOCK。临时改密码、换端口、升级驱动,统统无效。
先查真实状态,再动手解锁
用 SYS 或 SYSTEM 登录后,必须先运行这条语句确认细节:
SELECT username, account_status, lock_date, expiry_date FROM dba_users WHERE username = 'YOUR_USERNAME';
lock_date 非空 → 真锁了;expiry_date 已过 → 密码已失效,只 ACCOUNT UNLOCK 不行,登录仍会报 ORA-28001。
-
account_status是LOCKED:大概率人工锁定或 profile 触发,用ALTER USER scott ACCOUNT UNLOCK;即可 -
account_status是EXPIRED & LOCKED(TIMED):密码过期 + 输错超限,必须带密码重置:ALTER USER scott IDENTIFIED BY newpass ACCOUNT UNLOCK; - 用户名建时用了双引号(如
"MyUser"):解锁时引号不能丢,ALTER USER "MyUser" ACCOUNT UNLOCK;
图形工具里点“取消锁定”不生效?检查 Apply 和角色
Navicat / PL/SQL Developer 点几下就能操作,但两个坑常被忽略:
- 必须用
Sysdba或Sysoper角色登录,普通Normal模式根本看不到 Users 列表 - 在用户编辑界面取消“账户被锁住”勾选框后,一定要点 Apply,不是点 OK 或关闭窗口——后者不提交,等于没操作
- PL/SQL Dev 14+ 版本中,若密码策略要求强制修改,还需额外勾选“下次登录时更改密码”,否则仍可能卡在
ORA-28001
刚解锁五分钟又锁?问题不在数据库,在下游配置
真正麻烦的从来不是那条 ALTER USER,而是没人去核对所有还在用旧密码的地方:
-
DBLINK的密码没同步更新:CREATE DATABASE LINK ... CONNECT TO user IDENTIFIED BY "old_pass" - Spring Boot 的
application.yml、Druid/HikariCP 连接池配置、Kettle 作业、Prometheus 监控脚本、Jenkins 构建参数里硬编码的凭据 - ETL 工具或定时任务持续重试,失败日志里能定位到来源 IP 和
PROGRAM名称
临时放宽策略(如 ALTER PROFILE DEFAULT LIMIT FAILED_LOGIN_ATTEMPTS 30)只用于排查,生产环境绝不设 UNLIMITED——它绕过安全轮转,不如用 Oracle Wallet 或外部凭证管理器。


















