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

主备库同时配置如下环境变量:
ORACLE_HOME:E:\app\Administrator\product\11.2.0\dbhome_1
ORACLE_SID:shopfloo
二、主库配置
1. 启用归档模式 & 强制日志
-- 以 sysdba 登录 SQL*Plus
sqlplus / as sysdba
-- 关闭数据库
SHUTDOWN IMMEDIATE;
-- 启动到 mount 状态
STARTUP MOUNT;
-- 启用归档
ALTER DATABASE ARCHIVELOG;
-- 启用强制日志
ALTER DATABASE FORCE LOGGING;
-- 打开数据库
ALTER DATABASE OPEN;
验证:
ARCHIVE LOG LIST;
SELECT force_logging FROM v$database; -- 应为 YES
2. 创建 standby redo log(SRL)
建议数量 = 主库 redo log 组数 + 1,大小一致。
-- 查看当前 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. 创建控制文件
alter database create standby controlfile as 'E:\shopfloo\standbyfiles\control01.ctl';
4. 修改主库参数(pfile/spfile)
-- 创建 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
5. 重启主库并使用新参数
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 等)
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 文件,替换内容如下:
*.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
4. 启动备库到 nomount 状态
sqlplus / as sysdba
STARTUP NOMOUNT PFILE='E:\shopfloo\standbyfiles\pfile';
四、配置监听器与 TNS
1. 主库 listener.ora(%ORACLE_HOME%\network\admin\listener.ora)
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
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 增加(主备都要配置)
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)
)
)
lsnrctl stop
lsnrctl start
五、使用 RMAN 复制主库到备库
rman TARGET sys/baotianit@primary AUXILIARY sys/baotianit@standby
执行复制命令:
duplicate target database for standby from active database nofilenamecheck;
六、启动备库 Redo Apply(非实时应用)
登录备库:
sqlplus / as sysdba
alter database open;
alter database recover managed standby database disconnect from session;
验证同步状态:
-- 查看进程
SELECT process, status, sequence# FROM v$managed_standby;
-- 查看归档应用情况
SELECT sequence#, applied FROM v$archived_log ORDER BY sequence#;
七、测试同步
在主库插入数据:
CREATE TABLE test_adg (id NUMBER);
INSERT INTO test_adg VALUES (1);
COMMIT;
ALTER SYSTEM SWITCH LOGFILE;
在备库查询(需先取消应用):
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
SELECT * FROM test_adg;
-- 查询完后重新启动 apply
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;
八、注意事项
由于备库要实时同步主库的日志,所以要备库先开启,主库后开,主库先关,备库后关
备库/主库重启数据库服务后,如果数据没有同步,检查备库当前模式,命令如下:
select open_mode from v$database;
-- 如果是read only 需要切换到 read only with apply
-- 备库切换为实时应用
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;
九、常见问题排查

云服务器爆款直降90%
新客首单¥68起 | 人人可享99元套餐,续费同价 | u2a指定配置低至2.5折1年,立即选购享更多福利!