Oracle 11g DataGuard主备架构搭建(集群对集群)

Oracle 11g DataGuard主备架构搭建(集群对集群)

一、环境介绍

关键项 主库 备库
数据库架构 两节点Rac集群架构 两节点Rac集群架构
IP地址 192.168.11.40/41 192.168.11.45/46
数据文件目录 +DATA(ASM磁盘组) +DATA(ASM磁盘组)
控制文件目录 +DATA(ASM磁盘组) +DATA(ASM磁盘组)
日志文件目录 +DATA(ASM磁盘组) +DATA(ASM磁盘组)
归档文件目录 +ARCH(ASM磁盘组) +ARCH(ASM磁盘组)
Oracle版本 11.2.0.4 11.2.0.4
OS版本 Redhat 7.9 x64 Redhat 7.9 x64
主机名 host40rac1/host41rac2 host45rac1/host46rac2
实例名 orcl1/orcl2 orcl1/orcl2
Db_name orcl orcl
Db_unique_name orcl orcl_st

前提:

1)OS,数据库软件都已经安装好

2)存储空间已经挂载完毕,挂载点/oradata

3)提前将redo log的大小和组数规划好

4)归档日志目录存放位置必须提前规划好

二、准备工作

1、配置主机名
复制代码
数据库安装时已经规划并配置好
主库两节点主机名
节点一:host40rac1
节点二:host41rac2
备库两节点主机名
节点一:host45rac1
节点二:host46rac2
2、/etc/hosts配置文件
复制代码
1)主库上添加备库的主机名和VIP,如下:
主库两节点服务器上执行
su - root
echo "192.168.11.45      host45rac1" >>/etc/hosts
echo "192.168.11.46      host46rac2" >>/etc/hosts
echo "192.168.11.47  host45rac1-vip" >>/etc/hosts
echo "192.168.11.48  host46rac2-vip" >>/etc/hosts

2)备库上添加主库的主机名和VIP,如下
备库两节点服务器上执行
su - root
echo "192.168.11.40      host40rac1" >>/etc/hosts
echo "192.168.11.41      host41rac2" >>/etc/hosts
echo "192.168.11.42  host40rac1-vip" >>/etc/hosts
echo "192.168.11.43  host41rac2-vip" >>/etc/hosts
3、tnsnames.ora(主备一样),如下
复制代码
su - oracle
cat >>$ORACLE_HOME/network/admin/tnsnames.ora  <<EOF
orcl_pt =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = host40rac1-vip)(PORT = 1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = host41rac2-vip)(PORT = 1521))
      (LOAD_BALANCE = off)
    )
    (CONNECT_DATA =
      (SERVICE_NAME = orcl)
    )
  )


orcl_st=
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = host45rac1-vip)(PORT = 1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = host46rac2-vip)(PORT = 1521))
      (LOAD_BALANCE = off)
    )
    (CONNECT_DATA =
      (SERVICE_NAME = orcl)
    )
  )
  
EOF
备注:
1)原本rac主库上想配置为orcl名称的,但是orcl默认已经自带,且使用scanip,应该是用于scan listener监听使用(负载均衡等功能),因此,维持orcl名称不变,改为orcl_pt表示主库
验证
cat $ORACLE_HOME/network/admin/tnsnames.ora
4、.bash_profile配置文件(主备一样)
复制代码
数据库安装时已经配置好
5、密码文件(主备一样),将主库的copy过来
复制代码
主库节点一上执行
su - oracle
scp $ORACLE_HOME/dbs/orapworcl1 oracle@host45rac1:/u01/app/oracle/product/11.2/db_1/dbs

主库节点二上执行
su - oracle
scp $ORACLE_HOME/dbs/orapworcl2 oracle@host46rac2:/u01/app/oracle/product/11.2/db_1/dbs

