1. 核心说明

本次修正针对实操中出现的 RMAN-05537ORA-01100ORA-38500 三大核心错误,核心调整点:
1、备库必须通过 PFILE(文本参数文件) 启动到 NOMOUNT(规避 RMAN-05537);
2、克隆后备库已自动 MOUNT,无需手动执行 mount standby database(规避 ORA-01100);
3、主库需提前创建 Standby Redo Logs(备库重做日志)(解决 ORA-38500);主库创建后,会被克隆岛备库(备库不需要提前创建)

所有步骤基于 Oracle 11g 11.2.0.4 版本,主库 172.21.204.201(RKHY_PRIMARY),备库 172.21.204.200(RKHY_STANDBY),路径完全一致。

2. 搭建前:环境与配置准备(核心修正 + 前置避坑)

2.1.前置通用要求(无变化,确保基础环境)

  1. 主备库关闭防火墙 / SELinux,oracle 用户 UID/GID 一致,/etc/hosts 配置主备别名;
  2. 主备库 ORACLE_SID=RKHYORACLE_HOME=/data/u01/app/oracle/product/11.2.0.4/db_1
  3. 主备库 TNS / 监听配置与前文一致,确保 tnsping RKHY_PRIMARY/RKHY_STANDBY 均通。
  4. 注意,监听、tns配置完毕,要重启、要重启、要重启
主库:
[oracle@zb-yunweitest-mysql-204-201 admin]$ cat listener.ora 
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = zb-yunweitest-mysql-204-201)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = RKHY_PRIMARY)  # 与 db_unique_name 一致
      (ORACLE_HOME = /data/u01/app/oracle/product/11.2.0.4/db_1)
      (SID_NAME = rkhy)  # 与 ORACLE_SID 一致
    )
  )

[oracle@zb-yunweitest-mysql-204-201 admin]$ cat tnsnames.ora 
# tnsnames.ora Network Configuration File: /data/u01/app/oracle/product/11.2.0.4/db_1/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.

RKHY =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = zb-yunweitest-mysql-204-201)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = rkhy)
    )
  )

# 主库自身 TNS
RKHY_PRIMARY =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = zb-yunweitest-mysql-204-201)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = RKHY_PRIMARY)
    )
  )
# 备库 TNS(克隆时需访问)
RKHY_STANDBY =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = zb-yunweitest-mysql-204-200)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = RKHY_STANDBY)
    )
  )


备库:
[root@zb-yunweitest-mysql-204-200 admin]# cat listener.ora 
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = zb-yunweitest-mysql-204-200)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = RKHY_STANDBY)  # 备库唯一名称
      (ORACLE_HOME = /data/u01/app/oracle/product/11.2.0.4/db_1)
      (SID_NAME = rkhy)  # 与主库 ORACLE_SID 一致
    )
  )


[root@zb-yunweitest-mysql-204-200 admin]# cat tnsnames.ora 
# tnsnames.ora Network Configuration File: /data/u01/app/oracle/product/11.2.0.4/db_1/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.

RKHY =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = zb-yunweitest-mysql-204-200)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = rkhy)
    )
  )


RKHY_PRIMARY =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = zb-yunweitest-mysql-204-201)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = RKHY_PRIMARY)
    )
  )
RKHY_STANDBY =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = zb-yunweitest-mysql-204-200)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = RKHY_STANDBY)
    )
  )
View Code

2.2.阶段 1:主库(201)关键修正配置(新增 Standby Redo Logs)

步骤 1:启用归档 + 强制日志(无变化,验证生效)

# 主库 oracle 用户执行 sqlplus
sqlplus / as sysdba
-- 1. 检查当前归档状态
archive log list;
-- 2. 若未启用归档,执行以下操作(已启用则跳过 shutdown/startup mount)
shutdown immediate;
startup mount;
alter database archivelog;  -- 启用归档
alter database force logging;  -- 强制日志(DG 核心)
alter database open;
-- 3. 验证配置结果
archive log list;
-- 正常输出:Database log mode: Archive Mode;Automatic archival: Enabled
select log_mode, force_logging from v$database;

SQL> select log_mode, force_logging from v$database;

LOG_MODE FOR
------------ ---
ARCHIVELOG YES

exit;

2.3.步骤 2:创建 Standby Redo Logs(解决 ORA-38500 核心)

