使用 OGG 将 Oracle 数据库实时同步到 SQL Server

一、数据初始化(initial load)方式介绍

参考mos文档《Primary Note - Oracle GoldenGate: Initial Load Techniques and References (文档 ID 1311707.1)》

Initial Load Method官方MOS文档参考
Loading Data from File to ReplicatDocument 1441172.1
Loading Data from Trail to ReplicatDocument 1195705.1
Loading Data from File to Database UtilityDocument 1457989.1
Loading Data with an Oracle GoldenGate Direct LoadDocument 1457164.1
Loading Data with a Direct Bulk Load to SQL*LoaderDocument 1461851.1

本文使用的方法是:Direct Load实现Oracle to SQL server异构数据初始化。

二、使用GoldenGate Initial-Load前提条件

  1. 禁用DDL处理

在启动数据初始化之前,确保从Extract和Replicat参数中禁用DDL处理。

  1. 准备目标表
    以下建议可以加快加载速度并帮助您避免错误:
  • 数据:确保目标表为空,除非另有要求。如果目标表中已有数据,可能会出现重复行错误或现有行与正在加载的行之间的冲突。
  • 约束:在目标站点上,禁用外键约束和检查约束。外键约束可能导致错误,检查约束可能会减慢加载过程。加载成功后,可以重新启用这些约束。
  • 禁用目标表上的任何触发器。在数据加载的同时触发的触发器可能会导致错误。初始加载完成后可以重新启用。
  • 索引:从目标表中删除索引。插入操作不需要索引。索引会显著减慢加载过程。每插入一行,数据库都需要更新该表上的每个索引。加载完成后可以重新添加索引。

注意:对于访问DB2 for z/OS目标表的所有应用程序,要求有一个主索引。您可以删除目标表中的所有其他索引,但主索引除外。

  1. 配置源系统和目标系统的管理进程

在两个系统上配置并启动MGR。同一个MGR可以用于初始加载的Extract/Replicat和持续变更同步组。

  1. 创建数据定义文件

如果源数据库和目标数据库的表结构不同,则需要创建数据定义文件,以便将数据转换为目标数据库所需的格式。

有关DEFGEN工具的更多信息以及如何创建数据定义文件,请参阅文档。

  1. 创建变更同步组

如果在初始加载期间源数据库处于静止状态,则可以省略此步骤。

创建在线变更同步Extract和Replicat组,以便在进行初始加载的同时捕获和复制持续的更改。

注意:在所需的确切步骤上,首次启动持续变更同步Extract组非常重要。这取决于初始化数据所采用的具体技术,具体细节请参考相关内容。同样重要的是,持续复制在适当的时间之前不得启动。这个时间通常是在初始加载复制完成之后。

此外,请考虑,在新配置中第一次启动提取时,任何开放的事务将被跳过;新的提取将仅捕获在提取启动后开始的事务。有关在使用Oracle源数据库进行初始加载时如何处理开放事务的信息。

三、同步环境介绍

源端目标端
操作系统CentOS Linux release 7.9.2009 (Core)Windows Server 2019 Datacenter
数据库版本Oracle 11.2.0.4.0SQL Server 2016
实例名orclMSSQLSERVER
IP192.168.10.132192.168.10.192
ogg版本OGG 19.1.0.0.4OGG 19.1.0.0.3
同步目标scott用户下所有表所有表同步到HIS库

四、OGG版本使用

架构Oracle GoldenGate 版本
linuxOracle GoldenGate 19.1.0.0.4 for Oracle on Linux x86-64.zip
windowOracle GoldenGate 19.1.0.0.3 for SQL Server on Windows (64 bit).zip

❗ 注意:官方 OGG19c for SQL server支持SQL server数据库是企业版或标准版,自己测试使用开发版也是能正常同步的。

OGG安装部署参考:
《ogg19c安装部署 for linux Oracle11g》
《OGG19C安装部署 for window sqlserver》

五、源端Oracle进程配置

5.1 数据库设置为归档模式

SQL>alter system set log_archive_dest_1='location=/oraarch/';
SQL>shutdown immediate;
SQL>startup mount;
SQL>alter database archivelog;
SQL>alter database open;

5.2 开启强制日志

SQL>ALTER DATABASE FORCE LOGGING;

5.3 开启附加日志

SQL>ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;

5.4 修改参数

SQL>ALTER SYSTEM SET ENABLE_GOLDENGATE_REPLICATION=TRUE;

5.5 创建用户

5.5.1 创建用户表空间