备注:集群中每个节点复制密码文件至对应备库的集群节点,例如主库节点一密码文件复制到备库节点一,主库节点二密码文件复制到备库节点二
6、主备参数文件配置
1)主库参数文件
复制代码
主库节点一主库执行
su - oracle
sqlplus "/as sysdba"
alter system set log_archive_dest_1='location=+ARCH'  sid='*';
alter system set log_archive_config='dg_config=(orcl,orcl_st)'  sid='*';
alter system set log_archive_dest_2='service=orcl_st valid_for=(online_logfiles,primary_role) db_unique_name=orcl_st' sid='*';
alter system set standby_file_management=auto sid='*';
alter system set fal_client='orcl_pt' sid='*';
alter system set fal_server='orcl_st' sid='*';
alter system set db_file_name_convert='+DATA/','+DATA/' scope=spfile sid='*';
alter system set log_file_name_convert='+DATA/','+DATA/' scope=spfile sid='*'; 
alter system set log_archive_max_processes=8 sid='*';
备注:
1)上述这种方式如果主库原有环境已经开启归档和force logging,则可以不停库搭建DG主备架构,直接将搭建主备的关键参数,通过alter system方式完成添加和修改:
2)log_file_name_convert,db_file_name_convert这两个参数只有当主库切换为备库时才起作用,所以,这里完全可以先直接修改至spfile中,下次切换时自动生效

参数验证
show parameter spfile;
set lines 500 pages 999
col value for a90
col name for a50
select name,value
from v$parameter
where name in('db_name','db_unique_name',
'log_archive_config',
'log_archive_dest_1','log_archive_dest_2',
'log_archive_max_processes',
'fal_server','fal_client',
'db_file_name_convert',
'log_file_name_convert',
'standby_file_management');

备注:

log_file_name_convert和db_file_name_convert参数说明

(1)以前由于存放数据文件的目录都是一样,所以没有在意和理解这个参数。这一次asm到单库时,duplicate报错,突然发现,第一参数指向备库目录,第二个参数指向本库;值得注意!

(2)如果主库时ASM磁盘的OMF管理文件的方式(自动管理方式),那么设置db_file_name_convert参数的时候,必须得设置到具体目录,否则会报错。导致db_file_convert参数无法正常解析与转换相应的数据文件。修改参数,将解析目录写到datafile的真实路径。例如/oradata/orcl,+data/orcl/datafile 类似这样(+data/orcl/datafile指向具体目录)

(3)本次案例中,rac使用ASM磁盘组,但是没有使用OMF文件管理方式,创建的文件都是别名方式例如+data/orcl/system.dbf类似这样,因此,设置的参数为'/oradata/','+DATA/',无需指向具体的目录。类似如下:

复制代码
SQL> select file_name from dba_data_Files;
FILE_NAME
--------------------------------------------------------------------------------
+DATA/orcl/users01.dbf
+DATA/orcl/undotbs01.dbf
+DATA/orcl/sysaux01.dbf
+DATA/orcl/system01.dbf
+DATA/orcl/undotbs02.dbf
SQL> show parameter control_files
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
control_files                        string      +DATA/orcl/control01.ctl, +DATA/orcl/control02.ctl
SQL> select member from v$logfile;
MEMBER
--------------------------------------------------------------------------------
+DATA/orcl/redo02.log
+DATA/orcl/redo01.log
+DATA/orcl/redo03.log
+DATA/orcl/redo04.log
2)备库参数文件(备库节点一上执行)
复制代码
1、编辑init文件参数文件
su - oracle
vi $ORACLE_HOME/dbs/initorcl.ora
*.audit_file_dest='/u01/app/oracle/admin/orcl/adump'
*.audit_trail='db'
*.cluster_database=true
*.compatible='11.2.0.4.0'
*.control_files='+DATA/orcl/control01.ctl','+DATA/orcl/control02.ctl'
*.db_block_size=8192
*.db_domain=''
*.db_name='orcl'
*.diagnostic_dest='/u01/app/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=orclXDB)'
orcl2.instance_number=2
orcl1.instance_number=1
*.open_cursors=300
*.pga_aggregate_target=394264576
*.processes=1500
*.remote_listener='hostrac-scan:1521'
*.remote_login_passwordfile='exclusive'
*.sessions=1655
*.sga_target=1184890880
orcl1.thread=1
orcl2.thread=2
orcl1.undo_tablespace='UNDOTBS2'
orcl2.undo_tablespace='UNDOTBS1'
####上面这一段,与主库完全一样,实际写入参数文件中时,这一行注释需要去掉
####下面这一段是DG架构中备库非常关键的参数,实际写入参数文件中时,这一行注释需要去掉
*.db_unique_name='orcl_st'
*.log_archive_config='dg_config=(orcl,orcl_st)'
*.log_archive_dest_1='location=+ARCH'
*.log_archive_dest_2='service=orcl_pt valid_for=(online_logfiles,primary_role) db_unique_name=orcl'
*.log_archive_max_processes=8
*.fal_client='orcl_st'
*.fal_server='orcl_pt'
*.log_file_name_convert='+DATA/','+DATA/'
*.db_file_name_convert='+DATA/','+DATA/'
*.standby_file_management='AUTO'

