oracle 19c data guard的redo transport认证默认依赖密码文件,主备库密码文件必须完全一致且路径可访问:主库密码文件默认存于asm,需用asmcmd复制并写回备库asm;tnsnames.ora中tns别名须含(server=dedicated),listener.ora需静态注册且global_dbname与service_name严格一致;备库启动前须清除本地残留orapw文件,确保asm密码文件被正确识别。
主备库密码文件必须完全一致且路径可访问
oracle 19c data guard 的 redo transport 认证默认依赖密码文件,但 19c 默认将密码文件存于 asm,而非传统 $oracle_home/dbs,这导致 rman duplicate 或手动复制时极易失效——备库启动后仍用 asm 中旧的或空密码文件,报 ora-01017: invalid username/password。
- 先查主库密码文件实际位置:
SELECT * FROM v$passwordfile_info;或srvctl config database -d <db_name></db_name> - 用
ASMCMD从 ASM 复制出来:pwcopy +DATA/<dbname>/PWFILE/xxx /tmp/orapw<sid></sid></dbname> - scp 到备库节点后,再用
ASMCMD写回其 ASM(不能直接放本地目录):pwcopy /tmp/orapw<sid> +DATA/<standby_dbname>/PWFILE/</standby_dbname></sid> - 确认备库集群资源指向正确密码文件:
srvctl modify database -d <standby_db> -p <spfile_path></spfile_path></standby_db>(-p参数隐含刷新密码文件引用)
tnsnames.ora 和 listener.ora 必须显式支持密码验证
仅复制密码文件不够。主库向备库传输归档时,Oracle Net 连接需能触发密码校验,否则会跳过认证、静默失败或降级为明文传输。
- 主库
tnsnames.ora中LOG_ARCHIVE_DEST_n指向的 TNS 别名,其(CONNECT_DATA)部分必须包含(SERVER=DEDICATED)—— 共享服务器模式不支持密码文件认证 - 备库
listener.ora的SID_LIST_LISTENER必须静态注册实例,且SID_DESC中GLOBAL_DBNAME要与主库LOG_ARCHIVE_DEST_n中的SERVICE_NAME完全一致(大小写敏感) - 监听器 reload 后执行
lsnrctl status,输出中必须出现STATUS of the LISTENER ... Service "xxx" has 1 instance(s).行,且状态为READY;若显示UNKNOWN,说明静态注册未生效,密码验证不会触发
备库启动前必须关闭远程登录限制
19c 默认启用 remote_login_passwordfile=EXCLUSIVE,但若备库密码文件未被监听器识别或权限不对,ALTER DATABASE RECOVER MANAGED STANDBY DATABASE 会卡在连接阶段,日志里反复出现 ORA-01017 或 ORA-12547: TNS:lost contact。
- 确保备库
$ORACLE_HOME/dbs下无残留的旧orapw<sid></sid>文件(哪怕只是空文件),它会优先于 ASM 中的密码文件被读取 - 检查备库 Oracle 进程属主和权限:
ls -l +DATA/<dbname>/PWFILE/</dbname>输出中 UID/GID 必须为oracle:oinstall,且 ASM diskgroup 挂载点权限允许 oracle 用户读取 - 在备库 SQL*Plus 中执行:
SELECT username,account_status FROM dba_users WHERE username='SYS';—— 若返回LOCKED或EXPIRED&LOCKED,说明密码文件未生效,需重启数据库实例
验证密码认证是否真正生效
不要只看归档是否“看起来在传”,要抓根本:redo transport 连接是否用了密码校验。最直接的方式是主动发起一次跨库连接测试。
- 在主库执行:
sqlplus sys/<pwd>@<standby_tns_alias> as sysdba</standby_tns_alias></pwd>—— 若成功,说明 TNS 解析、监听、密码文件三者全通 - 在主库执行:
ALTER SYSTEM ARCHIVE LOG CURRENT;,立刻查备库ALERT.log,搜索archived log for thread后紧跟from primary database,且无authentication failed类字样 - 若仍失败,开启客户端跟踪:
export TNS_ADMIN=$ORACLE_HOME/network/admin; export DIAG_ADR_ENABLED=OFF; sqlplus -trace /@<standby_alias></standby_alias>,查看生成的trc文件里是否有ntzauth相关记录 —— 有则表示密码认证已介入
密码文件认证看似简单,但 19c 的 ASM 存储路径、静态监听注册、TNS 别名大小写匹配这三点任一出错,都会让整个链路静默降级或中断,问题表象却都像网络不通。动手前务必逐项确认 ASM 路径、监听状态、TNS 名称一致性。