Standby Redo Logs(SRL)是 USING CURRENT LOGFILE 选项的必备条件,需与主库在线重做日志(Redo Log)组数 / 大小一致,且多 1 组(11g 最佳实践)。
# 主库 sqlplus 执行(先查询主库在线重做日志配置)
sqlplus / as sysdba
-- 1. 查询主库在线重做日志信息(确定SRL的大小/组数)
select group#, bytes/1024/1024 as size_mb from v$log;
-- 示例输出(假设主库3组,每组50M):
-- GROUP#  SIZE_MB
-- 1       50
-- 2       50
-- 3       50

-- 2. 创建Standby Redo Logs(组数=主库组数+1=4组,大小=50M,路径与主库redo一致)
alter database add standby logfile group 4 ('/data/u02/rkhy/oradata/standby_redo04.log') size 50M;
alter database add standby logfile group 5 ('/data/u02/rkhy/oradata/standby_redo05.log') size 50M;
alter database add standby logfile group 6 ('/data/u02/rkhy/oradata/standby_redo06.log') size 50M;
alter database add standby logfile group 7 ('/data/u02/rkhy/oradata/standby_redo07.log') size 50M;

-- 3. 验证SRL创建成功
select group#, type, status from v$logfile where type='STANDBY';
-- 输出包含GROUP 4-7,TYPE=STANDBY,状态为VALID

SQL> select group#, type, status from v$logfile where type='STANDBY';

GROUP# TYPE STATUS
---------- ------- -------
4 STANDBY
5 STANDBY
6 STANDBY
7 STANDBY

SQL>

exit;

步骤 3:主库静态 + 动态 DG 参数配置(无变化,确保重启生效)

sqlplus / as sysdba
-- 静态参数(scope=spfile,重启生效)
alter system set db_unique_name='RKHY_PRIMARY' scope=spfile;
alter system set db_file_name_convert='RKHY_STANDBY','RKHY_PRIMARY' scope=spfile;
alter system set log_file_name_convert='RKHY_STANDBY','RKHY_PRIMARY' scope=spfile;
-- 重启生效
shutdown immediate;
startup;
-- 动态参数(重启后执行)
alter system set log_archive_config='DG_CONFIG=(RKHY_PRIMARY,RKHY_STANDBY)' scope=both;
alter system set log_archive_dest_1='LOCATION=/data/u02/rkhy/archivelog VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=RKHY_PRIMARY' scope=both;
alter system set log_archive_dest_2='SERVICE=RKHY_STANDBY LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=RKHY_STANDBY' scope=both;
alter system set log_archive_dest_state_2='ENABLE' scope=both;
alter system set fal_client='RKHY_PRIMARY' scope=both;
alter system set fal_server='RKHY_STANDBY' scope=both;
alter system set standby_file_management='AUTO' scope=both;
exit;

步骤 4:主库同步密码文件到备库(无变化)

scp $ORACLE_HOME/dbs/orapwrkhy oracle@zb-yunweitest-mysql-204-200:$ORACLE_HOME/dbs/

2.4.阶段 2:备库(200)关键修正配置(PFILE 启动 + 目录准备)

步骤 1:创建与主库一致的目录(含 SRL 目录)

# 备库 oracle 用户执行
mkdir -p /data/oradata/rkhy /data/u02/rkhy/oradata /data/u02/rkhy/archivelog /data/u01/app/oracle/fast_recovery_area/rkhy
chown -R oracle:oinstall /data/oradata/rkhy /data/u02/rkhy /data/u01/app/oracle/fast_recovery_area
chmod -R 775 /data/oradata/rkhy /data/u02/rkhy /data/u01/app/oracle/fast_recovery_area

步骤 2:创建备库 PFILE(核心,规避 RMAN-05537)

备库不能用 SPFILE 启动,必须创建极简 PFILE(仅包含 SID):
# 备库 oracle 用户执行
vi $ORACLE_HOME/dbs/initrkhy.ora
# 仅写入以下内容(PFILE核心,不可执行SID=RKHY)
DB_NAME=RKHY

步骤 3:备库通过 PFILE 启动到 NOMOUNT 状态(唯一正确方式)

