ora-01017在dg环境中常因连错角色或密码文件不同步导致:需确认是否误连只读备库、检查主备密码文件是否独立维护且内容一致、验证remote_login_passwordfile为exclusive,并通过v$database和v$passwordfile_info定位真实路径与状态。
ora-01017报错时先确认是不是连对了dg角色和实例
ora-01017在dg环境里常被误判为密码问题,实际可能是连到了只读的物理备库(open_mode = read only with apply)却用主库账号去登录。物理备库默认禁止普通用户写操作,但更关键的是:sysdba连接必须依赖密码文件,而dg中主备的密码文件是独立维护的——哪怕主库改了密码,备库不会自动同步。
验证方式很简单:
- 在备库服务器上执行
sqlplus / as sysdba,如果能进,说明本地密码文件有效; - 再试
sqlplus sys/xxx@standby_alias as sysdba,失败才指向远程认证路径问题; - 查
SELECT sys_context('USERENV','DB_NAME'), DATABASE_ROLE FROM v$database;确认当前实例名和角色,避免tnsnames.ora里 service_name 指向了主库别名。
检查密码文件是否真被RAC或ASM接管了
Oracle 19c RAC默认把密码文件放在ASM磁盘组里,而不是传统的 $ORACLE_HOME/dbs/orapw<sid></sid>。如果你用 orapwd 在本地生成了文件,但数据库启动时仍从ASM加载,那本地文件就完全无效。
查真实位置:
- 在任意节点执行
srvctl config database -d <db_unique_name></db_unique_name>,看输出中Password file字段; - 或直接查视图:
SELECT * FROM v$passwordfile_info;,返回的FILE_NAME就是ASM路径(如+DATA/ORCL/PASSWORD/pwdrac19c.256.1047615941); - 如果该ASM路径下文件不存在(比如重建过磁盘组),或者
remote_login_passwordfile参数是EXCLUSIVE但文件不可读,就会触发ORA-01017。
手动同步密码文件的两种安全做法
不能直接拷贝二进制文件到ASM(风险高、易损坏),必须走Oracle官方支持的方式:
-
方案一(推荐):用
orapwd重新生成并注入ASM
在主库节点执行:orapwd file='+DATA/ORCL/PASSWORD/pwdrac19c' format=12.2 force=y,其中format=12.2兼容19c,force=y覆盖已有; -
方案二:临时切回本地文件
用srvctl modify database -d orcl -pwfile ''清空密码文件路径,重启实例后它会自动 fallback 到$ORACLE_HOME/dbs/orapworcl;再用orapwd file=$ORACLE_HOME/dbs/orapworcl password=xxx生成本地文件; - 无论哪种,备库都必须单独执行一遍——DG不复制密码文件,主备必须各自维护一份内容一致的副本。
为什么改完密码文件还是报ORA-01017
常见盲区:
-
remote_login_passwordfile参数在主备库必须都是EXCLUSIVE,设成SHARED或NONE会导致密码文件被忽略; - RMAN duplicate 或 ADG 初始化时,如果没显式指定
PASSWORD FILE选项,它会尝试用当前环境变量下的密码文件,但可能路径不对或权限不足(chmod 640才行); - 备库处于
READ ONLY WITH APPLY状态时,ALTER USER ... IDENTIFIED BY语句会被拒绝,所以不能在备库上“重设密码”来修复——必须在主库改完后,靠密码文件同步,而非数据同步。
最易被忽略的一点:密码文件内容一致性不是指“密码一样”,而是指文件本身二进制哈希一致。主备各生成一次,哪怕密码相同,文件也不同。必须用同一份生成结果分发过去。