备注:备库参数文件的基本内容,可以通过主库生成和传输过来,如下
主库上
sqlplus "/as sysdba"
create pfile='/home/oracle/initorcl.ora' from  spfile;
exit
scp /home/oracle/initorcl.ora oracle@host45rac1:/u01/app/oracle/product/11.2/db_1/dbs

//这一步后续再完成(根据编辑的init参数文件,生成spfile参数文件)
7、主库必须开启归档,同时开启force logging

主库上必须提前规划好归档日志文件存放目录,本实验环境为+ARCH

主库节点一上执行

复制代码
su - oracle
1)immediate方式关闭数据库
srvctl stop database -d orcl  -o immediate
备注:必须immediate干净方式关闭数据库,才可以开启归档,immediate方式关闭主库的方法,可以参考我的文章《Oracle单库环境下计划内启停数据库的步骤》

2)启动一个节点的数据库实例并mount数据库
srvctl start instance -d orcl -i orcl1 -o mount

3)开启归档和force logging
sqlplus "/as sysdba"
alter database archivelog ;
alter database force logging;
exit

4)重启整个数据库
srvctl stop database -d orcl  -o immediate
srvctl start database -d orcl 
5)验证
sqlplus "/as sysdba"
select FORCE_LOGGING,LOG_MODE from v$database;
8、备库必须建立静态注册监听文件

如果为动态,监听的状态为blocked(实例nomount状态时),后续rman无法直接连接备库。

复制代码
Oracle 11gR2开始,所有高可用架构,如oracle restart,rac等,监听器的创建和管理都是由grid用户完成。
备库节点一执行
su - grid
cd $ORACLE_HOME/network/admin
cat >>$ORACLE_HOME/network/admin/listener.ora  <<EOF
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = orcl)
      (ORACLE_HOME = /u01/app/oracle/product/11.2/db_1)
      (SID_NAME = orcl1)
    )
  )
EOF

备库节点一,重启监听和验证
su - grid
srvctl stop listener -n host45rac1
srvctl start listener -n host45rac1
lsnrctl status 
状态类似如下
Service "orcl" has 1 instance(s).
  Instance "orcl1", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully
9、备库启动到nomount状态

备库上执行

1)创建一些必须的目录文件
复制代码
备库节点一和节点二都需要执行
su - oracle
mkdir -p /u01/app/oracle/admin/orcl/adump
2)启动数据库到nomount状态
复制代码
备库节点一执行!!!!(节点二不启动)
su - oracle
sqlplus "/as sysdba"
startup nomount  pfile='/u01/app/oracle/product/11.2/db_1/dbs/initorcl.ora';

验证启动参数:
show parameter spfile;   //验证是否spfile文件启动
set lines 500 pages 999
col value for a90
col name for a50
select name,value
from v$parameter
where name in('db_name','db_unique_name',
'log_archive_config',
'log_archive_dest_1','log_archive_dest_2',
'log_archive_max_processes',
'fal_server','fal_client',
'db_file_name_convert',
'log_file_name_convert',
'standby_file_management');
10、主库上创建standby redo log,为了后续主备可以进行实时同步

添加规则:standby日志组数量为主库的日志组+1,RAC例外,每个实例的日志组+1

