1. 核心说明
RMAN-05537、ORA-01100、ORA-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.前置通用要求(无变化,确保基础环境)
- 主备库关闭防火墙 / SELinux,
oracle用户 UID/GID 一致,/etc/hosts配置主备别名; - 主备库
ORACLE_SID=RKHY,ORACLE_HOME=/data/u01/app/oracle/product/11.2.0.4/db_1; - 主备库 TNS / 监听配置与前文一致,确保
tnsping RKHY_PRIMARY/RKHY_STANDBY均通。 - 注意,监听、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) ) )
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 核心)
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)
# 备库 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]$
[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]$
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';
克隆成功标志
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>
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
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>
场景 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>
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>
# 备库执行(验证序列号同步)
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>
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. 克隆直接失败 | (路径相同时不配)
|
(路径相同时不配)
|
| LOG_FILE_NAME_CONVERT | 条件必配(主备重做日志 / SRL 路径不同则必须,相同则可选) | 主库重做日志 / SRL 路径→备库日志路径的映射,按 “主路径,备路径” 成对配置,支持多路径 | 1. 备库 RFS 进程无法写入日志文件,日志接收中断;2. MRP 进程无日志可应用,主备同步失效;3. 切换时无法挂载日志 | (路径相同时不配)
|
(路径相同时不配)
|
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_2的LGWR ASYNC依赖 SRL,若无 SRL 会降级为 ARCH 进程推送,实时性降低。
7. 最终验证标准
- 备库 MRP0 进程状态为
APPLYING_LOG,RFS 进程为ATTACHED; - 主库切换日志后,备库归档序列号实时同步;
- 备库可通过
USING CURRENT LOGFILE启动实时日志应用,无 ORA-38500 报错; - 主库插入数据,备库可查询到同步数据。
posted on
浙公网安备 33010602011771号