# 备库 sqlplus 执行
sqlplus / as sysdba
-- 1. 强制关闭残留实例
shutdown abort;
-- 2. 通过PFILE启动到NOMOUNT(关键,避免RMAN-05537)
startup nomount pfile='$ORACLE_HOME/dbs/initrkhy.ora';
-- 3. 验证状态(必须是STARTED/NOMOUNT)
select status from v$instance;
-- 输出:STATUS=STARTED(NOMOUNT状态标识)
exit;

步骤 4:备库监听 / TNS 配置(无变化,确保与主库一致)

确认监听已启动,tnsping RKHY_PRIMARY 通,无需重复配置。
主库:
[oracle@zb-yunweitest-mysql-204-201 admin]$ tnsping RKHY_PRIMARY

TNS Ping Utility for Linux: Version 11.2.0.4.0 - Production on 19-JAN-2026 17:46:47

Copyright (c) 1997, 2013, Oracle.  All rights reserved.

Used parameter files:


Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = zb-yunweitest-mysql-204-201)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = RKHY_PRIMARY)))
OK (0 msec)
[oracle@zb-yunweitest-mysql-204-201 admin]$ 
[oracle@zb-yunweitest-mysql-204-201 admin]$ 
[oracle@zb-yunweitest-mysql-204-201 admin]$ tnsping RKHY_STANDBY

TNS Ping Utility for Linux: Version 11.2.0.4.0 - Production on 19-JAN-2026 17:46:54

Copyright (c) 1997, 2013, Oracle.  All rights reserved.

Used parameter files:


Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = zb-yunweitest-mysql-204-200)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = RKHY_STANDBY)))
OK (0 msec)
[oracle@zb-yunweitest-mysql-204-201 admin]$ 
View Code
从库:
[oracle@zb-yunweitest-mysql-204-200 dbs]$ tnsping RKHY_PRIMARY

TNS Ping Utility for Linux: Version 11.2.0.4.0 - Production on 19-JAN-2026 17:45:29

Copyright (c) 1997, 2013, Oracle.  All rights reserved.

Used parameter files:


Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = zb-yunweitest-mysql-204-201)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = RKHY_PRIMARY)))
OK (0 msec)
[oracle@zb-yunweitest-mysql-204-200 dbs]$ 
[oracle@zb-yunweitest-mysql-204-200 dbs]$ 
[oracle@zb-yunweitest-mysql-204-200 dbs]$ tnsping RKHY_STANDBY

TNS Ping Utility for Linux: Version 11.2.0.4.0 - Production on 19-JAN-2026 17:45:36

Copyright (c) 1997, 2013, Oracle.  All rights reserved.

Used parameter files:


Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = zb-yunweitest-mysql-204-200)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = RKHY_STANDBY)))
OK (0 msec)
[oracle@zb-yunweitest-mysql-204-200 dbs]$ 
View Code

3. 搭建中:基于活动数据库克隆备库(修正后核心步骤)

3.1.步骤 1:主库执行 RMAN 克隆命令(禁用 rlwrap,正确语法)

# 主库 oracle 用户执行(直接rman,不封装rlwrap)
rman target / auxiliary sys/主库sys密码@RKHY_STANDBY

# RMAN交互界面执行(核心:备库用PFILE启动,无需SPFILE子句?不,11g克隆备库仍需SPFILE子句,备库PFILE启动后可正常执行)

DUPLICATE TARGET DATABASE FOR STANDBY
FROM ACTIVE DATABASE
NOFILENAMECHECK
SPFILE
SET DB_UNIQUE_NAME='RKHY_STANDBY'
SET FAL_CLIENT='RKHY_STANDBY'
SET FAL_SERVER='RKHY_PRIMARY'
SET STANDBY_FILE_MANAGEMENT='AUTO'
SET LOG_ARCHIVE_DEST_1='LOCATION=/data/u02/rkhy/archivelog VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=RKHY_STANDBY'
SET LOG_ARCHIVE_DEST_2='SERVICE=RKHY_PRIMARY LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=RKHY_PRIMARY'
SET LOG_ARCHIVE_DEST_STATE_1='ENABLE'
SET LOG_ARCHIVE_DEST_STATE_2='ENABLE'
SET LOG_ARCHIVE_CONFIG='DG_CONFIG=(RKHY_PRIMARY,RKHY_STANDBY)'
SET LOG_FILE_NAME_CONVERT='/data/u01/app/oracle/oradata/RKHY_PRIMARY','/data/u01/app/oracle/oradata/RKHY_STANDBY'
SET DB_FILE_NAME_CONVERT='/data/u01/app/oracle/oradata/RKHY_PRIMARY','/data/u01/app/oracle/oradata/RKHY_STANDBY';