复制代码
主库上执行(实验环境主库上3组日志,每个日志组大小50M,查看方法select group#,thread#,bytes from v$log;)
alter database add standby logfile thread 1 group 11 ('+DATA/orcl/st_redo11.log') size 50m;
alter database add standby logfile thread 1 group 12 ('+DATA/orcl/st_redo12.log') size 50m;
alter database add standby logfile thread 1 group 13 ('+DATA/orcl/st_redo13.log') size 50m;

alter database add standby logfile thread 2 group 14 ('+DATA/orcl/st_redo14.log') size 50m;
alter database add standby logfile thread 2 group 15 ('+DATA/orcl/st_redo15.log') size 50m;
alter database add standby logfile thread 2 group 16 ('+DATA/orcl/st_redo16.log') size 50m;
验证:
select group#,thread#,bytes from v$standby_log;
备注:
1)提前在主库上创建standby日志组,from active database方式正式搭建时,备库创建过程中可以自动将standby日志组一起创建出来(无需额外手工再次创建)
2)standby日志组的group号,建议从11开始,前面的1-10序号,保留给redo log日志组使用
11、由于备库时集群环境,需要做一些调整,规避主备搭建过程中的ORA-17628: Oracle error 19505 returned by remote Oracle server错误

详细错误见最后总结部分

1)备库oracle用户访问asm磁盘的权限问题
复制代码
su - grid用户执行如下修复
setasmgidwrap -o /u01/app/oracle/product/11.2/db_1/bin/oracle
备注:/u01/app/oracle/product/11.2/db_1/bin/oracle为oracle数据库的可执行文件,$ORACLE_HOME/bin/oracle
修复后属主如下:
[oracle@host40rac1 admin]$ ls -l $ORACLE_HOME/bin/oracle
-rwsr-s--x 1 oracle asmadmin 239501536 Jun 16 10:58 /u01/app/oracle/product/11.2/db_1/bin/oracle
2)提前在备库的asm磁盘组中,创面与主库一样的目录。也是规避主备搭建过程中的ORA-17628: Oracle error 19505 returned by remote Oracle server错误。详细错误见最后总结部分
复制代码
非OMF文件管理的模式需要这样(非OMF文件管理,就是我们创建数据文件时,直接指定数据文件名的方式,例如数据文件名.dbf结尾,这样就是非OMF管理方式)
主库节点一上查询,有哪些文件是非OMF管理,如下
sqlplus "/as sysdba"
SQL> select file_name from dba_data_Files;
FILE_NAME
--------------------------------------------------------------------------------
+DATA/orcl/users01.dbf
+DATA/orcl/undotbs01.dbf
+DATA/orcl/sysaux01.dbf
+DATA/orcl/system01.dbf
+DATA/orcl/undotbs02.dbf
SQL> show parameter control_files
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
control_files                        string      +DATA/orcl/control01.ctl, +DATA/orcl/control02.ctl
SQL> select member from v$logfile;
MEMBER
--------------------------------------------------------------------------------
+DATA/orcl/redo02.log
+DATA/orcl/redo01.log
+DATA/orcl/redo03.log
+DATA/orcl/redo04.log

备库节点一执行(提前在备库的asm磁盘组中,创面与主库一样的目录)
su - grid
asmcmd mkdir +data/orcl

三、正式搭建

1、主备搭建

主库上执行

复制代码
su - oracle
rman target sys/oracle@orcl_pt auxiliary sys/oracle@orcl_st nocatalog
duplicate target database for standby  from active database nofilenamecheck;

备注:

1)需要加上nocatalog关键字,否则报错

2)主备库的连接,都必须通过sys用户名/密码的方式指定,否则报错

3)如果主库很大,可以通过并发方式,加快主备的搭建过程,类似如下

复制代码
rman target sys/oracle@orcl_pt auxiliary sys/oracle@orcl_st nocatalog
run{
allocate channel ch1 type disk;
allocate channel ch2 type disk;
allocate auxiliary channel ch3 type disk;
allocate auxiliary channel ch4 type disk;
duplicate target database for standby  from active database nofilenamecheck;
release channel ch1;
release channel ch2;
}

4)整个方式也可以在备库上执行,类似如下

复制代码
su - oracle
rman target sys/oracle@orcl_pt auxiliary sys/oracle@orcl_st nocatalog
duplicate target database for standby  from active database nofilenamecheck;

5)主备搭建命令执行完毕后,备库默认会启动到mount(挂载状态)

2、备库验证

备库上执行

