大家好,我是 JiekeXu,江湖人称“强哥”,青学会 MOP 技术社区主席,荣获 Oracle ACE Pro 称号,墨天轮 MVP,墨天轮年度“墨力之星”,拥有 Oracle OCP/OCM 认证,MySQL 5.7/8.0 OCP 认证以及 PCA、PCTA、OBCA、OGCA、KCA、KCP、KCSM 等众多国产数据库认证证书,今天和大家一起再谈 Oracle 19C 搭建 ADG 密码文件遇到的坑!欢迎关注我的微信公众号“JiekeXu DBA之路”,然后点击右上方三个点“设为星标”置顶,更多干货文章才能第一时间推送,谢谢!

前 言
近期我们有几套 Oracle 19c 测试环境因为虚拟机底层磁盘坏块或者资源到期等问题,需要迁移,采用 ADG 架构进行切换迁移,单机环境还好说,搭建 ADG 也没有任何问题,但当搭建 RAC 环境的 ADG 时,又被坑了一次,故记录一下。
ADG 环境搭建
环境搭建算是基础的操作了,以前也做过不少了,19c 环境中因密码文件保存在 ASM 中是有一定的坑的,这个也在第一次 搭建 19c MAA 架构的时候写过了。但是好几年不干这活了,今天又被坑了两次。
ora-rac-n1:/tmp(jiekedb1)$ rman target sys/'oracle'@JIEKEDB auxiliary sys/'oracle'@JIEKETDB
Recovery Manager: Release 19.0.0.0.0 - Production on Thu May 29 18:20:54 2025
Version 19.15.0.0.0
Copyright (c) 1982, 2019, Oracle and/or its affiliates. All rights reserved.
connected to target database: JIEKE2P (DBID=3857714555)
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-00554: initialization of internal recovery manager package failed
RMAN-04006: error from auxiliary database: ORA-01017: invalid username/password; logon denied
密码错误问题
通过上面可以看到就是密码错误,那么可能是密码文件问题,源端能连接上,目标端不能连接,可能密码文件同步的有问题,那么就重新来同步一次呗。
源端将密码文件从 ASM 复制到文件系统。然后 scp 到备库文件系统
ASMCMD> cd +DATA/JXRT4DB/PASSWORD
ASMCMD> ls -l
Type Redund Striped Time Sys Name
PASSWORD UNPROT COARSE APR 29 2022 N orapwjiekedb1 => +DATA/JIEKEDB/PASSWORD/pwdjiekedb.256.1103297913
PASSWORD UNPROT COARSE APR 29 2022 Y pwdjiekedb.256.1103297913
ASMCMD> pwcopy pwdjiekedb.256.1103297913 /tmp/orapwJIEKETDB
copying +data/JIEKEDB/PASSWORD/pwdjiekedb.256.1103297913 -> /tmp/orapwJIEKETDB
ASMCMD> exit
scp -P 10022 /tmp/orapwJIEKETDB 192.168.221.180:/tmp/orapwJIEKETDB
目标端复制密码文件到 ASM 实例中,这个是有个知识点的。复制密码时需要添加 --dbuniquename 才行,不然在 ASM 中会出现 ‘DB_UNKNOWN’ 目录,这个在以前的文章也说过:关于 ASM 中出现 ‘DB_UNKNOWN’ 目录的说明 。即使用如下格式:
ASMCMD> pwcopy --dbuniquename JIEKETDB /tmp/orapwJIEKETDB +DATA/JIEKETDB/PASSWORD/pwdJIEKETDB
PRCD-1120 : The resource for database JIEKETDB could not be found.
PRCR-1001 : Resource ora.jieketdb.db does not exist
copying /tmp/orapwJIEKETDB -> +DATA/JIEKETDB/PASSWORD/pwdJIEKETDB
ASMCMD-9453: failed to register password file as a CRS resource
ASMCMD> ls -l
Type Redund Striped Time Sys Name
PASSWORD UNPROT COARSE MAY 29 15:00:00 N pwdjieketdb => +DATA/JIEKETDB/PASSWORD/pwdjieketdb.256.1202399155
PASSWORD UNPROT COARSE MAY 29 15:00:00 Y pwdjieketdb.256.1202399155
上面报错是因为数据库和实例资源都没有加入到 CRS 集群资源里,不影响,可使用 srvctl 命令如下格式添加。