克隆成功标志

RMAN 日志最后显示 Finished Duplicate Db at XXX,无 RMAN-05537 报错;备库自动完成 NOMOUNT→MOUNT 过程。
[oracle@zb-yunweitest-mysql-204-201 admin]$ rman target / auxiliary sys/oracle@RKHY_STANDBY

Recovery Manager: Release 11.2.0.4.0 - Production on Fri Jan 16 14:02:07 2026

Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.

connected to target database: RKHY (DBID=1739130167)
connected to auxiliary database: RKHY (not mounted)

RMAN> duplicate target database for standby  from active database  nofilenamecheck   spfile  set db_unique_name='RKHY_STANDBY' set fal_client='RKHY_STANDBY' set fal_server='RKHY_PRIMARY' set standby_file_management='AUTO';

Starting Duplicate Db at 16-JAN-26
using target database control file instead of recovery catalog
allocated channel: ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: SID=585 device type=DISK

contents of Memory Script:
{
   backup as copy reuse
   targetfile  '/data/u01/app/oracle/product/11.2.0.4/db_1/dbs/orapwrkhy' auxiliary format 
 '/data/u01/app/oracle/product/11.2.0.4/db_1/dbs/orapwrkhy'   targetfile 
 '/data/u01/app/oracle/product/11.2.0.4/db_1/dbs/spfilerkhy.ora' auxiliary format 
 '/data/u01/app/oracle/product/11.2.0.4/db_1/dbs/spfilerkhy.ora'   ;
   sql clone "alter system set spfile= ''/data/u01/app/oracle/product/11.2.0.4/db_1/dbs/spfilerkhy.ora''";
}
executing Memory Script

Starting backup at 16-JAN-26
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=101 device type=DISK
Finished backup at 16-JAN-26

sql statement: alter system set spfile= ''/data/u01/app/oracle/product/11.2.0.4/db_1/dbs/spfilerkhy.ora''

contents of Memory Script:
{
   sql clone "alter system set  db_unique_name = 
 ''RKHY_STANDBY'' comment=
 '''' scope=spfile";
   sql clone "alter system set  fal_client = 
 ''RKHY_STANDBY'' comment=
 '''' scope=spfile";
   sql clone "alter system set  fal_server = 
 ''RKHY_PRIMARY'' comment=
 '''' scope=spfile";
   sql clone "alter system set  standby_file_management = 
 ''AUTO'' comment=
 '''' scope=spfile";
   shutdown clone immediate;
   startup clone nomount;
}
executing Memory Script

sql statement: alter system set  db_unique_name =  ''RKHY_STANDBY'' comment= '''' scope=spfile

sql statement: alter system set  fal_client =  ''RKHY_STANDBY'' comment= '''' scope=spfile

sql statement: alter system set  fal_server =  ''RKHY_PRIMARY'' comment= '''' scope=spfile

sql statement: alter system set  standby_file_management =  ''AUTO'' comment= '''' scope=spfile

Oracle instance shut down

connected to auxiliary database (not started)
Oracle instance started

Total System Global Area    2137886720 bytes

Fixed Size                     2254952 bytes
Variable Size                687867800 bytes
Database Buffers            1442840576 bytes
Redo Buffers                   4923392 bytes

contents of Memory Script:
{
   backup as copy current controlfile for standby auxiliary format  '/data/u02/rkhy/oradata/control01.ctl';
   restore clone controlfile to  '/data/u01/app/oracle/fast_recovery_area/rkhy/control02.ctl' from 
 '/data/u02/rkhy/oradata/control01.ctl';
}
executing Memory Script

Starting backup at 16-JAN-26
using channel ORA_DISK_1
channel ORA_DISK_1: starting datafile copy
copying standby control file
output file name=/data/u01/app/oracle/product/11.2.0.4/db_1/dbs/snapcf_rkhy.f tag=TAG20260116T140230 RECID=5 STAMP=1222696950
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:01
Finished backup at 16-JAN-26

Starting restore at 16-JAN-26
allocated channel: ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: SID=488 device type=DISK

channel ORA_AUX_DISK_1: copied control file copy
Finished restore at 16-JAN-26

contents of Memory Script:
{
   sql clone 'alter database mount standby database';
}
executing Memory Script

