Oracle 11g ADG 主从复制配置手册(Windows 环境)

本文是一份 Windows 环境下 Oracle 11g 搭建 ADG(Active Data Guard)主从复制 的详细配置手册。本手册假设你已经安装好了 Oracle 11gR2(11.2.0.4 推荐)数据库软件,并具备基本的 Windows 和 Oracle 操作知识。


📘 Oracle 11g ADG 主从复制配置手册(Windows 环境)

说明:

  • ADG(Active Data Guard)功能在 Oracle 11g 中仅限企业版(Enterprise Edition)。
  • 本手册以 主库(Primary)→ 备库(Standby) 单向同步为例。
  • 所有操作需以管理员身份运行命令提示符(CMD)或 PowerShell。
  • 本文使用 物理备库(Physical Standby) + 实时应用(Real-Time Apply) 配置。

一、环境准备

项目 主库(Primary) 备库(Standby)
主机名 THINKSERVER WIN-MH9H5DD2I4Q
IP 地址 192.168.254.253 192.168.119.200
Oracle SID SHOPFLOO SHOPFLOO
DB_UNIQUE_NAME primary standby
归档模式 启用 ---
强制日志 启用 ---
密码文件 已创建 需复制
监听器 已配置 需配置
TNSNAMES.ORA 包含双方连接串 包含双方连接串

⚠️ 注意:SID 可以相同,但 DB_UNIQUE_NAME 必须不同。

主备库同时配置如下环境变量:

ORACLE_HOME:E:\app\Administrator\product\11.2.0\dbhome_1

ORACLE_SID:shopfloo


二、主库配置

1. 启用归档模式 & 强制日志

sql 复制代码
-- 以 sysdba 登录 SQL*Plus
sqlplus / as sysdba

-- 关闭数据库
SHUTDOWN IMMEDIATE;

-- 启动到 mount 状态
STARTUP MOUNT;

-- 启用归档
ALTER DATABASE ARCHIVELOG;

-- 启用强制日志
ALTER DATABASE FORCE LOGGING;

-- 打开数据库
ALTER DATABASE OPEN;

验证:

sql 复制代码
ARCHIVE LOG LIST;

SELECT force_logging FROM v$database; -- 应为 YES

2. 创建 standby redo log(SRL)

建议数量 = 主库 redo log 组数 + 1,大小一致。

sql 复制代码
-- 查看当前 redo log

SELECT group#, bytes/1024/1024 "MB" FROM v$log;

-- 假设主库有 3 组 redo log(每组 50M),则创建 4 组 SRL
ALTER DATABASE ADD STANDBY LOGFILE GROUP 4 ('E:\app\Administrator\oradata\SHOPFLOO\redo04.log') SIZE 50M;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 5 ('E:\app\Administrator\oradata\SHOPFLOO\redo05.log') SIZE 50M;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 6 ('E:\app\Administrator\oradata\SHOPFLOO\redo06.log') SIZE 50M;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 7 ('E:\app\Administrator\oradata\SHOPFLOO\redo07.log') SIZE 50M;

3. 创建控制文件

sql 复制代码
alter database create standby controlfile as 'E:\shopfloo\standbyfiles\control01.ctl';

4. 修改主库参数(pfile/spfile)

sql 复制代码
-- 创建 pfile 用于编辑
CREATE PFILE='E:\shopfloo\standbyfiles\pfile' FROM SPFILE;

-- 编辑 pfile,添加以下参数:
*.DB_UNIQUE_NAME='primary'
*.LOG_ARCHIVE_CONFIG='DG_CONFIG=(primary,standby)'
*.LOG_ARCHIVE_DEST_1= 'LOCATION=E:\app\Administrator\oradata\SHOPFLOO\archivelog VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=primary'
*.LOG_ARCHIVE_DEST_2= 'SERVICE=standby LGWR SYNC AFFIRM VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=standby'
*.LOG_ARCHIVE_DEST_STATE_1=ENABLE
*.LOG_ARCHIVE_DEST_STATE_2=ENABLE
*.REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE
*.LOG_ARCHIVE_FORMAT=%t_%s_%r.arc
*.FAL_SERVER='standby'
*.FAL_CLIENT='primary'
*.STANDBY_FILE_MANAGEMENT=AUTO

