环境说明

  • 主库: 10.250.10.11

  • 备库: 10.250.10.12

  • 数据库版本: 11g, 12c, 18c, 21c, 23ai

  • 数据库名称: orcl

  • DB_UNIQUE_NAME: primary (主库), standby (备库)


1. Oracle 11g 主备搭建

1.1 主库准备 (10.250.10.11)

bash
# 1. 检查数据库状态
sqlplus / as sysdba
SELECT name, log_mode, open_mode FROM v$database;

# 2. 启用归档模式(如未启用)
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;

# 3. 启用强制日志记录
ALTER DATABASE FORCE LOGGING;

# 4. 配置归档参数
ALTER SYSTEM SET LOG_ARCHIVE_CONFIG='DG_CONFIG=(primary,standby)' SCOPE=BOTH;
ALTER SYSTEM SET LOG_ARCHIVE_DEST_1='LOCATION=/u01/app/oracle/arch VALID_FOR=(ALL_LOGFILES,ALL_ROLES)' SCOPE=BOTH;
ALTER SYSTEM SET LOG_ARCHIVE_DEST_2='SERVICE=standby LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=standby' SCOPE=BOTH;
ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_2=ENABLE SCOPE=BOTH;

# 5. 创建Standby Redo Logs (建议比Online Redo Logs多1个组)
SELECT group#, bytes FROM v$log; -- 查看当前redo log大小
ALTER DATABASE ADD STANDBY LOGFILE GROUP 4 ('/u01/app/oracle/oradata/orcl/srl4a.rdo') SIZE 50M;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 5 ('/u01/app/oracle/oradata/orcl/srl5a.rdo') SIZE 50M;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 6 ('/u01/app/oracle/oradata/orcl/srl6a.rdo') SIZE 50M;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 7 ('/u01/app/oracle/oradata/orcl/srl7a.rdo') SIZE 50M;

# 6. 备份数据库(为11g的基于备份的duplicate准备)
RMAN> BACKUP DATABASE PLUS ARCHIVELOG;

# 7. 创建密码文件(如不存在)
orapwd file=$ORACLE_HOME/dbs/orapworcl password=oracle entries=10

# 8. 配置监听器和tnsnames.ora
# listener.ora 添加:
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = orcl)
      (ORACLE_HOME = /u01/app/oracle/product/11.2.0/dbhome_1)
      (SID_NAME = orcl)
    )
  )

# tnsnames.ora 添加:
primary =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 10.250.10.11)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )

standby =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 10.250.10.12)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )

1.2 备库初始化 (10.250.10.12)

bash
# 1. 创建必要的目录结构
mkdir -p /u01/app/oracle/admin/orcl/adump
mkdir -p /u01/app/oracle/oradata/orcl
mkdir -p /u01/app/oracle/fast_recovery_area/orcl

# 2. 手动复制密码文件从主库
scp oracle@10.250.10.11:$ORACLE_HOME/dbs/orapworcl $ORACLE_HOME/dbs/

# 3. 手动创建参数文件(基于主库spfile创建pfile并修改)
sqlplus sys/oracle@primary as sysdba
CREATE PFILE='/tmp/init_orcl.ora' FROM SPFILE;

# 修改参数文件关键参数:
*.db_unique_name='standby'
*.log_archive_dest_2='SERVICE=primary LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=primary'
*.fal_server='primary'
*.standby_file_management='AUTO'

# 4. 复制修改后的参数文件到备库
scp /tmp/init_orcl.ora oracle@10.250.10.12:$ORACLE_HOME/dbs/initorcl.ora

# 5. 配置备库网络(与主库类似的tnsnames.ora和listener.ora)

1.3 备库应用配置与验证

bash
# 1. 启动备库到nomount状态
export ORACLE_SID=orcl
sqlplus / as sysdba
STARTUP NOMOUNT PFILE='$ORACLE_HOME/dbs/initorcl.ora'

# 2. 使用RMAN执行Duplicate(基于备份的方式)
rman target sys/oracle@primary auxiliary sys/oracle@standby

RMAN> DUPLICATE TARGET DATABASE FOR STANDBY NOFILENAMECHECK;

# 3. 启动MRP进程
sqlplus / as sysdba
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;

