Oracle账户被锁定需先以sqlplus / as sysdba本地登录,再执行ALTER USER username ACCOUNT UNLOCK;若同时密码过期,须追加ALTER USER username IDENTIFIED BY newpass。
本地服务器上操作时,sqlplus / as sysdba 是最可靠的方式——它不依赖数据库密码,而是靠操作系统权限(比如 oracle 用户)认证。如果直接输 sqlplus sys/xxx as sysdba 却报 ORA-01017: invalid username/password,说明你卡在登录环节,不是用户锁了,是连不上库。
常见错误现象:远程连接时硬套这个命令,结果失败。因为 / as sysdba 默认只允许本地 OS 认证,远程需配置 sqlnet.ora 并启用 SQLNET.AUTHENTICATION_SERVICES = (NTS)(Windows)或 (BEQ)(Linux),否则必须用密码方式登录。
id -un 输出 oracle)$ORACLE_HOME 已设置,且 $PATH 包含 $ORACLE_HOME/bin
sqlplus / as sysdba 后看到 Connected to: Oracle Database... 才算真正进去了账户锁定和密码过期是两回事:锁了可能只是输错 5 次,但密码本身还有效;过期则可能状态是 EXPIRED(GRACE) 或 EXPIRED。只解锁不改密,下次登录仍可能因密码过期被拦;只改密不解锁,语句会报 ORA-28000: the account is locked。
所以顺序不能乱,且两条语句都得显式提交(虽然 DDL 默认自动 commit,但养成加 COMMIT; 的习惯更稳妥):
ALTER USER scott ACCOUNT UNLOCK;
ALTER USER scott IDENTIFIED BY newpass123;
COMMIT;
"Scott"),这里也得写成 "Scott"
@、/)要加单引号包裹:IDENTIFIED BY 'p@ss/w0rd'
ORA-28003: password verification failed
执行解锁前,先确认目标用户当前状态,避免白忙活。运行:
SELECT username, account_status, expiry_date FROM dba_users WHERE username = 'SCOTT';
返回的 account_status 可能是这些值:
OPEN:正常,不用动LOCKED 或 LOCKED(TIMED):输错密码被锁,需 ACCOUNT UNLOCK
EXPIRED:密码过期且宽限期已过,必须改密EXPIRED(GRACE):还能登 3 次,但登录后强制改密,此时可只改密不解锁EXPIRED & LOCKED:同时发生,两条命令都得跑注意:expiry_date 为 null 表示密码永不过期(概要文件设为 UNLIMITED),这时候锁了就只是锁,跟密码无关。
有人一遇到批量用户锁住,就想“干脆把密码有效期关掉”,于是执行:
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;
这确实能防再锁,但风险在于:它影响所有用 DEFAULT 概要文件的新建用户,且无法回滚到之前策略(除非手动记下原值)。如果审计要求密码 90 天必须轮换,这么干等于绕过合规。
更稳妥的做法是:
ALTER USER ... IDENTIFIED BY ... ACCOUNT UNLOCK)no_expire_profile),再 ALTER USER scott PROFILE no_expire_profile
最后提醒一句:所有操作必须在维护窗口内执行,ALTER USER 虽是 DDL 不阻塞查询,但若用户正在事务中,解锁瞬间可能触发会话中断——这点容易被忽略。