密码问题小插曲
但是通过上面这样操作以后,还是一样的报错,直接让人抓狂,然后直接去原库修改了 SYS 用户密码,然后拷贝出来密码文件传到目标端,remove 移除数据库重新拷贝进 ASM,还是不行,衰~
srvctl add database -d JIEKETDB -o /u01/app/oracle/product/19.0.0/dbhome_1 -p +DATA/JIEKETDB/PARAMETERFILE/spfile.257.1202399493 -pwfile +DATA/JIEKETDB/PASSWORD/orapwjieketdb -i jiekedb1 -y AUTOMATIC -r physical_standby
srvctl add instance -d JIEKETDB -i jiekedb1 -n ora-rac-n1
srvctl add instance -d JIEKETDB -i jiekedb2 -n ora-rac-n2
--srvctl remove database -d jieketdb -f
过了好久发现原来源端数据库密码文件竟然存在于各个节点的本地文件系统 dbs 目录下,瞬间明白了,不知何人什么时候把密码文件又给放到本地了,还又改过密码,怪不得 ASM 上的密码文件日期是 2022 年,总算真像大白了,那就把源端文件系统中的密码文件复制到目标端再来一次就行。
--节点1
ll $ORACLE_HOME/dbs/orapw*
-rw-r----- 1 oracle oinstall 4608 May 29 18:22 /u01/app/oracle/product/19.0.0/dbhome_1/dbs/orapwjiekedb1
--节点2
ll $ORACLE_HOME/dbs/orapw*
-rw-r----- 1 oracle oinstall 4608 May 29 18:24 /u01/app/oracle/product/19.0.0/dbhome_1/dbs/orapwjiekedb2
ASMCMD> cd PASSWORD
ASMCMD> ls -l
Type Redund Striped Time Sys Name
PASSWORD UNPROT COARSE APR 29 2022 N orapwjiekedb1 => +DATA/JIEKEDB/PASSWORD/pwdjiekedb.256.1103297913
PASSWORD UNPROT COARSE APR 29 2022 Y pwdjiekedb.256.1103297913
ASMCMD> pwd
+DATA/JIEKEDB/PASSWORD
ASMCMD>
已经到六点半左右了,数据同步还没有进行,这里有遇到了一个小问题,不知道是时间久了失去了耐心,还是着急下班还是咋滴,复制过程中使用如下的命令来了一遍,结果就是 rman duplicate 连接还是密码错误。。。
ASMCMD> ls -l
ASMCMD> pwcopy --dbuniquename jieketdb /tmp/orapwjiekedb2 +DATA/JIEKETDB/PASSWORD/
PRCD-1120 : The resource for database jieketdb could not be found.
PRCR-1001 : Resource ora.jieketdb.db does not exist
copying /tmp/orapwjiekedb2 -> +DATA/JIEKETDB/PASSWORD/orapwjiekedb2
ASMCMD-9453: failed to register password file as a CRS resource
ASMCMD> ls -l
ASMCMD> pwcopy --dbuniquename jieketdb /tmp/orapwjiekedb2 +DATA/JIEKETDB/PASSWORD/
PRCD-1120 : The resource for database jieketdb could not be found.
PRCR-1001 : Resource ora.jieketdb.db does not exist
copying /tmp/orapwjiekedb2 -> +DATA/JIEKETDB/PASSWORD/orapwjiekedb2
ASMCMD-9453: failed to register password file as a CRS resource
因为这里复制密码文件时,没有指定文件名,所以还是从文件系统复制过来的名字 orapwjiekedb2 ,这也导致了 srvctl 重新添加实例,rman 连接报错。
最终解决问题
删除 ASM 中复制的密码文件 orapwjiekedb2,重新指定 dbuniquename 和全路径及密码文件名进行复制。注意密码文件名为 orapw+
ASMCMD> pwcopy --dbuniquename <database> /tmp/pw<database> +DATAP/<database>/PASSWORD/pwd<database>
ASMCMD> rm orapwjiekedb2
ASMCMD>
ASMCMD> pwcopy --dbuniquename jieketdb /tmp/orapwjiekedb2 +DATA/JIEKEDB/PASSWORD/orapwJIEKETDB
PRCD-1120 : The resource for database jieketdb could not be found.
PRCR-1001 : Resource ora.jieketdb.db does not exist
copying /tmp/orapwjiekedb2 -> +DATA/JIEKETDB/PASSWORD/orapwJIEKETDB
ASMCMD-9453: failed to register password file as a CRS resource
ASMCMD>
ASMCMD> ls -l
Type Redund Striped Time Sys Name
PASSWORD UNPROT COARSE MAY 29 18:00:00 N orapwjieketdb => +DATA/JIEKETDB/PASSWORD/pwdjieketdb.256.1202409413
PASSWORD UNPROT COARSE MAY 29 18:00:00 Y pwdjieketdb.256.1202409413

注册完密码之后,rman 就可以连接了。
ora-rac-n1:/u01/app/oracle/product/19.0.0/dbhome_1/dbs(jiekedb1)$ rman target sys/'oracle'@JIEKEDB auxiliary sys/'oracle'@JIEKETDB
Recovery Manager: Release 19.0.0.0.0 - Production on Thu May 29 18:37:59 2025
Version 19.15.0.0.0
Copyright (c) 1982, 2019, Oracle and/or its affiliates. All rights reserved.
connected to target database: JIEKE2P (DBID=3857714555)
connected to auxiliary database: JIEKE2P (not mounted)
RMAN>
RMAN> exit