替换路径为你实际的归档目录和 Oracle 安装路径。

5. 重启主库并使用新参数

sql 复制代码
SHUTDOWN IMMEDIATE;

STARTUP PFILE='E:\shopfloo\standbyfiles\pfile';

-- 创建新的 spfile
CREATE SPFILE FROM PFILE='E:\shopfloo\standbyfiles\pfile';

SHUTDOWN IMMEDIATE;

STARTUP; -- 使用 spfile 启动

-- 配置数据库为最大可用
select database_role, protection_mode, protection_level from v$database;
-- 如果是maximum performance
-- 修改为maximize availability;
alter database set standby database to maximize availability;

确保主备库密码一致!


三、备库准备

原则上主备库的目录结构,数据文件均一致

1. 创建相同目录结构

在备库主机上创建与主库相同的目录(如 oradata、archivelog、admin 等):

cmd 复制代码
mkdir E:\app\Administrator\oradata\SHOPFLOO\archivelog

2. 复制控制文件和密码文件

将主库的E:\app\Administrator\oradata\SHOPFLOO\CONTROL01.CTL复制到备库的E:\app\Administrator\oradata\SHOPFLOO\目录进行替换。

将主库的E:\app\Administrator\oradata\SHOPFLOO\CONTROL01.CTL复制到备库的E:\app\Administrator\flash_recovery_area\SHOPFLOO\目录,将名称修改为CONTROL02.CTL替换原来的文件。

将主库的 E:\app\Administrator\product\11.2.0\dbhome_1\database\PWDSHOPFLOO.ora 复制到备库的 E:\app\Administrator\product\11.2.0\dbhome_1\database\ 目录进行替换。

3. 创建备库参数文件

复制主库的 E:\shopfloo\standbyfiles\pfile 文件,替换内容如下:

ini 复制代码
*.DB_UNIQUE_NAME='standby'
*.LOG_ARCHIVE_CONFIG='DG_CONFIG=(primary,standby)'
*.LOG_ARCHIVE_DEST_1= 'LOCATION=E:\app\Administrator\oradata\SHOPFLOO\archivelog VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=standby'
*.LOG_ARCHIVE_DEST_2= 'SERVICE=primary LGWR SYNC AFFIRM VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=primary'
*.LOG_ARCHIVE_DEST_STATE_1=ENABLE
*.LOG_ARCHIVE_DEST_STATE_2=ENABLE
*.REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE
*.LOG_ARCHIVE_FORMAT=%t_%s_%r.arc
*.FAL_SERVER='primary'
*.FAL_CLIENT='standby'
*.STANDBY_FILE_MANAGEMENT=AUTO

注意:db_name 必须与主库一致,db_unique_name 不同。

4. 启动备库到 nomount 状态

cmd 复制代码
sqlplus / as sysdba
sql 复制代码
STARTUP NOMOUNT PFILE='E:\shopfloo\standbyfiles\pfile';

四、配置监听器与 TNS

1. 主库 listener.ora(%ORACLE_HOME%\network\admin\listener.ora)

ini 复制代码
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = CLRExtProc)
      (ORACLE_HOME = E:\app\Administrator\product\11.2.0\dbhome_1)
      (PROGRAM = extproc)
      (ENVS = "EXTPROC_DLLS=ONLY:E:\app\Administrator\product\11.2.0\dbhome_1\bin\oraclr11.dll")
    )
    (SID_DESC =
      (GLOBAL_DBNAME = shopfloo)
      (ORACLE_HOME = E:\app\Administrator\product\11.2.0\dbhome_1)
      (SID_NAME = shopfloo)
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = THINKSERVER)(PORT = 1521))
    )
  )

ADR_BASE_LISTENER = E:\app\Administrator

2. 备库 listener.ora

ini 复制代码
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = CLRExtProc)
      (ORACLE_HOME = E:\app\Administrator\product\11.2.0\dbhome_1)
      (PROGRAM = extproc)
      (ENVS = "EXTPROC_DLLS=ONLY:E:\app\Administrator\product\11.2.0\dbhome_1\bin\oraclr11.dll")
    )
    (SID_DESC =
      (GLOBAL_DBNAME = shopfloo)
      (ORACLE_HOME = E:\app\Administrator\product\11.2.0\dbhome_1)
      (SID_NAME = shopfloo)
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = WIN-MH9H5DD2I4Q)(PORT = 1521))
    )
  )

