oracle 19c默认启用强密码策略(如verify_function_19c),导致alter user失败并非语法错误,而是因新密码不满足至少8位、三类字符组合、禁用字串等校验要求;须禁用策略临时修改或构造合规密码(如mydb!2026#),并同步更新密码文件、应用连接串及解锁账户。

Oracle 19c 安装完必须立刻改掉 sys/change_on_install 和 system/manager 这类默认密码,否则数据库一上线就等于裸奔;但直接 ALTER USER ... IDENTIFIED BY 不够,因为 19c 默认启用强密码策略,新密码不合规会报 ORA-28003,不是语法错,是策略拦的。
为什么 ALTER USER 失败?——密码策略在后台自动生效
Oracle 19c 安装后默认启用 VERIFY_FUNCTION_19C(或 ORA12C_STRONG_VERIFY_FUNCTION),它强制要求:
- 至少 8 位字符
- 必须含大写字母、小写字母、数字、特殊字符中的至少三类
- 不能包含用户名、
oracle、ORACLE等常见子串 - 不能是字典常见词(如
password、admin123)
所以执行 ALTER USER sys IDENTIFIED BY abc123 会直接报 ORA-28003: password verification failed。这不是命令写错,是策略校验没过。
怎样安全修改密码又绕过策略陷阱?
两种合法路径,按场景选:
- 如果只是临时应急、测试环境,且你有
/ as sysdba权限:先禁用策略再改密,命令是ALTER PROFILE DEFAULT LIMIT PASSWORD_VERIFY_FUNCTION NULL;,改完立即执行ALTER USER sys IDENTIFIED BY MyP@ssw0rd2026;,之后再恢复策略(见下一条) - 生产环境严禁禁用策略:直接构造合规密码。推荐组合法——比如用
MyDB!2026#(大写+小写+数字+特殊符,8位以上,无用户名子串),再加个前缀或后缀防撞库,如ProdSys_MyDB!2026# - 改完必须验证:运行
SELECT username, account_status, password_versions FROM dba_users WHERE username IN ('SYS', 'SYSTEM');,确认状态为OPEN,且PASSWORD_VERSIONS包含12A或19C
改完密码后必须同步检查的三件事
很多人以为 ALTER USER 成功就万事大吉,其实漏掉这些,密码照样失效或被锁:
-
sqlplus sys/MyP@ssw0rd2026 as sysdba能连上,不代表应用能连——检查应用连接字符串里是否还硬编码着旧密码或拼错了as sysdba(中间多空格就降级成普通认证,报ORA-01017) - 如果数据库启用了密码文件认证(比如远程 DBA 登录),改完用户密码后,
orapwd文件不会自动更新,旧文件仍有效;但若你后续重建了密码文件,里面SYS密码必须和这次ALTER USER设的一致,否则远程sys登录失败 - 检查
FAILED_LOGIN_ATTEMPTS和PASSWORD_LOCK_TIME参数:默认策略可能设了 10 次输错就锁账户 1 天,第一次改密后自己手抖输错几次,SYS就被锁死,得用ALTER USER sys ACCOUNT UNLOCK;解锁
真正卡住人的从来不是“怎么改密码”,而是改完后没人去核对密码文件是否同步、应用配置是否刷新、账户是否意外被锁——这些细节不眼见为实(比如 ls -l $ORACLE_HOME/dbs/orapw* 看大小,SELECT ... FROM dba_profiles 查策略参数),光靠 SQL*Plus 回车成功就收工,迟早半夜被告警叫醒。











