一、数据初始化(initial load)方式介绍
参考mos文档《Primary Note - Oracle GoldenGate: Initial Load Techniques and References (文档 ID 1311707.1)》
Initial Load Method | 官方MOS文档参考 |
---|---|
Loading Data from File to Replicat | Document 1441172.1 |
Loading Data from Trail to Replicat | Document 1195705.1 |
Loading Data from File to Database Utility | Document 1457989.1 |
Loading Data with an Oracle GoldenGate Direct Load | Document 1457164.1 |
Loading Data with a Direct Bulk Load to SQL*Loader | Document 1461851.1 |
本文使用的方法是:Direct Load实现Oracle to SQL server异构数据初始化。
二、使用GoldenGate Initial-Load前提条件
- 禁用DDL处理
在启动数据初始化之前,确保从Extract和Replicat参数中禁用DDL处理。
- 准备目标表
以下建议可以加快加载速度并帮助您避免错误:
- 数据:确保目标表为空,除非另有要求。如果目标表中已有数据,可能会出现重复行错误或现有行与正在加载的行之间的冲突。
- 约束:在目标站点上,禁用外键约束和检查约束。外键约束可能导致错误,检查约束可能会减慢加载过程。加载成功后,可以重新启用这些约束。
- 禁用目标表上的任何触发器。在数据加载的同时触发的触发器可能会导致错误。初始加载完成后可以重新启用。
- 索引:从目标表中删除索引。插入操作不需要索引。索引会显著减慢加载过程。每插入一行,数据库都需要更新该表上的每个索引。加载完成后可以重新添加索引。
注意:对于访问DB2 for z/OS目标表的所有应用程序,要求有一个主索引。您可以删除目标表中的所有其他索引,但主索引除外。
- 配置源系统和目标系统的管理进程
在两个系统上配置并启动MGR。同一个MGR可以用于初始加载的Extract/Replicat和持续变更同步组。
- 创建数据定义文件
如果源数据库和目标数据库的表结构不同,则需要创建数据定义文件,以便将数据转换为目标数据库所需的格式。
有关DEFGEN工具的更多信息以及如何创建数据定义文件,请参阅文档。
- 创建变更同步组
如果在初始加载期间源数据库处于静止状态,则可以省略此步骤。
创建在线变更同步Extract和Replicat组,以便在进行初始加载的同时捕获和复制持续的更改。
注意:在所需的确切步骤上,首次启动持续变更同步Extract组非常重要。这取决于初始化数据所采用的具体技术,具体细节请参考相关内容。同样重要的是,持续复制在适当的时间之前不得启动。这个时间通常是在初始加载复制完成之后。
此外,请考虑,在新配置中第一次启动提取时,任何开放的事务将被跳过;新的提取将仅捕获在提取启动后开始的事务。有关在使用Oracle源数据库进行初始加载时如何处理开放事务的信息。
三、同步环境介绍
源端 | 目标端 | |
---|---|---|
操作系统 | CentOS Linux release 7.9.2009 (Core) | Windows Server 2019 Datacenter |
数据库版本 | Oracle 11.2.0.4.0 | SQL Server 2016 |
实例名 | orcl | MSSQLSERVER |
IP | 192.168.10.132 | 192.168.10.192 |
ogg版本 | OGG 19.1.0.0.4 | OGG 19.1.0.0.3 |
同步目标 | scott用户下所有表 | 所有表同步到HIS库 |
四、OGG版本使用
架构 | Oracle GoldenGate 版本 |
---|---|
linux | Oracle GoldenGate 19.1.0.0.4 for Oracle on Linux x86-64.zip |
window | Oracle 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目录下
六、目标端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的日志如下:
当目标端表中的数据量与源端刚启动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配置完成。如有问题请大家多多指教!
