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;

九、常见问题排查

阅读剩余
THE END
阿里云ECS特惠活动
阿里云ECS服务器 - 限时特惠活动

云服务器爆款直降90%

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

新客首单¥68起
人人可享99元套餐
弹性计费
7x24小时售后
立即查看活动详情
阿里云ECS服务器特惠活动