然后便可以 duplicate 复制数据了,放后台执行,下班~第二天来看结果就行。
--脚本后台执行(脚本放在/home/oracle/下):
vi rman_duplicate.cmd
duplicate target database for standby from active database dorecover nofilenamecheck;
vi rman_dup.sh
rman target sys/'oracle'@JIEKEDB auxiliary sys/'oracle'@JIEKETDB cmdfile=/home/oracle/rman_duplicate.cmd log=/home/oracle/rman_dup.log append
--后台执行:
chmod o+x rman_dup.sh
nohup sh /home/oracle/rman_dup.sh &
启动复制后,因为带宽原因这里仅使用单线程单通道复制,可根据网速大家自行加通道或者限速。allocate channel p1 type disk rate 50m;
--查看日志
tail -90f rman_dup.log
Recovery Manager: Release 19.0.0.0.0 - Production on Thu May 29 18:44:16 2025
Version 19.15.0.0.0
Copyright (c) 1982, 2019, Oracle and/or its affiliates. All rights reserved.
connected to target database: JIEKE2P (DBID=3857714555)
connected to auxiliary database: JIEKE2P (not mounted)
RMAN> duplicate target database for standby from active database dorecover nofilenamecheck;
2>
Starting Duplicate Db at 2025-05-29 18:44:18
using target database control file instead of recovery catalog
allocated channel: ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: SID=3121 instance=jiekedb1 device type=DISK
current log archived
contents of Memory Script:
{
backup as copy reuse
passwordfile auxiliary format '+DATA/JIEKETDB/PASSWORD/orapwjieketdb' ;
}
executing Memory Script
Starting backup at 2025-05-29 18:44:26
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=1225 instance=jxrt4db1 device type=DISK
Finished backup at 2025-05-29 18:44:31
contents of Memory Script:
……省略中间内容……
Finished restore at 2025-05-29 18:44:39
contents of Memory Script:
{
sql clone 'alter database mount standby database';
}
executing Memory Script
sql statement: alter database mount standby database
RMAN-05529: warning: DB_FILE_NAME_CONVERT resulted in invalid ASM names; names changed to disk group only.
executing command: SET NEWNAME
Starting restore at 2025-05-29 18:44:45
using channel ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: using network backup set from service JIEKEDB
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00001 to +DATA
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:45
channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: using network backup set from service JIEKEDB
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00002 to +DATA
…省略中间内容……
archived log file name=+ARCH/JIEKETDB/ARCHIVELOG/2025_05_29/thread_2_seq_78742.275.1202417665 thread=2 sequence=78742
media recovery complete, elapsed time: 00:00:11
Finished recover at 2025-05-29 20:54:44
contents of Memory Script:
{
delete clone force archivelog all;
}
executing Memory Script
released channel: ORA_DISK_1
released channel: ORA_AUX_DISK_1
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=1225 instance=jiekedb1 device type=DISK
archived log file name=+ARCH/JIEKETDB/ARCHIVELOG/2025_05_29/thread_2_seq_78741.274.1202417663 RECID=16 STAMP=1202417664
deleted archived log
archived log file name=+ARCH/JIEKETDB/ARCHIVELOG/2025_05_29/thread_2_seq_78742.275.1202417665 RECID=17 STAMP=1202417664
Deleted 17 objects
Finished Duplicate Db at 2025-05-29 20:55:05
Recovery Manager complete.
当然也可以通过 ASM 查看数据文件的生产情况判断是否同步有问题。
ASMCMD> cd ..
ASMCMD> ls
CONTROLFILE/
DATAFILE/
PARAMETERFILE/
PASSWORD/
ASMCMD> cd datafile
ASMCMD> ls -l
Type Redund Striped Time Sys Name
DATAFILE UNPROT COARSE MAY 29 18:00:00 Y SYSTEM.261.1202409889
ASMCMD>
ASMCMD> ls -l
Type Redund Striped Time Sys Name
DATAFILE UNPROT COARSE MAY 29 18:00:00 Y SYSTEM.261.1202409889
ASMCMD>
ASMCMD> ls -l
Type Redund Striped Time Sys Name
DATAFILE UNPROT COARSE MAY 29 18:00:00 Y SYSAUX.262.1202409935
DATAFILE UNPROT COARSE MAY 29 18:00:00 Y SYSTEM.261.1202409889
DATAFILE UNPROT COARSE MAY 29 18:00:00 Y UNDOTBS1.263.1202410171
DATAFILE UNPROT COARSE MAY 29 18:00:00 Y USERS.264.1202410225
ASMCMD>

最终 ADG 数据库搭建成功,可以正常同步数据~


全文完,希望可以帮到正在阅读的你,如果觉得有帮助,可以分享给你身边的朋友,同事,你关心谁就分享给谁,一起学习共同进步~~~
❤️ 欢迎关注我的公众号【JiekeXu DBA之路】,一起学习新知识!
——————————————————————————
公众号:JiekeXu DBA之路
墨天轮:https://www.modb.pro/u/4347
CSDN :https://blog.csdn.net/JiekeXu
ITPUB:https://blog.itpub.net/69968215
腾讯云:https://cloud.tencent.com/developer/user/5645107
——————————————————————————





