数据库管理399期 2026-01-07
- [数据库管理-第399期 Oracle 19c搭建DG Far Sync日志备库(20260107)](#数据库管理-第399期 Oracle 19c搭建DG Far Sync日志备库(20260107))
-
- [1 RAC下同步数据的痛点](#1 RAC下同步数据的痛点)
- [2 配置Far Sync](#2 配置Far Sync)
-
- [2.1 主库配置](#2.1 主库配置)
- [2.2 生成参数文件并传输至日志备库](#2.2 生成参数文件并传输至日志备库)
- [2.3 备库修改配置文件](#2.3 备库修改配置文件)
- [2.4 配置备库静态监听](#2.4 配置备库静态监听)
- [2.5 主备库配置本地命名](#2.5 主备库配置本地命名)
- [2.6 传输密码文件](#2.6 传输密码文件)
- [2.7 日志备库创建目录](#2.7 日志备库创建目录)
- [2.8 启动日志备库至nomount](#2.8 启动日志备库至nomount)
- [2.9 复制日志备库](#2.9 复制日志备库)
- [2.9 开启db_broker](#2.9 开启db_broker)
- [2.10 创建DG配置](#2.10 创建DG配置)
- [3 检查Far Sync](#3 检查Far Sync)
-
- [3.1 DG配置](#3.1 DG配置)
- [3.2 备库文件](#3.2 备库文件)
- [3.3 切换日志测试](#3.3 切换日志测试)
- 总结
数据库管理-第399期 Oracle 19c搭建DG Far Sync日志备库(20260107)
text
作者:胖头鱼的鱼缸(尹海文)
Oracle ACE Pro: Database
PostgreSQL ACE
10年数据库行业经验
拥有OCM 11g/12c/19c、MySQL 8.0 OCP、Exadata、CDP等认证
墨天轮MVP,ITPUB认证专家
圈内拥有"总监"称号,非著名社恐(社交恐怖分子)
公众号:胖头鱼的鱼缸
CSDN:胖头鱼的鱼缸(尹海文)
墨天轮:胖头鱼的鱼缸
ITPUB:yhw1809
IFClub:胖头鱼的鱼缸
除授权转载并标明出处外,均为"非法"抄袭

调皮一下:虽然本文介绍的是Oracle数据库技术,但并非"49年加入国军"
Oracle DataGuard Far Sync是12c引入的新特性,可以在ADG配置中添加一个独立的用于转储归档日志的特殊备库,可以看做级联备库的一个变种,其主要目的是为了解决远距离容灾传输的延迟,避免日志传输过程中因主库异常中断、网络波动/中断、备库异常等导致数据丢失,做到RPO=0(即数据零丢失)。
当然因为网络环境的进步、成本控制与运维复杂度等因素,这是一个在生成环境中不常用的功能,但是在数据库国产化迁移与同步过程中,这却成了一个非常好用的功能特性。
1 RAC下同步数据的痛点
首先我们看看Oracle Exadata下,ASM实例的PGA与SGA配置:

在这里可以看到ASM实例的PGA配置为400M,SGA配置为3G,都是相对较小,为什么要看这个呢,我们要了解数据同步的机制,主要是全量同步和实时增量同步:
- 全量同步:可以使用SCN+UNDO实现一次性拉取
- 实时增量同步:需要解析数据库操作日志,将数据操作同步到国产数据库中
实时增量同步一般还要求所有表有主键并开启附加日志(这里就不做更详细的介绍了),而解析日志可以通过Oracle Logminr工具从数据库实例中解析数据库归档日志,但这会带来一些其他问题:
- 数据库压力增大:如果单次日志解析范围或频次配置不合理,很容易对源库带来更多的压力,特别是多租户环境下
- 性能不足:通过数据库实例使用Logminr工具解析日志往往满足不了数据实时同步的性能要求
因此很多数据库/数据同步厂商就要求提供ASM的高权限访问账号,直接通过ASM拉取日志解析,以满足性能要求,但这还是会带来一些问题:
- ASM实例PGA和SGA配置较小,大量拉取对ASM稳定性可能带来影响,调整相关参数又涉及集群重启
- ASM实例高权限账号几乎可以读取所有ASM中的文件,这是有一定安全隐患和合规风险的
既然实时同步需求只需要解析归档日志那么回看Far Sync,是不是就非常合适了!
2 配置Far Sync
这里使用(单实例+ASM)+ 单实例来模拟RAC→单实例的DG Far Sync环境配置:

这里省略数据库软件与建库流程(已开启归档),Far Sync备库还需要通过netca创建监听(省略)。这里其实就是要模拟主库与日志备库下面参数的一些差异:

2.1 主库配置
oracle用户下,数据库中执行:
sql
alter database force logging;
alter system set standby_file_management=AUTO;
alter system set dg_broker_config_file1='+DATAC1/DBAAS/dr1dbaas.dat';
alter system set dg_broker_config_file2='+RECOC1/DBAAS/dr2dbaas.dat';
-- 根据实际REDO日志大小配置
-- RAC需要配置thread,每个thread日志组数量大于对应REDO日志组1-2个
alter database add standby logfile group 31 ('+DATAC1') size 200M;
alter database add standby logfile group 32 ('+DATAC1') size 200M;
alter database add standby logfile group 33 ('+DATAC1') size 200M;
alter database add standby logfile group 34 ('+DATAC1') size 200M;
2.2 生成参数文件并传输至日志备库
sql
create pfile='/home/oracle/initdbarch.ora' from spfile;
bash
scp /home/oracle/initdbarch.ora db02:~
2.3 备库修改配置文件
编辑initdbarch.ora:
text
#删除/修改RAC相关内容(根据实际环境)
#将dbaas相关内容修改为dbarch(本次环境)
#添加
db_unique_name='dbarch'
#修改
*.audit_file_dest='/u01/app/oracle/admin/dbarch/adump'
*.control_files='/u01/app/oracle/oradata/dbarch/control01.ctl','/u01/app/oracle/fast_recovery_area/dbarch/control02.ctl'
*.db_create_file_dest='/u01/app/oracle/oradata'
*.db_recovery_file_dest='/u01/app/oracle/fast_recovery_area'
*.dg_broker_config_file1='/u01/app/oracle/oradata/dbarch/dr1dbarch.dat'
*.dg_broker_config_file2='/u01/app/oracle/fast_recovery_area/dbarch/dr2dbarch.dat'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=dbarchXDB)'
*.local_listener='LISTENER_DBARCH'
创建spfile:
sql
create spfile from pfile='/home/oracle/initdbarch.ora';
2.4 配置备库静态监听
bash
cd $ORACLE_HOME/network/admin
编辑listener.ora,添加以下内容:
text
SID_LIST_LISTENER=
(SID_LIST=
(SID_DESC=
(GLOBAL_DBNAME=dbarch)
(SID_NAME=dbarch
(ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1)
)
)
bash
lsnrctl reload

2.5 主备库配置本地命名
bash
cd $ORACLE_HOME/network/admin
编辑tnsnames.ora,编辑为以下内容:
text
#主库
DBAAS =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.10.19)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = dbaas)
)
)
DBARCH =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.10.119)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = dbaas)
)
)
LISTENER_DBAAS =
(ADDRESS = (PROTOCOL = TCP)(HOST = db01)(PORT = 1521))
#备库
DBAAS =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.10.19)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = dbarch)
)
)
DBARCH =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.10.119)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = dbarch)
)
)
LISTENER_DBARCH =
(ADDRESS = (PROTOCOL = TCP)(HOST = db02)(PORT = 1521))
2.6 传输密码文件
bash
scp /u01/app/oracle/product/19.0.0/dbhome_1/dbs/orapwdbaas db02:/u01/app/oracle/product/19.0.0/dbhome_1/dbs/orapwdbarch
# RAC环境中需要现在asmcmd中将ASM中的密码文件复制到本地再传输至备库,同时注意权限:
# -rw-r----- 1 oracle oinstall 2048 Jan 6 01:35 orapwdbaas
2.7 日志备库创建目录
bash
mkdir -p /u01/app/oracle/oradata/dbarch
mkdir -p /u01/app/oracle/fast_recovery_area/dbarch
mkdir -p /u01/app/oracle/admin/dbarch/adump
2.8 启动日志备库至nomount
sql
startup nomount

2.9 复制日志备库
bash
rman target sys/oracle@dbaas auxiliary sys/oracle@dbarch
sql
duplicate target database for farsync from active database;

2.9 开启db_broker
主备数据库均执行:
sql
alter system set dg_broker_start=true;
2.10 创建DG配置
bash
dgmgrl sys/oracle@dbaas
sql
create configuration 'dbdg' as primary database is dbaas connect identifier is dbaas;
add far_sync dbarch as connect identifier is dbarch;
enable configuration;

3 检查Far Sync
3.1 DG配置
sql
show configuration
show database dbaas
show far_sync dbarch

3.2 备库文件

控制文件,DG配置文件,standby logfile和归档日志均正常生成。
3.3 切换日志测试
主库切换日志:
sql
alter system switch logfile;

备库正常生成新的归档日志。
至此DG Far Sync日志备库搭建完成,同步工具可以从日志备库解析日志。
注意:
在实际生成中如果配置了主库归档清除策略,需要测试归档是否能正常删除,是否需要添加force关键字;日志备库同理
总结
本期介绍了DG Far Sync日志备库在数据库国产化过程中的非常规用法与搭建流程。
老规矩,知道写了些啥。