本文是一份 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 环境下配置完成。