复制代码
su - orace
sqlplus "/as sysdba"
select open_mode,database_role,protection_level,protection_mode,switchover_status,force_logging from v$database;
select group#,thread#,bytes from v$standby_log;
select group#,thread#,bytes from v$log;
3、备库上启动同步(应用主库的redo日志)

RAC集群作为备库,只能在一个节点上应用日志(不能两个节点都应用日志!!!)

两种日志应用的方式:

备库节点一上执行

1)实时应用
复制代码
su - oracle
sqlplus "/as sysdba"
alter database open read only;   //启动备库只读打开状态,然后应用主库的redo日志,进行实时通过
//搭建完毕后,如果第一次 alter database open报错,(file 1 was not restored from a sufficiently old backup),参考后面"搭建总结"的处理方法
alter database recover managed standby database using current logfile disconnect from session;
备注:实时日志应用方式,主库上必须创建standby redo日志组才可以使用这种类型!!!
2)主库切换日志时才应用(即新归档日志过来时才应用,这是默认选项)
复制代码
su - oracle
sqlplus "/as sysdba"
//备库保持mount挂载状态,主库切换日志时才应用同步(即新归档日志过来时才应用,这是默认选项)
alter database  recover managed standby database disconnect from session;
4、收尾工作
复制代码
1)备节点一上执行,根据init参数文件创建spfile文件,并报错至ASM磁盘组中
create spfile='+DATA/orcl/spfileorcl.ora' from  pfile='/u01/app/oracle/product/11.2/db_1/dbs/initorcl.ora';

2)将spfile路径分别添加到备库两个节点的init.ora里,如下:
在备库1节点上:
su - oracle
echo "spfile='+DATA/orcl/spfileorcl.ora'" >$ORACLE_HOME/dbs/initorcl1.ora
spfile='+DATA/orcl/spfileorcl.ora'

在备库2节点上:
su - oracle
echo "spfile='+DATA/orcl/spfileorcl.ora'" >$ORACLE_HOME/dbs/initorcl2.ora
spfile='+DATA/orcl/spfileorcl.ora'

3)备库注册到OCR集群配置文件中
添加备库和实例到OCR中,GI集群九可以管理数据库资源
仅在【备库1节点上】操作:
su - oracle
srvctl add database -d orcl_st -n orcl -o $ORACLE_HOME -p +DATA/orcl/spfileorcl.ora -r physical_standby -a DATA

srvctl add database -h  //命令说明
Adds a database configuration to the Oracle Clusterware.
Usage: srvctl add database -d <db_unique_name> -o <oracle_home> [-c {RACONENODE | RAC | SINGLE}
[-e <server_list>] [-i <inst_name>] [-w <timeout>]] [-m <domain_name>] [-p <spfile>]
[-r {PRIMARY | PHYSICAL_STANDBY | LOGICAL_STANDBY | SNAPSHOT_STANDBY}] [-s <start_options>]
[-t <stop_options>] [-n <db_name>] [-y {AUTOMATIC | MANUAL | NORESTART}] [-g "<serverpool_list>"]
[-x <node_name>] [-a "<diskgroup_list>"] [-j "<acfs_path_list>"]
-d表示数据库唯一名称db_unique_name
-n表示数据库名db_name

4)添加实例
仅在【备库1节点上】操作:
su - oracle
srvctl add instance -d orcl_st -i orcl1 -n host45rac1
srvctl add instance -d orcl_st -i orcl2 -n host46rac2
参数说明:
    -d <db_unique_name>      Unique name for the database
    -i <inst>                Instance name
    -n <node_name>           Node name
    -f                       Force the add operation even though some resource(s) will be stopped
    -h                       Print usage
    

5)查看配置
srvctl config database -d orcl_st
Database unique name: orcl_st
Database name: orcl
Oracle home: /u01/app/oracle/product/11.2/db_1
Oracle user: oracle
Spfile: +DATA/orcl/spfileorcl.ora
Domain: 
Start options: open
Stop options: immediate
Database role: PHYSICAL_STANDBY
Management policy: AUTOMATIC
Server pools: orcl_st
Database instances: orcl1,orcl2
Disk Groups: DATA
Mount point paths: 
Services: 
Type: RAC
Database is administrator managed