# 4. 验证备库状态
SELECT PROCESS, STATUS, THREAD#, SEQUENCE#, BLOCK#, BLOCKS FROM V$MANAGED_STANDBY;
SELECT DATABASE_ROLE, OPEN_MODE, PROTECTION_MODE FROM V$DATABASE;

2. Oracle 12c 主备搭建

2.1 主库准备 (10.250.10.11)

bash
# 1. 基础配置(同11g,但使用12c的ORACLE_HOME)
# 启用归档、强制日志等步骤相同

# 2. 12c 新特性:使用PDB(可选)
CREATE PLUGGABLE DATABASE pdb1 ADMIN USER pdbadmin IDENTIFIED BY oracle;

# 3. 配置12c特定的归档参数
ALTER SYSTEM SET LOG_ARCHIVE_CONFIG='DG_CONFIG=(primary,standby)' SCOPE=BOTH;
ALTER SYSTEM SET LOG_ARCHIVE_DEST_1='LOCATION=USE_DB_RECOVERY_FILE_DEST VALID_FOR=(ALL_LOGFILES,ALL_ROLES)' SCOPE=BOTH;

2.2 备库初始化 (10.250.10.12)

bash
# 1. 创建目录(同11g)
mkdir -p /u01/app/oracle/oradata/orcl/pdb1

# 2. 启动到nomount状态(无需手动复制参数文件)
sqlplus / as sysdba
STARTUP NOMOUNT;

2.3 备库应用配置与验证

bash
# 1. 使用12c增强的DUPLICATE命令
rman target sys/oracle@primary auxiliary sys/oracle@standby

RMAN> DUPLICATE TARGET DATABASE FOR STANDBY
       FROM ACTIVE DATABASE
       PASSWORD FILE
       SPFILE
         SET db_unique_name='standby'
         SET log_archive_dest_2='SERVICE=primary LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=primary'
         SET fal_server='primary'
       NOFILENAMECHECK;

# 2. 启动MRP进程
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;

# 3. 12c新特性:实时应用验证
SELECT * FROM V$DATAGUARD_STATS;

3. Oracle 18c 主备搭建

3.1 主库准备 (10.250.10.11)

bash
# 1. 18c 新特性:配置自动备库创建优化
ALTER SYSTEM SET STANDBY_MAX_DATA_DELAY=30 SCOPE=BOTH;

# 2. 确保使用本地UNDO表空间(18c默认)
SELECT TABLESPACE_NAME, STATUS FROM DBA_TABLESPACES WHERE CONTENTS='UNDO';

3.2 备库初始化 (10.250.10.12)

bash
# 1. 18c 简化了目录创建,部分目录可自动创建
# 只需确保ORACLE_BASE相关目录存在即可

# 2. 直接启动到nomount
STARTUP NOMOUNT;

3.3 备库应用配置与验证

bash
# 1. 使用18c优化的DUPLICATE命令
rman target sys/oracle@primary auxiliary sys/oracle@standby

RMAN> DUPLICATE TARGET DATABASE FOR STANDBY
       FROM ACTIVE DATABASE
       USING COMPRESSED BACKUPSET
       PASSWORD FILE
       SPFILE
         SET db_unique_name='standby'
         SET log_archive_dest_2='SERVICE=primary LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=primary'
         SET db_recovery_file_dest_size='50G'
       NOFILENAMECHECK
       SECTION SIZE 1G;

# 2. 18c新特性:使用Far Sync实例(如配置)
# 3. 验证18c的Active Data Guard增强功能
SELECT * FROM V$STANDBY_EVENT_HISTOGRAM;

4. Oracle 21c 主备搭建

4.1 主库准备 (10.250.10.11)

bash
# 1. 21c 新特性:配置Block Change Tracking优化
ALTER DATABASE ENABLE BLOCK CHANGE TRACKING;

# 2. 使用21c的自动化调优特性
ALTER SYSTEM SET STANDBY_NOLOGGING_MODE=OPTIMIZE;

4.2 备库初始化 (10.250.10.12)

bash
# 1. 21c 支持更灵活的存储配置
# 可考虑使用ASM或云存储

# 2. 启动到nomount状态
STARTUP NOMOUNT;

4.3 备库应用配置与验证

bash
# 1. 使用21c增强的DUPLICATE命令
rman target sys/oracle@primary auxiliary sys/oracle@standby