sql statement: alter database mount standby database
RMAN-05538: WARNING: implicitly using DB_FILE_NAME_CONVERT

contents of Memory Script:
{
   set newname for tempfile  1 to 
 "/data/u02/rkhy/oradata/temp01.dbf";
   switch clone tempfile all;
   set newname for datafile  1 to 
 "/data/u02/rkhy/oradata/system01.dbf";
   set newname for datafile  2 to 
 "/data/u02/rkhy/oradata/sysaux01.dbf";
   set newname for datafile  3 to 
 "/data/u02/rkhy/oradata/undotbs01.dbf";
   set newname for datafile  4 to 
 "/data/u02/rkhy/oradata/users01.dbf";
   backup as copy reuse
   datafile  1 auxiliary format 
 "/data/u02/rkhy/oradata/system01.dbf"   datafile 
 2 auxiliary format 
 "/data/u02/rkhy/oradata/sysaux01.dbf"   datafile 
 3 auxiliary format 
 "/data/u02/rkhy/oradata/undotbs01.dbf"   datafile 
 4 auxiliary format 
 "/data/u02/rkhy/oradata/users01.dbf"   ;
   sql 'alter system archive log current';
}
executing Memory Script

executing command: SET NEWNAME

renamed tempfile 1 to /data/u02/rkhy/oradata/temp01.dbf in control file

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

Starting backup at 16-JAN-26
using channel ORA_DISK_1
channel ORA_DISK_1: starting datafile copy
input datafile file number=00001 name=/data/u02/rkhy/oradata/system01.dbf
output file name=/data/u02/rkhy/oradata/system01.dbf tag=TAG20260116T140237
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:15
channel ORA_DISK_1: starting datafile copy
input datafile file number=00002 name=/data/u02/rkhy/oradata/sysaux01.dbf
output file name=/data/u02/rkhy/oradata/sysaux01.dbf tag=TAG20260116T140237
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:07
channel ORA_DISK_1: starting datafile copy
input datafile file number=00003 name=/data/u02/rkhy/oradata/undotbs01.dbf
output file name=/data/u02/rkhy/oradata/undotbs01.dbf tag=TAG20260116T140237
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:01
channel ORA_DISK_1: starting datafile copy
input datafile file number=00004 name=/data/u02/rkhy/oradata/users01.dbf
output file name=/data/u02/rkhy/oradata/users01.dbf tag=TAG20260116T140237
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:01
Finished backup at 16-JAN-26

sql statement: alter system archive log current

contents of Memory Script:
{
   switch clone datafile all;
}
executing Memory Script

datafile 1 switched to datafile copy
input datafile copy RECID=5 STAMP=1222696978 file name=/data/u02/rkhy/oradata/system01.dbf
datafile 2 switched to datafile copy
input datafile copy RECID=6 STAMP=1222696978 file name=/data/u02/rkhy/oradata/sysaux01.dbf
datafile 3 switched to datafile copy
input datafile copy RECID=7 STAMP=1222696978 file name=/data/u02/rkhy/oradata/undotbs01.dbf
datafile 4 switched to datafile copy
input datafile copy RECID=8 STAMP=1222696978 file name=/data/u02/rkhy/oradata/users01.dbf
Finished Duplicate Db at 16-JAN-26

RMAN> 
View Code

3.2.步骤 2:备库状态验证(修正:无需手动 mount)

# 备库 sqlplus 执行
sqlplus / as sysdba
-- 1. 验证备库状态(克隆后已自动MOUNT)
select database_role, open_mode from v$database;
-- 正确输出:
-- DATABASE_ROLE=PHYSICAL STANDBY
-- OPEN_MODE=MOUNTED

-- 2. 验证Standby Redo Logs(克隆主库后自动同步)
select group#, type, status from v$logfile where type='STANDBY';
-- 输出包含GROUP 4-7,TYPE=STANDBY(与主库一致)
 
SQL> select database_role, open_mode from v$database;

DATABASE_ROLE    OPEN_MODE
---------------- --------------------
PHYSICAL STANDBY MOUNTED

SQL> select group#, type, status from v$logfile where type='STANDBY';

    GROUP# TYPE    STATUS
---------- ------- -------
         4 STANDBY
         5 STANDBY
         6 STANDBY
         7 STANDBY
View Code

