oracle 19c rac中密码文件必须由asm统一托管,即所有节点共享同一asm路径下的密码文件(如+data/cdb1/password/pwdcdb1.256.123456789),本地$oracle_home/dbs/orapw$oracle_sid需为指向该asm文件的软链接,且remote_login_passwordfile=shared,否则会导致节点间认证不一致、ora-01017等随机登录失败。
确认密码文件是否被asm统一托管
oracle 19c rac 默认要求所有节点共享同一物理密码文件,且该文件必须位于 asm 中,而不是各节点本地的 $oracle_home/dbs/orapw$oracle_sid。若你发现不同节点上 sqlplus / as sysdba 行为不一致(一个能进,另一个报 ora-01017 或 ora-01031),第一件事是查真实路径:
- 用
grid用户执行:srvctl config database -d <db_unique_name></db_unique_name>,确认输出中Password file:行指向 ASM 路径(如+DATA/CDB1/PASSWORD/pwdcdb1.256.123456789) - 若显示本地路径(如
/u01/app/oracle/dbs/orapwcdb1)或为空,说明配置未生效,RAC 实例启动时会忽略本地文件 - 进一步验证:
SELECT * FROM v$passwordfile_info;应返回一条记录且TYPE列为ASM;若无结果或TYPE是FILE,则当前实例没加载 ASM 密码文件
检查各节点 orapw$ORACLE_SID 是否为软链接
RAC 节点不能各自维护独立的二进制密码文件——orapwd 生成的文件含节点绑定元数据,强行复制会导致 ORA-12641 或静默认证失败。正确做法是让所有节点的本地 orapw$ORACLE_SID 指向同一个 ASM 文件:
- 在每个节点上运行:
ls -l $ORACLE_HOME/dbs/orapw*,确认它是软链接而非真实文件 - 正确链接示例:
ln -sf +DATA/CDB1/PASSWORD/pwdcdb1.256.123456789 $ORACLE_HOME/dbs/orapwcdb1 - 链接必须由
oracle用户创建,且remote_login_passwordfile参数需设为SHARED(用srvctl modify database -d cdb1 -p "remote_login_passwordfile=SHARED"设置) - 若看到真实文件(非链接),立刻删掉并重建链接,否则节点间密码变更不会同步
同步 SYS 密码时必须用 asmcmd pwcopy,不是 cp 或 orapwd
ALTER USER SYS IDENTIFIED BY ... 只更新当前节点内存中的凭据,不会自动刷新 ASM 密码文件。手动改密后若不显式同步,其他节点仍用旧哈希校验,就会随机报 ORA-01017:
- 先在任一节点执行:
ALTER USER sys IDENTIFIED BY newpass; - 然后立即用
asmcmd(非 shellcp)原子同步:pwcopy +DATA/CDB1/PASSWORD/pwdcdb1.256.123456789 +DATA/CDB1/PASSWORD/pwdcdb1_new -
pwcopy保留校验和与内部结构,普通cp会破坏文件一致性,导致部分节点加载失败 - 同步后重启所有实例(或至少重启未更新节点),确保新文件被重新读取
验证 v$passwordfile_info 和远程连接路径
即使文件存在、链接正确、参数设对,仍可能因路径硬匹配失败而报错。Oracle 认证时严格按 INSTANCE_NAME 构造文件名,不认 ORACLE_SID 环境变量或 DB_NAME:
- 查当前实例名:
SELECT INSTANCE_NAME FROM V$INSTANCE;,假设返回cdb11,那密码文件在 ASM 中必须叫pwdcdb11(不是pwdcdb1) - 远程连接时(如
sqlplus sys/pass@cdb1_scan as sysdba),数据库会根据服务名解析出目标实例名,再拼出对应 ASM 路径 - 若备库或 ADG 场景下主备实例名不同(如主库
rac1,备库stby1),必须各自维护独立的 ASM 密码文件,且名字严格匹配各自INSTANCE_NAME - 最后验证:在目标节点执行
orapwd describe file='+DATA/.../pwdxxx',输出中必须有SYS行且SYSDBA列为TRUE
真正麻烦的不是生成文件,而是让所有节点“同时认同一个字节流”。哪怕只差一个节点没做软链接,或者实例名和 ASM 文件名差一个字符,都会导致连接在节点间随机失败——这种问题不会报错说“链接到了错误节点”,只会安静地拒绝登录。