RMAN> DUPLICATE TARGET DATABASE FOR STANDBY
       FROM ACTIVE DATABASE
       PASSWORD FILE
       SPFILE
         SET db_unique_name='standby'
         SET log_archive_dest_2='SERVICE=primary LGWR ASYNC NOAFFIRM VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=primary'
         SET "_exadata_feature_on"=TRUE
       NOFILENAMECHECK
       PARALLEL 4;

# 2. 验证21c新特性
SELECT * FROM V$DG_BROKER_CONFIG;

5. Oracle 23ai 主备搭建

5.1 主库准备 (10.250.10.11)

bash
# 1. 23ai 新特性:配置AI驱动的优化
ALTER SYSTEM SET "_optimizer_adaptive_plans"=TRUE;

# 2. 确保使用最新安全特性
ALTER SYSTEM SET SQLNET.ENCRYPTION_SERVER=REQUIRED;

5.2 备库初始化 (10.250.10.12)

bash
# 1. 23ai 支持完全的自动化配置
# 使用DBCA或Cloud Control可进一步简化

# 2. 启动到nomount状态
STARTUP NOMOUNT;

5.3 备库应用配置与验证

bash
# 1. 使用23ai最简化的DUPLICATE命令
rman target sys/oracle@primary auxiliary sys/oracle@standby

RMAN> DUPLICATE TARGET DATABASE FOR STANDBY
       FROM ACTIVE DATABASE
       PASSWORD FILE
       SPFILE
       NOFILENAMECHECK;

# 2. 23ai 自动化程度最高,很多参数可自动识别
# 3. 验证23ai的Active Data Guard增强
SELECT * FROM V$DG_STANDBY_FAST_START_FAILOVER;

6. 通用验证步骤(所有版本)

6.1 主备同步状态验证

sql
-- 在主库检查
SELECT sequence#, applied FROM v$archived_log ORDER BY sequence# DESC;

-- 在备库检查
SELECT process, status, sequence#, block# FROM v$managed_standby;
SELECT database_role, open_mode, protection_mode FROM v$database;

-- 测试数据同步
-- 在主库创建测试表
CREATE TABLE dg_test (id NUMBER, data VARCHAR2(50));
INSERT INTO dg_test VALUES (1, 'Data Guard Test');
COMMIT;

-- 在备库查询(需要先启用实时查询)
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
ALTER DATABASE OPEN READ ONLY;
SELECT * FROM dg_test;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;

6.2 切换测试

sql
-- 主库切换为备库
ALTER DATABASE COMMIT TO SWITCHOVER TO STANDBY;
-- 备库切换为主库  
ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;

7. 搭建过程相关问题详解

7.1. Oracle 11g 是否支持不基于备份的 DUPLICATE?

是的,Oracle 11g 也支持不基于备份的 Active Database Duplicate,但有局限性。

11g 的 Active Duplicate 命令:

sql
RMAN> DUPLICATE TARGET DATABASE FOR STANDBY 
       FROM ACTIVE DATABASE
       NOFILENAMECHECK;

但是需要注意:

  • 11g 的 Active Duplicate 功能相对不够成熟稳定,在大型生产环境中可能出现问题

  • 对网络要求极高,必须保证在整个复制过程中网络绝对稳定

  • 对主库性能影响更大,因为是实时传输所有数据文件

为什么教程中推荐基于备份的方式:

sql
-- 先备份
RMAN> BACKUP DATABASE PLUS ARCHIVELOG;

-- 再基于备份duplicate
RMAN> DUPLICATE TARGET DATABASE FOR STANDBY NOFILENAMECHECK;

优势:

  • 更稳定可靠,适合生产环境

  • 网络中断可以重试,不会从头开始

  • 对主库影响相对较小

结论:在 11g 中,生产环境推荐使用基于备份的方式,12c 及以后版本再使用 Active Duplicate。


7.2. 密码文件密码设置问题

bash
orapwd file=$ORACLE_HOME/dbs/orapworcl password=oracle entries=10

密码设置原则:

  • password=oracle 不是随便设置的,需要遵循安全规范

  • 实际生产环境:必须使用强密码(大小写字母+数字+特殊字符,至少8位)

  • 测试环境:可以使用简单密码,但要确保安全

  • 密码必须与sys用户密码一致

重要规则:

  1. 主库和备库的 SYS 密码必须一致

  2. 如果有其他 SYSDBA 用户,他们的密码在主备库也要一致

  3. entries=10 表示密码文件最多可以存储10个用户(包括SYS)