6)备库节点一取消日志应用
su - oracle
sqlplus "/as sysdba"
alter database recover managed standby database cancel;

7)启动备库(两个节点都启动)
srvctl stop instance -d orcl_st -i orcl1
srvctl start database -d orcl_st
//默认两个节点启动至read only状态

8)检查
sqlplus "/as sysdba"
select name,db_unique_name,database_role,open_mode,SWITCHOVER_STATUS from gv$database;

9)在备库节点一上启动同步!!(备库上应用主库日志)
【只能在一个节点上开启日志应用!!!!】
alter database recover managed standby database using current logfile disconnect from session;

至此,Oracle主备架构搭建完毕!!

5、可选,备库上停止同步

取消日志应用的命令如下

备库上执行(在哪个节点开启日志应用,就只能在那个节点上停止同步!!!)

复制代码
su - oracle
sqlplus "/as sysdba"
alter database recover managed standby database cancel;

四、搭建总结

1、from active database方式搭建主备
复制代码
1)需要加上nocatalog关键字,否则报错
2)主备库的连接,都必须通过sys用户名/密码的方式指定
rman target sys/oracle@orcl auxiliary sys/oracle@orcl_st nocatalog
否则报错,类似如下
DBGSQL:     TARGET> begin :fhdbi := dbms_rcvcat.getDbid; end;
DBGSQL:        sqlcode = 6550
DBGSQL:         B :fhdbi = 32767
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of Duplicate Db command at 06/23/2026 11:28:45
RMAN-05501: aborting duplication of target database
RMAN-03015: error occurred in stored script Memory Script
ORA-06550: line 1, column 17:
PLS-00201: identifier 'DBMS_RCVCAT.GETDBID' must be declared
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
3)可以并发的方式,类似如下
rman target sys/oracle@orcl auxiliary sys/oracle@orcl_st nocatalog
run{
allocate channel ch1 type disk;
allocate channel ch2 type disk;
allocate auxiliary channel ch3 type disk;
allocate auxiliary channel ch4 type disk;
duplicate target database for standby  from active database nofilenamecheck;
release channel ch1;
release channel ch2;
}
2、备库上默认只能以只读方式打开数据库

备库上执行startup或者alter database open命令,默认都是以open read only方式打开备库!!

复制代码
sqlplus "/as sysdba"
SQL*Plus: Release 11.2.0.4.0 Production on Tue Jun 23 14:13:12 2026
Copyright (c) 1982, 2013, Oracle.  All rights reserved.
Connected to an idle instance.
SQL> startup
ORACLE instance started.
Total System Global Area 1185853440 bytes
Fixed Size                  2252664 bytes
Variable Size             956301448 bytes
Database Buffers          218103808 bytes
Redo Buffers                9195520 bytes
Database mounted.
Database opened.
SQL> select open_mode,status from v$instance,v$database;
OPEN_MODE            STATUS
-------------------- ------------
READ ONLY            OPEN
3、搭建完毕后,如果第一次 alter database open报错(file 1 was not restored from a sufficiently old backup),参考处理方法如下:
复制代码
SQL> alter database open read only ;
alter database open read only
ERROR at line 1:
ORA-10458: standby database requires recovery
ORA-01152: file 1 was not restored from a sufficiently old backup
ORA-01110: data file 1: '/oradata/orcl/system01.dbf'
SQL> alter database  recover managed standby database disconnect from session;   //这个命令会直接不打开数据库方式,应用主库的归档日志,会将数据库恢复为一致状态
Database altered.
SQL> alter database  recover managed standby database cancel;
Database altered.
SQL> alter database open read only;
Database altered.
SQL> alter database recover managed standby database using current logfile disconnect from session;
Database altered.
4、备库搭建过程中报ORA-17628: Oracle error 19505 returned by remote Oracle server错误处理(一)
复制代码
如下错误:
Starting backup at 25-JUN-26
using channel ORA_DISK_1
channel ORA_DISK_1: starting datafile copy
copying standby control file
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of Duplicate Db command at 06/25/2026 17:28:34
RMAN-05501: aborting duplication of target database
RMAN-03015: error occurred in stored script Memory Script
RMAN-03009: failure of backup command on ORA_DISK_1 channel at 06/25/2026 17:28:34
ORA-17628: Oracle error 19505 returned by remote Oracle server