3.3.步骤 3:备库启动日志应用(修正后,解决 ORA-38500)

场景 1:已创建 SRL(推荐,使用实时应用)

# 备库执行(USING CURRENT LOGFILE 需SRL支持)
alter database open; -- 11.2.0.4 已经支持ADG alter database recover managed standby database using current logfile disconnect from session;
SQL> alter database recover managed standby database using current logfile disconnect from session;

Database altered.

SQL> select process, status from v$managed_standby;

PROCESS   STATUS
--------- ------------
ARCH      CONNECTED
ARCH      CONNECTED
ARCH      CONNECTED
ARCH      CONNECTED
MRP0      WAIT_FOR_LOG
RFS       IDLE
RFS       IDLE

7 rows selected.

SQL> 
View Code

场景 2:未创建 SRL(临时方案,去掉 USING CURRENT LOGFILE)

# 备库执行(无SRL时的兼容命令)
alter database recover managed standby database disconnect from session;

验证日志应用状态

select process, status,sequence# from v$managed_standby;
-- 正确输出:
-- MRP0 | APPLYING_LOG(实时应用) 或 WAITING_FOR_LOG(非实时)
-- RFS  | ATTACHED(接收主库日志)
SQL> select process, status, sequence# from v$managed_standby where process='MRP0';

PROCESS   STATUS        SEQUENCE#
--------- ------------ ----------
MRP0      APPLYING_LOG         13

4. 搭建后:主备库同步验证(全量验证)

4.1.验证 1:备库核心状态(必查)

# 备库 sqlplus 执行
sqlplus / as sysdba
-- 1. 备库角色与模式
select database_role, open_mode from v$database;
-- 输出:PHYSICAL STANDBY / MOUNTED

-- 2. Standby Redo Logs状态
select group#, status from v$standby_log;
-- 输出:STATUS=UNUSED/ACTIVE(正常)

-- 3. 日志应用进程
select process, status, client_process from v$managed_standby;
-- 输出包含:
-- RFS | ATTACHED | LGWR(主库LGWR推送日志)
-- MRP0 | APPLYING_LOG | N/A(应用日志)
SQL> 
SQL> select database_role, open_mode from v$database;

DATABASE_ROLE    OPEN_MODE
---------------- --------------------
PHYSICAL STANDBY MOUNTED

SQL> select group#, status from v$standby_log;

    GROUP# STATUS
---------- ----------
         4 ACTIVE
         5 ACTIVE
         6 UNASSIGNED
         7 UNASSIGNED

SQL> select process, status, client_process from v$managed_standby;

PROCESS   STATUS       CLIENT_P
--------- ------------ --------
ARCH      CONNECTED    ARCH
ARCH      CONNECTED    ARCH
ARCH      CONNECTED    ARCH
ARCH      CONNECTED    ARCH
MRP0      APPLYING_LOG N/A
RFS       IDLE         UNKNOWN
RFS       IDLE         UNKNOWN
RFS       IDLE         ARCH
RFS       IDLE         LGWR

9 rows selected.

SQL> 
View Code

4.2.验证 2:主库日志切换同步(关键)

