环境介绍
Oracle 11gR2 | 主库 IP:10.10.5.38 | 角色:PRIMARY |DB_UNIQUE_NAME:pay
Oracle 11gR2 | 主库 IP:10.10.5.39 | 角色:STANDBY |DB_UNIQUE_NAME:pay_standby
Oracle 11gR2 | 主库 IP:10.10.5.40 | 角色:Observer |
搭 DG 最怕什么?不是步骤多,是漏了一步自己不知道,等配到 Broker 报 ORA-16610 才发现参数没设对,回头重来。
这份手册把主库端的配置拆成 9 步,每一步都带验证命令,做完一步确认一步,不用等最后一起排查。
先确认环境:
export ORACLE_SID=pay
export ORACLE_HOME=/u01/oracle/11.2.0.3/product
export ORACLE_BASE=/u01/oracle
export PATH=$ORACLE_HOME/bin:$PATH
然后创建必要目录:
mkdir -p /u01/backup/archivelog/pay mkdir -p /u01/oradata/pay/DG_BROKER chown -R oracle:oinstall /u01/backup/archivelog/pay /u01/oradata/pay/DG_BROKER chmod 750 /u01/backup/archivelog/pay /u01/oradata/pay/DG_BROKER
第一步:启用归档模式
DG 的基础,没开归档后面全白搭。
sqlplus / as sysdba
-- 先查当前状态
SELECT DATABASE_ROLE, LOG_MODE FROM V$DATABASE;
如果 LOG_MODE 已经是 ARCHIVELOG,跳过。否则:
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER SYSTEM SET LOG_ARCHIVE_DEST_1='LOCATION=/u01/backup/archivelog/pay';
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;
-- 验证
ARCHIVE LOG LIST;
预期看到 Database log mode: Archive Mode。
第二步:开启 Force Logging
DG 环境下,任何没有产生 redo 的操作都会导致备库数据不一致。Force Logging 强制所有操作写 redo,包括 INSERT /*+ APPEND */ 这类直接路径加载。
SELECT FORCE_LOGGING FROM V$DATABASE;
如果已经是 YES 就跳过,否则:
ALTER DATABASE FORCE LOGGING;
SELECT FORCE_LOGGING FROM V$DATABASE;
第三步:开启 Supplemental Logging
最小附加日志是 DG 同步的基本要求,缺少这一步,某些 DML 操作在备库可能无法正确应用。
SELECT SUPPLEMENTAL_LOG_DATA_MIN FROM V$DATABASE;
不是 YES 的话:
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
验证一下开全了没:
SELECT SUPPLEMENTAL_LOG_DATA_MIN,
SUPPLEMENTAL_LOG_DATA_PK,
SUPPLEMENTAL_LOG_DATA_UI,
SUPPLEMENTAL_LOG_DATA_FK,
SUPPLEMENTAL_LOG_DATA_ALL
FROM V$DATABASE;
SUPPLEMENTAL_LOG_DATA_MIN = YES 就够了。
第四步:配置 Flashback 和 FRA
这一步很多人偷懒跳过,到后面 FSFO 启用不了又回来补。Flashback 是 FSFO 自动切换后主库能 reinstate 的前提,不然后果就是主库掉线后需要全量重建。
ALTER SYSTEM SET DB_FLASHBACK_RETENTION_TARGET=1440 SCOPE=BOTH;
ALTER SYSTEM SET DB_RECOVERY_FILE_DEST='/u01/oracle/fast_recovery_area/pay' SCOPE=BOTH;
ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE=100G SCOPE=BOTH;
查看 Flashback 是否已开启:
SELECT FLASHBACK_ON FROM V$DATABASE;
如果是 NO,需要重启开启:
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE FLASHBACK ON;
ALTER DATABASE OPEN;
SELECT FLASHBACK_ON FROM V$DATABASE; -- 预期 YES
注意:FRA 大小 100G 是参考值,实际按归档量和保留时间调整。太小会导致归档写不进去,主库直接 hang 住。
第五步:修改 DG 初始化参数
这是主库配置最核心的一步,参数设错一个,后面 Broker 配置各种报错。
sqlplus / as sysdba
-- DB_UNIQUE_NAME(静态参数,需重启生效)
ALTER SYSTEM SET db_unique_name='pay' SCOPE=spfile;
-- DG 配置声明
ALTER SYSTEM SET LOG_ARCHIVE_CONFIG='DG_CONFIG=(pay,pay_standby)' SCOPE=BOTH;
-- 清空 DEST_2,交给 Broker 接管
ALTER SYSTEM SET LOG_ARCHIVE_DEST_2='' SCOPE=BOTH;
ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_2=ENABLE SCOPE=BOTH;
-- 快速崩溃恢复
ALTER SYSTEM SET FAST_START_MTTR_TARGET=300 SCOPE=BOTH;
-- 备库文件自动管理
ALTER SYSTEM SET STANDBY_FILE_MANAGEMENT=AUTO SCOPE=BOTH;
-- 文件名转换(主备路径一致则保持相同值)
ALTER SYSTEM SET DB_FILE_NAME_CONVERT='/u01/oradata/pay','/u01/oradata/pay' SCOPE=SPFILE;
ALTER SYSTEM SET LOG_FILE_NAME_CONVERT='/u01/oradata/pay','/u01/oradata/pay' SCOPE=SPFILE;
-- 先关 Broker,改完配置文件路径再开
ALTER SYSTEM SET DG_BROKER_START=FALSE SCOPE=BOTH;
-- 远程登录密码文件
ALTER SYSTEM SET REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE SCOPE=SPFILE;
-- Broker 配置文件路径
ALTER SYSTEM SET DG_BROKER_CONFIG_FILE1='/u01/oradata/pay/DG_BROKER/dr1.dat' SCOPE=BOTH;
ALTER SYSTEM SET DG_BROKER_CONFIG_FILE2='/u01/oradata/pay/DG_BROKER/dr2.dat' SCOPE=BOTH;
-- 启动 Broker
ALTER SYSTEM SET DG_BROKER_START=TRUE SCOPE=BOTH;
要点提醒:
db_unique_name、DB_FILE_NAME_CONVERT、LOG_FILE_NAME_CONVERT、REMOTE_LOGIN_PASSWORDFILE都是SCOPE=SPFILE,必须重启。LOG_ARCHIVE_DEST_2一定要清空,不然 Broker 接管日志传输时会冲突报错。- Broker 配置文件路径要确保目录已存在且有写权限。
第六步:重启数据库
静态参数改完,重启让它们生效。
sqlplus / as sysdba SHUTDOWN IMMEDIATE; STARTUP;
数据库正常启动,无报错即可。如果不放心,跑一下:
SELECT NAME, VALUE FROM V$PARAMETER WHERE NAME IN ('db_unique_name','dg_broker_start','log_archive_config');
第七步:生成备库 PFILE
从 SPFILE 导出,然后把 db_unique_name 改成备库的,传到备库。
sqlplus / as sysdba
CREATE PFILE='/tmp/initpay.ora' FROM SPFILE;
EXIT;
改唯一名:
sed -i "s/db_unique_name='pay'/db_unique_name='pay_standby'/g" /tmp/initpay.ora
grep db_unique_name /tmp/initpay.ora
传到备库:
scp /tmp/initpay.ora oracle@10.10.5.39:/u01/oracle/11.2.0.3/product/dbs/initpay.ora
密码文件也一并传过去:
scp $ORACLE_HOME/dbs/orapwpay oracle@10.10.5.39:$ORACLE_HOME/dbs/orapwpay
第八步:添加 Standby Redo Log
SRL 是备库实时应用(Real-Time Apply)和 DG 有序切换的前提。规格:组数 = 在线 Redo Log 组数 + 1,大小与在线 Redo Log 一致。
先看当前有多少组:
SELECT COUNT(*) FROM V$LOGFILE WHERE TYPE='STANDBY';
不够 4 组的话添加(组号从 11 开始避免冲突):
ALTER DATABASE ADD STANDBY LOGFILE GROUP 11 ('/u01/oradata/pay/standby_redo01.log') SIZE 50M REUSE;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 12 ('/u01/oradata/pay/standby_redo02.log') SIZE 50M REUSE;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 13 ('/u01/oradata/pay/standby_redo03.log') SIZE 50M REUSE;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 14 ('/u01/oradata/pay/standby_redo04.log') SIZE 50M REUSE;
-- 验证
SELECT GROUP#, TYPE, STATUS, MEMBER FROM V$LOGFILE WHERE TYPE='STANDBY' ORDER BY GROUP#;
这里 50M 只是示例,实际大小去查
V$LOG里在线 Redo Log 的大小,保持一致。
第九步:全面验证
做完别急着走,跑一遍完整检查:
sqlplus / as sysdba
SET PAGESIZE 1000
SET LINESIZE 220
PROMPT ===== Database Status =====
SELECT DATABASE_ROLE, OPEN_MODE, LOG_MODE, FLASHBACK_ON FROM V$DATABASE;
PROMPT ===== Archive Status =====
ARCHIVE LOG LIST;
PROMPT ===== DG Parameters =====
SELECT name, value
FROM v$parameter
WHERE name IN (
'log_archive_config', 'log_archive_dest_1', 'log_archive_dest_2',
'log_archive_dest_state_2', 'db_flashback_retention_target',
'db_recovery_file_dest', 'db_recovery_file_dest_size',
'fast_start_mttr_target', 'standby_file_management',
'db_file_name_convert', 'log_file_name_convert',
'dg_broker_start', 'remote_login_passwordfile',
'dg_broker_config_file1', 'dg_broker_config_file2'
);
PROMPT ===== Standby Redo Logs =====
SELECT GROUP#, TYPE, STATUS, MEMBER
FROM V$LOGFILE WHERE TYPE='STANDBY' ORDER BY GROUP#;
验收清单
做完对着这个表逐项确认,少一项后面都要回来补:
| 项目 | 预期值 | 验证 |
|---|---|---|
LOG_MODE |
ARCHIVELOG |
✅ |
FORCE_LOGGING |
YES |
✅ |
SUPPLEMENTAL_LOG_DATA_MIN |
YES |
✅ |
FLASHBACK_ON |
YES |
✅ |
LOG_ARCHIVE_CONFIG |
DG_CONFIG=(pay,pay_standby) |
✅ |
STANDBY_FILE_MANAGEMENT |
AUTO |
✅ |
DG_BROKER_START |
TRUE |
✅ |
REMOTE_LOGIN_PASSWORDFILE |
EXCLUSIVE |
✅ |
| SRL 组数 | 4 | ✅ |
| PFILE 已生成并传至备库 | ✓ | ✅ |
| 密码文件已传至备库 | ✓ | ✅ |
主库搞定之后
- 在备库用 PFILE 创建 SPFILE,启动到 NOMOUNT,RMAN 在线复制。
- 配置
tnsnames.ora,主备互 ping 通。 - 执行 Broker + FSFO 配置,启用 Observer。
整套流程跑通后,SHOW CONFIGURATION 看到 SUCCESS 的那一刻,这半天没白花。
主库配置只是 DG 搭建的一半,备库端和 Broker 配置同样关键。如果这篇对你有用,后续备库和 FSFO 的配置也会整理出来。
专注于 Oracle / MySQL / PostgreSQL / 达梦等主流数据库的运维实战与架构分享,欢迎关注,一起做靠谱的数据库人。
欢迎赞赏支持或留言指正