备库的alert日志中显示如下错误
Thu Jun 25 16:26:29 2026
destination database instance is 'started' not 'mounted'
Thu Jun 25 16:26:50 2026
NOTE: Loaded library: System 
ORA-15025: could not open disk "/dev/asm-diskc"
ORA-27041: unable to open file
Linux-x86_64 Error: 13: Permission denied
Additional information: 9
ORA-15025: could not open disk "/dev/asm-diskd"
ORA-27041: unable to open file
Linux-x86_64 Error: 13: Permission denied
Additional information: 9
ORA-15025: could not open disk "/dev/asm-diske"
ORA-27041: unable to open file
Linux-x86_64 Error: 13: Permission denied
Additional information: 9
Thu Jun 25 16:26:50 2026
SUCCESS: diskgroup DATA was dismounted
ERROR: diskgroup DATA was not mounted
Errors in file /u01/app/oracle/diag/rdbms/orcl/orcl1/trace/orcl1_ora_19519.trc:
ORA-19505: failed to identify file "+DATA/orcl/control01.ctl"
ORA-17502: ksfdcre:3 Failed to create file +DATA/orcl/control01.ctl
ORA-15001: diskgroup "DATA" does not exist or is not mounted
ORA-15040: diskgroup is incomplete
ORA-15040: diskgroup is incomplete
ORA-15040: diskgroup is incomplete
Thu Jun 25 16:27:17 2026
Decreasing number of real time LMS from 1 to 0
Thu Jun 25 16:27:18 2026
ORA-15025: could not open disk "/dev/asm-diskc"
ORA-27041: unable to open file
Linux-x86_64 Error: 13: Permission denied
Additional information: 9
ORA-15025: could not open disk "/dev/asm-diskd"
ORA-27041: unable to open file
Linux-x86_64 Error: 13: Permission denied
Additional information: 9
ORA-15025: could not open disk "/dev/asm-diske"
ORA-27041: unable to open file
Linux-x86_64 Error: 13: Permission denied
Additional information: 9
Thu Jun 25 16:27:18 2026
SUCCESS: diskgroup DATA was dismounted
ERROR: diskgroup DATA was not mounted
Errors in file /u01/app/oracle/diag/rdbms/orcl/orcl1/trace/orcl1_ora_19558.trc:
ORA-19505: failed to identify file "+DATA/orcl/control01.ctl"
ORA-17502: ksfdcre:3 Failed to create file +DATA/orcl/control01.ctl
ORA-15001: diskgroup "DATA" does not exist or is not mounted
ORA-15040: diskgroup is incomplete
ORA-15040: diskgroup is incomplete
ORA-15040: diskgroup is incomplete
Thu Jun 25 16:27:28 2026
destination database instance is 'started' not 'mounted'
Thu Jun 25 16:27:29 2026
destination database instance is 'started' not 'mounted'


解决方法
su - grid用户执行如下修复
setasmgidwrap -o /u01/app/oracle/product/11.2/db_1/bin/oracle
备注:/u01/app/oracle/product/11.2/db_1/bin/oracle为oracle数据库的可执行文件,$ORACLE_HOME/bin/oracle
修复后属主如下:
[oracle@host40rac1 admin]$ ls -l $ORACLE_HOME/bin/oracle
-rwsr-s--x 1 oracle asmadmin 239501536 Jun 16 10:58 /u01/app/oracle/product/11.2/db_1/bin/oracle
5、备库搭建过程中报ORA-17628: Oracle error 19505 returned by remote Oracle server错误处理(二)
复制代码
Starting backup at 25-JUN-26
using channel ORA_DISK_1
channel ORA_DISK_1: starting datafile copy
copying standby control file
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of Duplicate Db command at 06/25/2026 17:28:34
RMAN-05501: aborting duplication of target database
RMAN-03015: error occurred in stored script Memory Script
RMAN-03009: failure of backup command on ORA_DISK_1 channel at 06/25/2026 17:28:34
ORA-17628: Oracle error 19505 returned by remote Oracle server