# 主库执行
sqlplus / as sysdba
-- 1. 切换redo日志
alter system switch logfile;
-- 2. 查看主库当前序列号
select max(sequence#) from v$archived_log;
SQL> alter system switch logfile;

System altered.

SQL> alter system switch logfile;

System altered.

SQL> alter system switch logfile;

System altered.

SQL> select max(sequence#) from v$archived_log;

MAX(SEQUENCE#)
--------------
            35

SQL> 
View Code
# 备库执行(验证序列号同步)
select max(sequence#) from v$archived_log;
-- 备库序列号应与主库一致(实时应用)或仅差1(非实时)
SQL> select max(sequence#) from v$archived_log;

MAX(SEQUENCE#)
--------------
            24

SQL> select max(sequence#) from v$archived_log;

MAX(SEQUENCE#)
--------------
            35

SQL> 
View Code

4.3.验证 3:业务数据同步(可选)

# 主库创建测试表
sqlplus 业务用户/密码@RKHY_PRIMARY
create table test_dg(id number, name varchar2(20));
insert into test_dg values(1, 'SRL_TEST');
commit;
alter system switch logfile;

# 备库只读打开验证
sqlplus / as sysdba
-- 数据库已经处于ADG状态,会实时应用主库变更
select * from test_dg; -- 能查询到数据
-- 恢复日志应用
alter database recover managed standby database using current logfile disconnect from session;

5. 主从重要参数回顾

参数名必要性(11g 11.2.0.4)核心含义未配置 / 配置错误后果主库(RKHY_PRIMARY)配置示例备库(RKHY_STANDBY)配置示例
DB_UNIQUE_NAME 强制必须(DG 核心,Oracle 强制) DG 集群全局唯一标识,区分主备库,需与 LOG_ARCHIVE_CONFIG 的 DG_CONFIG 匹配,可与 DB_NAME 不同 1. DG 身份认证失效,报 ORA-16197(DB_UNIQUE_NAME 不匹配);2. 日志传输中断,切换状态始终 NOT ALLOWED;3. 极端情况数据库无法启动 DB_UNIQUE_NAME=RKHY_PRIMARY DB_UNIQUE_NAME=RKHY_STANDBY
LOG_ARCHIVE_CONFIG 强制必须(DG 核心,无则 DG 完全失效) DG 日志传输 “白名单”,指定集群内所有库的 DB_UNIQUE_NAME,控制日志收发开关 1. 主备互拒日志传输,报 ORA-16191(未授权发送);2. RFS 进程无法启动,主备同步完全中断;3. 无法执行任何切换操作 LOG_ARCHIVE_CONFIG='DG_CONFIG=(RKHY_PRIMARY,RKHY_STANDBY)' LOG_ARCHIVE_CONFIG='DG_CONFIG=(RKHY_PRIMARY,RKHY_STANDBY)'
LOG_ARCHIVE_DEST_1 强制必须(归档模式基础,所有库必配) 本地归档日志存储路径,VALID_FOR 限定 “所有日志 / 所有角色”,DB_UNIQUE_NAME 指向自身 1. 主库报 ORA-00257(归档器错误),数据库 Hang / 停库;2. 备库无法存储接收的日志,MRP 进程中断;3. 归档模式下无法 open 数据库 LOG_ARCHIVE_DEST_1='LOCATION=/data/u02/rkhy/archivelog VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=RKHY_PRIMARY' LOG_ARCHIVE_DEST_1='LOCATION=/data/u02/rkhy/archivelog VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=RKHY_STANDBY'
LOG_ARCHIVE_DEST_2 强制必须(DG 日志传输唯一通道) 跨库日志传输通道,SERVICE 指向对方 TNS,配置传输模式(LGWR/ARCH)、同步方式(SYNC/ASYNC),VALID_FOR 限定 “联机日志 / 所有角色” 1. 主备无日志传输通道,同步完全中断;2. 配置错误报 ORA-16055(DG 目标拒绝接收);3. 无同步基础,无法完成角色切换 LOG_ARCHIVE_DEST_2='SERVICE=RKHY_STANDBY LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=RKHY_STANDBY' LOG_ARCHIVE_DEST_2='SERVICE=RKHY_PRIMARY LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=RKHY_PRIMARY'
FAL_SERVER 建议必配(非强制但生产必用,DG 自愈核心) 备库拉取缺失归档的目标端(主库 TNS),主库可配备库 TNS(双向容错) 1. 备库出现日志间隙(v$archive_gap)无法自动修复;2. 需手动拷贝归档并注册,主备易不一致;3. 切换状态持续 NOT ALLOWED FAL_SERVER=RKHY_STANDBY FAL_SERVER=RKHY_PRIMARY
FAL_CLIENT 建议必配(与 FAL_SERVER 配套使用) 向 FAL_SERVER 请求日志时,自身的 TNS 别名,让对方识别本端身份 1. 即使配 FAL_SERVER,主库无法识别备库,日志间隙仍无法修复;2. RFS 进程报 “未知客户端” 错误,日志回传失败 FAL_CLIENT=RKHY_PRIMARY FAL_CLIENT=RKHY_STANDBY
STANDBY_FILE_MANAGEMENT 建议必配(非强制但生产必用,降低维护成本) 控制备库是否自动同步主库文件操作(新增 / 删除数据文件、扩容),仅 AUTO/MANUAL 两个值 1. 主库新增 / 扩容数据文件,备库报 ORA-01157(无法识别数据文件),MRP 中断;2. 需手动创建文件 + 注册日志,维护成本极高 STANDBY_FILE_MANAGEMENT=AUTO STANDBY_FILE_MANAGEMENT=AUTO
DB_FILE_NAME_CONVERT 条件必配(主备数据文件路径不同则必须,相同则可选) 主库数据文件路径→备库数据文件路径的映射,按 “主路径,备路径” 成对配置,支持多路径 1. RMAN 克隆备库报 ORA-01501(创建数据库失败);2. 备库无法找到数据文件,MRP 进程中断;3. 克隆直接失败 (路径相同时不配)
 
路径不同:
 
DB_FILE_NAME_CONVERT='/data/u01/oradata/RKHY_PRIMARY','/data/u01/oradata/RKHY_STANDBY'
(路径相同时不配)
 
路径不同:
 
DB_FILE_NAME_CONVERT='/data/u01/oradata/RKHY_PRIMARY','/data/u01/oradata/RKHY_STANDBY'
LOG_FILE_NAME_CONVERT 条件必配(主备重做日志 / SRL 路径不同则必须,相同则可选) 主库重做日志 / SRL 路径→备库日志路径的映射,按 “主路径,备路径” 成对配置,支持多路径 1. 备库 RFS 进程无法写入日志文件,日志接收中断;2. MRP 进程无日志可应用,主备同步失效;3. 切换时无法挂载日志 (路径相同时不配)
 
路径不同:
 
LOG_FILE_NAME_CONVERT='/redo/RKHY_PRIMARY','/redo/RKHY_STANDBY'
(路径相同时不配)
 
路径不同:
 
LOG_FILE_NAME_CONVERT='/redo/RKHY_PRIMARY','/redo/RKHY_STANDBY'

6. 核心报错解决与注意点(重点回顾)

6.1. RMAN-05537: DUPLICATE without TARGET connection...

  • 报错原因:备库用 SPFILE 启动到 NOMOUNT,11g RMAN 克隆备库时,辅助实例 SPFILE 启动会与SPFILE子句冲突;
  • 解决方案:备库必须通过PFILE启动到 NOMOUNT(仅需极简 PFILE,包含 DB_NAME/SID 即可);
  • 注意点:备库 PFILE 路径必须正确($ORACLE_HOME/dbs/init<SID>.ora),启动时显式指定pfile=

6.2. ORA-01100: database already mounted

  • 报错原因:RMAN 克隆备库时,会自动执行alter database mount standby database,手动再次执行则冲突;
  • 解决方案:克隆完成后,备库已处于 MOUNT 状态,无需手动执行mount standby database
  • 注意点:克隆后直接验证备库角色即可,跳过手动 mount 步骤。

6.3. ORA-38500: USING CURRENT LOGFILE option not available without standby redo logs

  • 报错原因:USING CURRENT LOGFILE(实时应用日志)依赖 Standby Redo Logs(SRL),11g 默认不创建 SRL;
  • 解决方案:
    • 方案 1(推荐):主库提前创建 SRL(组数 = 主库 redo 组数 + 1,大小一致),克隆后备库自动同步;
    • 方案 2(临时):去掉USING CURRENT LOGFILE,使用alter database recover managed standby database disconnect;
     
  • 注意点:SRL 的大小必须与主库在线 redo 日志一致,路径需与主库 redo 日志同目录,确保备库有对应目录权限。

6.4. 其他关键注意点

  • 主库创建 SRL 后,需确保克隆前主库已切换过日志(alter system switch logfile),让 SRL 生效;
  • 备库克隆成功后,若需切换为 SPFILE 启动(生产环境),可在克隆完成后执行:create spfile from pfile;,重启时用 SPFILE;
  • 主库log_archive_dest_2LGWR ASYNC依赖 SRL,若无 SRL 会降级为 ARCH 进程推送,实时性降低。

7. 最终验证标准

  1. 备库 MRP0 进程状态为APPLYING_LOG,RFS 进程为ATTACHED
  2. 主库切换日志后,备库归档序列号实时同步;
  3. 备库可通过USING CURRENT LOGFILE启动实时日志应用,无 ORA-38500 报错;
  4. 主库插入数据,备库可查询到同步数据。
 
按以上步骤执行,可彻底解决所有实操报错,搭建稳定的 Oracle 11g 物理 Data Guard 主备架构。
 posted on 2026-01-16 14:24  xibuhaohao  阅读(3)  评论(0)    收藏  举报