生产环境推荐:

bash
# 生产环境应该这样创建
orapwd file=$ORACLE_HOME/dbs/orapworcl password='MyStrongPass123!' entries=20

7.3. RMAN 连接参数详解

bash
rman target sys/oracle@primary auxiliary sys/oracle@standby

参数分解:

  • target:指定主库(源数据库)的连接信息

    • sys/oracle:用户名/密码

    • @primary:主库的TNS别名(在tnsnames.ora中定义)

  • auxiliary:指定备库(辅助实例)的连接信息

    • sys/oracle:用户名/密码(必须与主库sys密码一致)

    • @standby:备库的TNS别名

连接过程说明:

  1. RMAN 首先连接到 target(主库),获取数据库结构和数据文件信息

  2. 然后连接到 auxiliary(备库),在备库上执行恢复操作

  3. 两个连接必须同时成功,否则duplicate会失败

验证连接:

在执行duplicate前,建议先测试连接:

bash
# 测试主库连接
sqlplus sys/oracle@primary as sysdba

# 测试备库连接  
sqlplus sys/oracle@standby as sysdba

7.4. 归档参数配置详解

问题分析:

sql
ALTER SYSTEM SET LOG_ARCHIVE_DEST_1='LOCATION=USE_DB_RECOVERY_FILE_DEST VALID_FOR=(ALL_LOGFILES,ALL_ROLES)' SCOPE=BOTH;

这个参数不是Data Guard专用的,但是必须配置的。

参数作用分解:

LOG_ARCHIVE_DEST_1(本地归档):

  • 作用:指定归档日志的本地存储位置

  • 必要性:无论是否搭建DG,只要启用归档模式就必须配置

  • 参数说明:

    • LOCATION=USE_DB_RECOVERY_FILE_DEST:使用快速恢复区存储归档日志

    • VALID_FOR=(ALL_LOGFILES,ALL_ROLES):在任何角色下都对所有日志文件有效

LOG_ARCHIVE_DEST_2(远程归档 - DG专用):

sql
ALTER SYSTEM SET LOG_ARCHIVE_DEST_2='SERVICE=standby LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=standby' SCOPE=BOTH;
  • 作用:指定归档日志传输到备库

  • 这才是Data Guard的核心参数

为什么需要两个destinations:

 
Destination用途是否必须
DEST_1 本地归档:保证主库本地的归档日志完整性,用于主库自己的恢复 ✅ 必须
DEST_2 远程传输:将重做日志实时传输到备库,用于数据同步 ✅ Data Guard必须

完整的最小化配置示例:

sql
-- 1. 本地归档(所有数据库都需要)
ALTER SYSTEM SET LOG_ARCHIVE_DEST_1='LOCATION=/u01/arch VALID_FOR=(ALL_LOGFILES,ALL_ROLES)' SCOPE=BOTH;

-- 2. 远程归档(Data Guard专用)
ALTER SYSTEM SET LOG_ARCHIVE_DEST_2='SERVICE=standby LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=standby' SCOPE=BOTH;

-- 3. DG配置
ALTER SYSTEM SET LOG_ARCHIVE_CONFIG='DG_CONFIG=(primary,standby)' SCOPE=BOTH;

7.5. 问题总结

  1. 11g的DUPLICATE:生产环境推荐基于备份的方式更稳定

  2. 密码文件:生产环境必须使用强密码,主备库密码一致

  3. RMAN连接:理解target和auxiliary的区别很重要

  4. 归档参数:DEST_1是基础归档配置,DEST_2才是DG专用的同步参数

8. 总结

通过以上详细的步骤,您可以清晰地看到从Oracle 11g到23ai在Data Guard搭建方面的演进:

  1. 11g: 大量手动操作,需要复制密码文件和参数文件

  2. 12c: 引入PASSWORD FILESPFILE自动化,简化流程

  3. 18c: 优化网络传输和压缩,提升大数据库复制效率

  4. 21c: 进一步增强自动化和云集成

  5. 23ai: 实现最高程度的自动化,智能配置

每个新版本都在简化操作、提升性能和增强可靠性方面做出了重要改进。

 posted on 2025-09-23 16:14  xibuhaohao  阅读(11)  评论(0)    收藏  举报