ADR_BASE_LISTENER = E:\app\Administrator

3. 双方 tnsnames.ora 增加(主备都要配置)

ini 复制代码
PRIMARY =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.254.253)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = shopfloo)
    )
  )

STANDBY =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.119.200)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = shopfloo)
    )
  )

重启监听器:

cmd 复制代码
lsnrctl stop

lsnrctl start

五、使用 RMAN 复制主库到备库

主库 上执行(或通过网络连接到备库实例)

cmd 复制代码
rman TARGET sys/baotianit@primary AUXILIARY sys/baotianit@standby

确保 TNS 配置正确(见第五部分)

执行复制命令:

rman 复制代码
  duplicate target database for standby from active database nofilenamecheck;

此过程会自动创建控制文件、数据文件、spfile,并启动 MRP(Managed Recovery Process)。


六、启动备库 Redo Apply(非实时应用)

登录备库:

sql 复制代码
sqlplus / as sysdba

alter database open;

alter database recover managed standby database disconnect from session;

USING CURRENT LOGFILE 表示启用 Real-Time Apply(需 SRL)。

验证同步状态:

sql 复制代码
-- 查看进程
SELECT process, status, sequence# FROM v$managed_standby;

-- 查看归档应用情况
SELECT sequence#, applied FROM v$archived_log ORDER BY sequence#;

七、测试同步

在主库插入数据:

sql 复制代码
CREATE TABLE test_adg (id NUMBER);

INSERT INTO test_adg VALUES (1);

COMMIT;

ALTER SYSTEM SWITCH LOGFILE;

在备库查询(需先取消应用):

sql 复制代码
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;

SELECT * FROM test_adg;

-- 查询完后重新启动 apply
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;

若能查到数据,说明同步成功。


八、注意事项

由于备库要实时同步主库的日志,所以要备库先开启,主库后开,主库先关,备库后关

备库/主库重启数据库服务后,如果数据没有同步,检查备库当前模式,命令如下:

sql 复制代码
select open_mode from v$database;
-- 如果是read only 需要切换到 read only with apply

-- 备库切换为实时应用
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;

九、常见问题排查

问题 解决
数据未同步 检查数据库当前模式,如果是read only, 需要切换到 read only with apply
TNS 连接失败 检查 listener、tnsnames、防火墙(1521 端口)
密码不一致 确保主备 PWDORCL.ora 相同
归档无法传输 检查 log_archive_dest_2 状态:SELECT dest_name, status, error FROM v$archive_dest;
MRP 未启动 检查 alert 日志(%ORACLE_BASE%\diag\rdbms\orcl\trace\alert_ORCL.log)

✅ 至此,Oracle 11g ADG 主从复制在 Windows 环境下配置完成。

相关推荐
YCOSA20253 小时前
雨晨 Windows 10 企业版 LTSC x64 中度精简 1809 迎双节 17763.9257 特别版
windows
sukalot3 小时前
windows 驱动实例分析系列: HidHide 驱动分析 - drivers 篇(四)
windows·驱动开发
ι:8 小时前
NUC12 Pro 安装 Ubuntu 24.04 LTS 详细教程
linux·windows·ubuntu·nuc
YCOSA20258 小时前
微软宣布将于10月7日举行Windows与Surface发布会,聚焦“Windows、NVIDIA RTX Spark、Surface,以及更广泛PC生态”
windows
Source.Liu9 小时前
【A11】 labelprinter(Tauri 版)新建步骤
windows·rust
Punchline27810 小时前
解决 Windows 环境变量 Path 设置时提示“字符太长”的完整指南
windows·环境变量·path
chushiyunen11 小时前
claude code笔记(二)、claude桌面端(内网不好用)
windows
d_benhua11 小时前
以太网测试步骤
windows
冯一川11 小时前
DeepSeek在Windows系统上部署
windows·python
解道Jdon13 小时前
JDK 27发布:紧凑对象头、G1默认、量子安全TLS
ide·windows·git·svn·eclipse·github·visual studio