暂无图片
暂无图片
3
暂无图片
暂无图片
暂无图片

Oracle 11g DG 主库配置 9 步走,从归档模式到 FSFO 全流程手册

原创 布衣 2026-06-24
204

环境介绍

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_nameDB_FILE_NAME_CONVERTLOG_FILE_NAME_CONVERTREMOTE_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 已生成并传至备库
密码文件已传至备库

主库搞定之后

  1. 在备库用 PFILE 创建 SPFILE,启动到 NOMOUNT,RMAN 在线复制。
  2. 配置 tnsnames.ora,主备互 ping 通。
  3. 执行 Broker + FSFO 配置,启用 Observer。

整套流程跑通后,SHOW CONFIGURATION 看到 SUCCESS 的那一刻,这半天没白花。


主库配置只是 DG 搭建的一半,备库端和 Broker 配置同样关键。如果这篇对你有用,后续备库和 FSFO 的配置也会整理出来。

专注于 Oracle / MySQL / PostgreSQL / 达梦等主流数据库的运维实战与架构分享,欢迎关注,一起做靠谱的数据库人。

欢迎赞赏支持或留言指正
image.png

最后修改时间:2026-06-24 14:32:56
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论