根据报错信息 ORA-17628: Oracle error 19505 returned by remote Oracle server 登陆 MOS 查询到该问题其实是一个BUG(Bug 12609412 : ORA-17628 ORA-19505 DURING DUPLICATE FROM ACTIVE),存在于Oracle Enterprise 11.1.0.7 版本及之后,报错的原因是因为主库有数据文件采用了非OMF命名,而是使用了带有其它后缀的命名方式。我们的集群环境中都是使用非OMF命名方式,如下:
SQL> select file_name from dba_data_Files;
FILE_NAME
--------------------------------------------------------------------------------
+DATA/orcl/users01.dbf
+DATA/orcl/undotbs01.dbf
+DATA/orcl/sysaux01.dbf
+DATA/orcl/system01.dbf
+DATA/orcl/undotbs02.dbf
SQL> show parameter control_files
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
control_files                        string      +DATA/orcl/control01.ctl, +DATA/orcl/control02.ctl
SQL> select member from v$logfile;
MEMBER
--------------------------------------------------------------------------------
+DATA/orcl/redo02.log
+DATA/orcl/redo01.log
+DATA/orcl/redo03.log
+DATA/orcl/redo04.log

虽然主备库都设置了db_file_name_convert='+data','+data',但依然无法避免该问题,MOS上给出了两个解决方案:
(1) 使用参数DB_FILE_NAME_CONVERT并使用别名指定数据文件的完整位置;
(2)在备库的磁盘组中创建和原库一样的文件路径
本实验环境中,我们创建和主库 xxx.dbf相同路径的目录。
备库节点一执行
su - grid
asmcmd mkdir +data/orcl
然后备库重新使用pfile文件启动到nomount,再通过duplicate target database for standby from active database nofilenamecheck;恢复数据。
按照此方式方法,问题解决!


有些文章中,表示可以通过重新在备库重命名方式来解决,本次没有尝试,记录一下,类似如下:
select  'set newname for datafile '||file#||' to '''||name||''';' from v$datafile;
run {
allocate channel d1 type disk;
allocate auxiliary channel ch3 type disk;
set newname for datafile 1 to '+DATA/orcl/system01.dbf';
set newname for datafile 2 to '+DATA/orcl/sysaux01.dbf';
set newname for datafile 3 to '+DATA/orcl/undotbs01.dbf';
set newname for datafile 4 to '+DATA/orcl/users01.dbf';
set newname for datafile 5 to '+DATA/orcl/undotbs02.dbf';
duplicate target database for standby  from active database nofilenamecheck;
}
6、主库搭建完毕后,备库一致无法接受到主库的归档日志,无法完成同步,主备库的日志文件中,都无任何报错
复制代码
通过查询V$ARCHIVE_DEST_STATUS发现,由于前期搭建实验过程中,主备参数文件中的db_unique_name都一样,导致错误,LOG_ARCHIVE_DEST_2归档日志的状态变为disable,导致后续即使解决了db_unique_name的问题,主库的归档日志也不会传输至备库,最终表现就是无法同步,也没任何报错信息
节点一主库:查询如下:
SQL> COLUMN DEST_NAME FORMAT A20
SQL> COLUMN STATUS FORMAT A10
SQL> COLUMN ERROR FORMAT A30
SQL> SELECT DEST_ID, DEST_NAME, STATUS, ERROR FROM V$ARCHIVE_DEST_STATUS;
   DEST_ID DEST_NAME            STATUS     ERROR
---------- -------------------- ---------- ------------------------------
         1 LOG_ARCHIVE_DEST_1   VALID
         2 LOG_ARCHIVE_DEST_2   DISABLED   ORA-16047: DGID mismatch
                                           between destination setting
                                           and target database
    
         3 LOG_ARCHIVE_DEST_3   INACTIVE
         4 LOG_ARCHIVE_DEST_4   INACTIVE
         5 LOG_ARCHIVE_DEST_5   INACTIVE
         6 LOG_ARCHIVE_DEST_6   INACTIVE
         7 LOG_ARCHIVE_DEST_7   INACTIVE
         8 LOG_ARCHIVE_DEST_8   INACTIVE
解决方法:
节点一主库执行
SQL> ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_2=ENABLE SID='*';
System altered.
问题解决!