SQL>create tablespace TSP_OGG datafile '/oradata/orcl/TSP_OGG_01.dbf' size 10M autoextend on next 64M;

5.5.2 创建用户

SQL>create user ogg identified by ogg default tablespace TSP_OGG temporary tablespace temp;

5.5.3 添加权限

SQL>grant dba to ogg;

5.6 添加表附加日志

Shell>cd $OGG_HOME
Shell>ggsci
GGSCI>dblogin userid ogg, password ogg
GGSCI>add trandata SCOTT.*

5.7 MGR进程

GGSCI>edit params mgr
PORT 7809
DYNAMICPORTLIST 7810-7820
PURGEOLDEXTRACTS ./dirdat/*,usecheckpoints,minkeepdays 7
LAGREPORTHOURS 1
LAGINFOMINUTES 30
LAGCRITICALMINUTES 45

5.8 初始化进程extinit

GGSCI>ADD EXTRACT EXINIT, SOURCEISTABLE
GGSCI>INFO EXTRACT *, TASKS

GGSCI> EDIT PARAM EXINIT
EXTRACT EXINIT
userid ogg, password ogg
rmthost 192.168.10.192, mgrport 7809
RMTTASK REPLICAT, GROUP REINIT
table SCOTT.*;

5.9 增量数据捕获进程ext_chg

GGSCI>add extract ext_chg,tranlog,begin now
GGSCI>add exttrail ./dirdat/ex,extract ext_chg,megabytes 1024
GGSCI>edit param ext_chg
extract ext_chg
SETENV (ORACLE_HOME = "/app/oracle/product/11.2.0/db_1")
SETENV (ORACLE_SID = "orcl")
SETENV (NLS_LANG = "AMERICAN_AMERICA.ZHS16GBK")
userid ogg,password ogg
exttrail ./dirdat/ex
TRANLOGOPTIONS DBLOGREADER
EOFDELAYCSECS 50
FLUSHCSECS 50
dynamicresolution
table SCOTT.*;

请注意,当使用 Oracle 自动存储管理(ASM)时,必须在提取参数文件中设置 TRANLOGOPTIONS ASMUSER 和 ASMPASSWORD。这些选项用于指定访问 ASM 存储的凭证。

5.10 增量数据传递进程pu_chg

GGSCI >add extract pu_chg,EXTTRAILSOURCE ./dirdat/ex
GGSCI >add rmttrail ./dirdat/re,ext pu_chg,megabytes 1024
GGSCI >edit param pu_chg
extract pu_chg
userid ogg,password ogg
rmthost 192.168.10.192,mgrport 7809,compress
FLUSHCSECS 40
EOFDELAYCSECS 10
Rmttrail ./dirdat/re
table SCOTT.*;

将ext_chg进程捕获的队列文件写在本地,然后由pump进程再读取本地的trail文件发送到目标端,写入目标端的trail文件中,这样对于数据的保障更大一些。如果想方便点可以把trail队列文件直接写到了目标端。

5.11 生成def文件复制到目标端

因为 Oracle 和 SQL Server 中的数据类型不同,所以您必须建立数据类型转换。GoldenGate 提供了一个名为 DEFGEN 的专用工具,用于生成数据定义,当源表和目标表中的定义不同时,Oracle GoldenGate 进程将引用该专用工具。在运行 DEFGEN 之前,需要为其创建一个参数文件,指定该工具应检查哪些表以及在检查表之后存放类型定义文件的位置。可以在 GGSCI 内使用 EDIT PARAMS 命令创建这样一个参数文件

Shell> cd $OGG_HOME
Shell> ggsci
GGSCI> edit params defgen
defsfile ./dirdef/tab.def
userid ogg,password ogg
table SCOTT.*;

需要同步的表最好要有唯一键或主键

生成defgen文件
Shell>./defgen paramfile /home/oracle/ogg/dirprm/defgen.prm
将tab.def复制到目标端dirdef目录下

将tab.def复制到目标端dirdef目录下

![[Pasted image 20250117085136.png]]

六、目标端SQL server进程配置

6.1 创建新库

新库his用于存储同步过来的数据

在这里插入图片描述

6.2 创建SQL Server登录名和用户

用户映射页设置要映射的数据库,并添加db_ower权限:

在这里插入图片描述

用户映射中,勾选新建的his库
选择db_owner角色

在这里插入图片描述

6.3 创建 ODBC 系统数据源名称

GoldenGate Extract进程通过 ODBC(Open Database Connectivity)连接到 SQL Server 数据库。GoldenGate 的抽取(Extract)和复制(Replicat)组件都要求建立一个系统数据源名称(DSN),该 DSN 存储有关如何连接到 SQL Server 的信息。

  • 点击“开始” > “设置” > “控制面板”>“管理工具”> “数据源(ODBC)”,双击以打开 ODBC 数据源管理员对话框。。
  • 点击“系统 DSN”选项卡,然后点击“添加”按钮。将出现“创建新数据源”对话框。
    有些文章介绍用的是SQL Server Native Client11.0,我这里用这个

在这里插入图片描述

注意:对于 SQL Server 2000,您可以使用任何数据库支持的 ODBC 驱动程序。然而,对于 SQL Server 2005,您必须使用随 Microsoft 数据访问组件(MDAC)提供的 ODBC 驱动程序。如果使用 SQL Server 2005 附带的 SQL Native Client ODBC 驱动程序,提取(Extract)和复制(Replicat)将会异常终止。

选择 SQL Server 驱动程序,然后点击“完成”。将出现“创建新的 SQL Server 数据源”对话框。

  • 在“名称”字段中,输入 <dsn>
  • 在“说明”字段中,当创建此数据源时,可以输入“OGG 培训数据源”。此字段为可选。
  • 在“服务器”中,填入SQL server服务器IP地址。
  • 点击“下一步”。

在这里插入图片描述

  • 关于 SQL Server 应该如何验证登录的问题,请输入上面步骤中新创建 的登录名OGG 的选项。然后在“登录 ID”中输入 <login>,在“密码”中输入 <password>

在这里插入图片描述

  • 点击“下一步”。

  • 确保默认数据库设置为您创建的数据库;如果不是,请选择“更改默认数据库为:”并选择相应的数据库。将其他设置保留为默认值,以使用 ANSI。

  • 点击“下一步”。
    在这里插入图片描述

  • 将下一个对话框保留为默认设置,然后点击“完成”。

在这里插入图片描述

  • 在确认窗口中,点击“测试数据源”以测试连接。
  • 关闭确认对话框和“创建新的数据源”对话框。

在这里插入图片描述

在这里插入图片描述

6.4 在SQLSERVER创建相应表结构

这一步相对比较繁琐,需要结合Oracle同步的业务表结构进行比较,在MSSQL端创建同样的表结构,注意数据类型的转换

这里我采用Navicat Data Modeler工具,实现异构间表结构转换。
参考《Navicat Data Modeler异构表结构迁移(一)》
在这里插入图片描述

6.5 编辑GLOBALS

GGSCI(MSSQL)>edit param ./GLOBALS
checkpointtable dbo.ckpttab
ALLOWOUTPUTDIR D:\ogg\dirdat\

6.6 添加checkpoint table

GGSCI(MSSQL)>dblogin sourcedb his userid ogg password ogg
GGSCI(MSSQL)>add checkpointtable dbo.ckpttab

6.7 MGR进程

GGSCI(MSSQL)>edit params mgr
port 7809
DYNAMICPORTLIST 7810-7820
ACCESSRULE, PROG *, IPADDR 192.168.10.*, ALLOW
autorestart er *, retries 5, waitminutes 3
purgeoldextracts ./dirdat/*,usecheckpoints, minkeepdays 7
LAGREPORTHOURS 1
LAGINFOMINUTES 30
LAGCRITICALMINUTES 45
GGSCI(MSSQL)>start mgr

6.8 初始化进程repinit

GGSCI(MSSQL)>ADD REPLICAT REINIT, SPECIALRUN
GGSCI(MSSQL)>INFO REINI*, TASKS
GGSCI(MSSQL)> EDIT PARAMS REINIT
REPLICAT REINIT
TARGETDB his, USERID ogg, PASSWORD ogg
DISCARDFILE ./dirrpt/REINIT.txt, PURGE
SOURCEDEFS ./dirdef/tab.def
MAP SCOTT.*, TARGET dbo.*;

6.9 增量数据应用进程rep_chg

GGSCI(MSSQL)> add replicat rep_chg,exttrail ./dirdat/re,checkpointtable dbo.ckpttab
GGSCI(MSSQL)> edit param rep_chg
replicat rep_chg
sourcedefs ./dirdef/tab.def
targetdb his userid ogg, password ogg
reperror default,discard
discardfile ./dirrpt/rep_chg.dsc,append,megabytes 1024
HANDLECOLLISIONS --防止应用数据时与目标端已经有数据发生冲突报错
map SCOTT.*,target dbo.*;

七、开启进程

7.1 源端启动捕获进程ext_chg

GGSCI> start ext_chg
GGSCI> start pu_chg

7.2 源端启动同步进程ext_init

GGSCI (test1) 31> start EXINIT
GGSCI (test1) 32> info EXINIT
GGSCI (test1) 32> view report EXINIT

初始化进程会将Oracle数据同步到SQL server中,所以SQL server端最好只有表结构,如果存在重复数据,会因为有主键或者唯一键,重复数据导入会报错的。

7.3 目标端同步进程rep_init会被源端进程ext_init自动拉起,不用手动启动

GGSCI (test2) 24> info REINIT
view report REINIT

VIEW REPORT REINIT的日志如下:

![[Pasted image 20250117091506.png]]

当目标端表中的数据量与源端刚启动ext_init进程时表中的数据量一致时,初始化进程会自动停止。

7.4 源端模拟数据变化

BEGIN
    FOR i IN 41..60 LOOP
        INSERT INTO dept (DEPTNO, DNAME, LOC) VALUES (i, 'test', 'test');
    END LOOP;
    COMMIT; 
END;
/

7.5 目标端启动应用进程rep_chg

GGSCI (test2) 29> start rep_chg

TEST@orcl1>select count(*) from t1;
  COUNT(*)
----------
   2052700

目标端手动插入部分数据,模拟同步数据主键冲突

insert into dept values('25','test','test');
insert into dept values('26','test','test');
insert into dept values('27','test','test');
insert into dept values('28','test','test');

TEST@orcl2>select count(*) from t1;
  COUNT(*)
----------
   2000310

数据应用正常,没有报错,说明参数handlecollisions生效。

当应用进程rep_chg同步的时间点超过初始化进程rep_init结束的时间点时(即目标端数据开始变化时),通过如下参数关闭rep_chg中的handlecollisions参数。

send replicat rep_chg, nohandlecollisions

从参数文件中移除初始加载错误处理

执行以下命令编辑参数文件:

GGSCI> EDIT PARAMS rep_chg

然后,移除 HANDLECOLLISIONS 参数。

至此,Oracle使用OGG同步数据至SQL server配置完成。如有问题请大家多多指教!

在这里插入图片描述
### Oracle GoldenGate 与 SQL Server 的集成 #### 配置概述 为了在 Oracle GoldenGate (OGG) 和 Microsoft SQL Server 之间进行数据复制或迁移,需先安装并配置 OGG 软件环境。此过程涉及源端(SQL Server)和目标端(可能是另一个 SQL Server 或其他支持的数据库Oracle)。OGG 提供了多种拓扑结构来满足不同的需求,比如单向复制、双向复制以及广播模式等[^1]。 #### 安装准备 - **软件获取**:下载适用于 Windows 平台上的 Oracle GoldenGate 版本。 - **许可确认**:确保拥有合法有效的许可证文件用于激活产品功能。 - **硬件/操作系统兼容性检查**:验证服务器是否符合官方推荐最低配置标准;对于 SQL Server 来说通常是在 Windows 上运行。 #### 源端(SQL Server)设置 1. 创建提取进程(Extract Process),这是负责捕获来自 SQL Server 日志中的变更记录的过程。 2. 设置外部追踪日志(External Trail Files),这些临时存储区域用来保存即将传输给远端系统的更新信息。 3. 启动 Extract 进程以开始监控交易活动并向指定位置写入变化条目。 ```bash -- 在 GGSCI 命令行工具中执行如下命令创建 extract ggsci> add extract ext_sqlsrv, tranlog, begin now ggsci> add exttrail ./dirdat/sqlsrc, extract ext_sqlsrv ``` #### 目标端接收方配置 假设这里的目标是 Oracle 数据库,则需要定义 Replicat 流程来应用接收到的变化至本地表空间内: ```bash -- 添加 replicat 组件并将之关联到特定 trail 文件上 ggsci> add replicat rep_oracle, checkpointtable ggs_checkpoint, exttrail ./dirdat/dd ``` 上述操作会建立一个名为 `rep_oracle` 的实例,并指定了它所依赖的日志路径 `/dirdat/dd` 及其使用的检查点表格名称 `ggs_checkpoint`[^3]。 #### 参数调整优化 针对性能考虑,在实际部署前可能还需要进一步微调一些参数选项,例如批量处理大小、并发线程数等等,具体取决于工作负载特征和个人偏好。 通过以上步骤即可完成从 SQL ServerOracle 的简单数据同步方案搭建。当然这只是一个基础框架介绍,真实环境中往往更加复杂多变,因此建议深入研究官方文档获得更详尽指导[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DBA林

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值