Loading
1

Oracle GoldenGate 之初始化加载数据

 

你可以为了以下目的使用Oracle GoldenGate的初始化加载:

  • 为了迁移数据或其他目的,你可以单独地使用它做一个批处理的加载去填充数据库的表。
  • 准备使用Oracle GoldenGate去做change synchronization,作为初始化同步的一部分将数据加载到数据库中的表。

你可以从一个活动的source数据库执行初始化加载。当初始化加载运行的时候,用户和应用依然能够访问和更新数据。如果你要延迟访问source数据库直到target数据库表加载完成的话,你可以从一个静默的source数据库执行初始化加载。

支持加载的方式:

你可以使用Oracle GoldenGate以下的任何一种方式去加载数据:

  • 使用一个数据库工具去加载数据。这种方式是依赖与数据库工具的,比如ORACLE的数据泵expdp、impdp。
  • 从文件加载数据给Replicat。Extract写记录到一个Extract文件,Replicat应用它们到目标表。这种初始化方式是最慢的。
  • 从文件加载数据到数据库工具。Extract用一个外部的ASCII格式写记录到extract文件。这个文件作为输入到target表的数据文件被一个批量加在工具使用。Replicat创建这个运行和控制文件。
  • 使用Oracle GoldenGate直接加载方式加载数据。Extract与Replicat通过TCP/IP不使用Collector进程或文件直接通讯。Replicat通过数据库引擎应用数据。
  • 使用一个直接批量加载到SQL* LOADER加载数据。Extract使用外部ASCII格式提取记录并且直接交付他们给Replicat,而Replicat交付它们给Oracle的SQL*Loader批量加载工具。这是Oracle GoldenGate加载Oracle数据库最快的方法。
  • 使用Teradata加载工具加载数据。对于同步两个Teradata数据库这种方法是首选的。建议的工具是MultiLoad。

 

初始化加载前的准备工作:

准备好目标表--

初始化加载需要在目标系统预先创建与源系统相同的表、序列等,以下的一些建议可以使加载跑的更快,帮助你避免一些error:

  • Data:确保目标表是空的。否则可能会出现duplicate-row错误或者在已存在的行与要加载的行之间的冲突。
  • Constraints:禁用外键约束和check约束。外键约束会导致错误,而check约束会减慢加载速度。在加载完全成功后这些约束可以被重新激活。
  • Indexes:移除目标表的索引。对于Insert索引是不需要的,它们会减慢加载速度,对于插入表的每一行数据,数据库都会更新这张表上的每一个索引。你可以在加载完成后把这些索引加回来。
  • Keys:使用HANDLECOLLISIONS去调和递增的数据改变与加载的数据的冲突,每个目标表必须有一个主键或唯一键。如果你不能通过你的应用创建一个键,请使用TABLE和MAP参数中的KEYCOLS选项来制定字段作为Oracle GoldenGate所要求的一个替代键。这个键标识了要处理的行。如果你不能创建一个key,那么这个用来加载的数据库必须是静态的。

 

配置Manager进程--

在source和target系统配置和启动一个Manager进程。一个Manager进程可以既被用来初始化加载处理,也能被用作change-synchronization的处理。如果配置一个Manager可参考我的另一篇文章Goldengate Oracle--Oracle 单向复制Change Synchronization安装部署中的相关章节介绍。

 

创建一个数据定义文件--

如果source和target的数据库有着不同的定义,那么就需要一个数据定义文件。Oracle GoldenGate使用这个文件去转换target数据库要求的数据格式。数据定义文件的创建方式如下:

在source端进入ggsci,然后编辑参数文件defgen

将一下内容插入后保存退出

defsfile--生成的数据定义文件的路径和名称。

table--需要生成定义的数据表

userid--登陆数据库的账号

 

退出ggsci,在ogg安装根目录下执行如下命令生成数据定义文件

数据定义文件创建完成,如果需要使用这个数据定义文件,那么将它拷贝到target系统上在复制时指定这个数据定义文件即可。

 

创建change-synchronization组--

注:如果你是要执行一个静态的数据加载,之后不会再有连续的改变同步,你可以忽略这些。

为了在初始化加载期间准备捕获和复制事务的改变,创建在线Extract和Replicat组。你需要在初始加载过程中启动这些组。配置一个适合的类型的复制组来使用。

不要启动Extract或者Replicat组直到在初始加载指令中指示你这样做。改变同步保持了对事务改变的跟踪在加载被应用的时候,然后目标表将与这些改变进行调和。

注:在一个新的OGG配置中Extract第一次启动时,任何的事务都会被略过。只有在Extract启动之后的事务会被捕获。

如果source数据库在初始化加载时需要保持活动,那么在Replicat参数文件中包含HANDLECOLLISIONS参数,否则不要用这个参数。HANDLECOLLISIONS处理发生在初始化加载和不断的改变复制重叠的时间的冲突。它调和行已经存在的插入操作,调和行不存在的更新和删除操作。它能通过一下途径被使用:

  • 在一个参数文件中对所有表的全局影响。
  • 作为一个开关对部分表。
  • 与MAP语句一起启用或禁用对指定表的error处理。

如何配置一个单向复制环境请看我的另一篇文章Goldengate Oracle--Oracle 单向复制Change Synchronization安装部署

 

使用一个数据库工具加载数据

QQ图片20131205143433

用一个数据库拷贝工具去建立目标数据,在数据库工具制作和应用一份静态的数据拷贝时你启动一个change-synchronization Extract进程组曲不断的提取数据的改变。当拷贝复制完成,你启动change-synchronization Replicat进程组去重新同步在拷贝被应用时发生改变的数据。从那个点向前,Extract和Replicat进程组继续运行去维护数据的同步。这种方法不需要去调用任何特殊的初始化加载Extract或者Replicat进程。

比如使用ORACLE的数据泵工具来制作和应用数据的拷贝,我的文章Goldengate Oracle--Oracle 单向复制Change Synchronization安装部署中所使用的就是这种方法做的数据初始化,具体方法可参照此文中所述,在本文中不再多做赘述。

 

从文件加载数据给Replicat

QQ图片20131205144641

使用Replicat进程去建立目标数据,你需要使用一个初始化加载Extract进程去捕获来自source表的source记录,并且使用规范的格式将它们写入到一个extract文件中。初始化Replicat进程使用数据库接口从这个文件中加载数据。在加载期间,change-synchronization的进程组提取和复制递增的改变,然后与加载的结果进行调和。

在加载期间,应用到目标库的记录一次只应用一条,所以这种方式对于其他初始化加载方法来说是相当慢的。这种方式允许数据变形在source端完成或者在目标端完成。

通过以下步骤来配置从文件加载数据给Replicat:

1. 确保满足初始化加载前的准备工作中的要求。

2. 在source和target系统运行ggsci并启动Manager。

3. 在source系统发布以下命令去创建一个初始化加载参数文件。

4. 插入以下内容后保存退出

sourceistable--标识这是一个初始化加载的Extract进程,直接从source表提取数据。

userid--登陆数据库的账号。

rmthost--target系统的地址和端口。

rmtfile--指定提取进程写入的extract文件,megabytes指定该文件的最大尺寸,这个文件最大不能超过2G,purge标识使用完清理。

table--标识需要提取的数据。

5. 在目标端发布以下命令去创建一个初始化Replicat参数文件

6. 插入以下内容后保存退出

specialrun--标识这是一个初始化加载使用的Replicat进程。

end runtime--标识在加载完成后就终止replicat进程。

extfile--指定输入的extract文件,这个文件就是Extract参数文件在中指定的那个。

sourcedef--指定使用source的数据定义文件,该文件就是在准备期间在source端创建的,将该文件拷贝到target端待Replicat加载时使用。

userid--数据库登陆的账号。

map--source与target表的映射关系。

7. 在source系统启动一个change-synchronization提取进程和data pump

8. (如果是Oracle数据库,且需要复制sequence)发布以下DBLOGIN命令,使用有执行update.Sequence存储过程权限的用户登陆数据库

9. (如果是Oracle数据库,且需要复制sequence)发布以下命令去更新每一个source端的sequence并生成redo。在target端,Replicat从这个redo中执行sequence的初始化同步。你可以使用*通配符替换sequence名字中任何或者所有的字符(但所有者不能替换)。

10. 在source系统的OGG安装根目录下执行以下命令:

这个命令会阻塞这个会话直到提取完成。

11. 使用操作系统的标准方式去查看报告文件以确认初始化提取的进程和结果。

初始化完成,其中有以下警告:

意思是在表上没有找到唯一键,OGG将使用所有有效的字段将被作为键来使用,但是不确保数据是唯一的。KEYCOLS可以被用来定义键。

12. 在target系统上使用以下命令启动初始化Replicat进程:

该命令会一直阻塞直到应用完成。

13. 使用操作系统标准的方式去查看报告文件以确认初始化Replicat完成:

初始化数据加载应用完成。

14. 在target系统上使用以下命令启动改变同步复制进程:

15. 当确认同步改变复制进程rep1处理完所有在初始化期间发生的数据改变后,在target系统上发布以下命令去关闭HANDLECOLLISIONS参数禁用初始化加载error处理,并且修改rep1的参数文件将HANDLECOLLISIONS去除以免启动时被再次启用。

从这里开始,Oracle GoldGage继续同步数据改变。

 

从文件加载数据给数据库工具

QQ图片20131206092332 

为了使用数据库批量加载工具,你需要使用一个初始化加载Extract从source表提取源记录,并将它们以外部ASCII格式写入到一个extract文件。这个文件可以被Oracle的SQL*Loader、微软的BCP、DTS或者SQL Server Integration Services(SSIS)工具,或者IBM的加载工具(LOADUTIL)所读取。在加载期间,change-synchronization组提取和复制递增的改变,这些改变将与加载的结果集进行调和。作为加载过程的一部分,Oracle GoldenGate使用初始化加载Replicat进程去创建运行和数据库工具所要求的控制文件。

任何的数据变形必须由在source系统上的初始化Extract进程所执行,因为控制文件是动态生成的,它们不能通过变形规则被预先配置。

 

通过以下步骤来配置从文件加载数据给数据库工具(这里我们使用Oracle的SQL*Loader来举例说明):

1. 确保满足初始化加载前的准备工作中的要求。

2. 在source和target系统运行ggsci并启动Manager。

3. 在source系统上发布以下命令去创建一个初始化加载Extract参数文件

4. 插入以下内容后保存退出

从这个参数配置可以看出与从文件加载数据给Replicat的Extract的参数配置几乎一样,唯一不同的是多了一个参数“formatascii,sqlloader”,这个参数是告诉Extract输出的文件以ASCII文本作为格式而不是默认的规范格式,这个参数有两个选项,sqlloader和BCP,BCP表示使用BCP、DTS或者SSIS,而SQLLOADER表示使用ORACLE的SQL*Loader或者IBM的加载工具,这个参数必须放置在rmtfile参数之前,“formatascii,sqlloader”参数之下的rmtfile都使用外部ASCII格式,该参数之上的rmtfile使用规范的格式,并且使用这种方式只能一次映射一张表,要多张表需要指定多个rmtfile与table参数对应,比如:

其他之前已使用过的参数意义不再赘述。

5. 在target系统发布以下命令去创建一个初始化加载Replicat参数文件:

6. 插入以下内容后保存退出:

我们可以看出这里多了一个参数“genloadfiles sqlldr.tpl”,这个参数的意思是为数据库工具生成运行和控制文件,其他使用过的参数不再赘述。

7. 在source系统启动一个change-synchronization提取进程和data pump

8. (如果是Oracle数据库,且需要复制sequence)发布以下DBLOGIN命令,使用有执行update.Sequence存储过程权限的用户登陆数据库

9. (如果是Oracle数据库,且需要复制sequence)发布以下命令去更新每一个source端的sequence并生成redo。在target端,Replicat从这个redo中执行sequence的初始化同步。你可以使用*通配符替换sequence名字中任何或者所有的字符(但所有者不能替换)。

10. 在source系统的Oracle GoldenGate安装目录下执行以下命令启动初始化提取:

11. 提取完成后使用操作系统标准方式查看Extract报告以确认初始化提取的进程和结果。

12. 在target系统上,执行以下命令启动初始化加载Replicat进程:

13. 待上面的命令执行完成,使用系统标准的方式查看Replicat的报告以确认运行结果:

我们从报告中可以看到,Replicat进程实际是在为每个表生成一个run文件和一个控制文件,这些文件在当前目录下生成,我们在Oracle GoldenGate的安装目录下执行的命令,所以这些文件都在这下面,run文件的内容如下:

控制文件的内容如下:

我们可以看到控制文件中infile是OO.dat,这个是根据表来的,并且都是大写的,而这个文件实际是没有的,我们实际extract生成的oo.dat文件,所以一个技巧是在rmtfile时将文件名使用大写,并且这些table都是没有加schema的,加载的时候只会往当前登录的用户下去插,所以这个也要修改成相应的用户下的表,这些控制文件需要修改,由于这些文件是ogg用户生成的,所以Oracle用户是没有权限执行的,所以需要将他们的权限修改。

14. 将这些run文件和控制文件还有oo.dat文件的权限修改修改,使得Oracle用户可以读取运行,并将他们移动到Oracle用户可访问的目录下方便使用:

15. 修改控制文件,将infile指向oo.dat,并且在table前加上schema,如果控制文件少,手动一个个修改也没问题,如果表多的话手动修改就不适合了,可以使用一些脚本比如sed替换相关字符,使用ultraedit的块输入功能批量输入相同的命令来写脚本,修改后的OO.ctl如下:

16. 执行run文件进行sqlldr导入数据,可以一个个执行:

查看sqlldr日志OO.log

5条记录成功导入yxd.oo表中,初始化数据完毕。

17. 在target系统启动Change-Synchronization复制:

18. 当确认同步改变复制进程rep1处理完所有在初始化期间发生的数据改变后,在target系统上发布以下命令去关闭HANDLECOLLISIONS参数禁用初始化加载error处理,并且修改rep1的参数文件将HANDLECOLLISIONS去除以免启动时被再次启用。

从这里开始,Oracle GoldGage继续同步数据改变。

 

使用Oracle GoldenGate直接加载方式加载数据

QQ图片20131206145120

使用Oracle GoldenGate直接加载,你需要运行一个Oracle GoldenGate的Extract进程去提取source记录并且将他们直接发送给一个初始化Replicat Task。这个task是由Manager进程动态启动的,不要求使用一个Collector进程或者文件。这个初始化加载Replicat Task使用large blocks交付加载给target数据库。变形和映射可以由Extract、Replicat或者两个一起完成。在加载期间,change-synchronization组提取和复制递增的改变,这些改变会与加载结果进行调和。

使用Manager参数文件中的DYNAMICPORTLIST参数去控制Replicat进程使用的端口,加速搜索和绑定进程。Manager会提供Replicat Task进程该参数中指定的端口列表使用。Replicat首先搜索这个列表中的端口,并且只有当这个列表中的端口没有可用的时候,Replicat才开始按照Manager默认的端口升序扫描直到找到一个可用的端口为止。

Oracle GoldenGate直接加载方式不支持包含了LOB字段、LONG字段、用户自定义的类型(UDT)的字段或者任何超过4KB大小的大数据类型字段的表。

 

通过以下步骤来配置一个直接加载:

1. 确保满足初始化加载前的准备工作中的要求。

2. 在source和target系统运行ggsci并启动Manager。

3. 在source系统上发布以下命令去创建一个初始化加载的Extract

sourceistable表明了这是一个初始化加载进程。

4. 在source系统上发布以下命令去创建一个Extract参数文件:

5. 插入以下内容后保存退出:

rmttask引导了target系统上的Manager进程作为一次性任务去动态启动这个初始化加载Replicat

6. 在target系统上发布以下命令去创建一个初始化加载Replicat Task

specialrun表明了这是一个一次性的初始化加载任务

7. 在target系统上发布以下命令去创建一个初始化加载Replicat参数文件

8. 插入以下内容保存后退出:

9. 在source系统启动一个change-synchronization提取进程和data pump

10. (如果是Oracle数据库,且需要复制sequence)发布以下DBLOGIN命令,使用有执行update.Sequence存储过程权限的用户登陆数据库

11. (如果是Oracle数据库,且需要复制sequence)发布以下命令去更新每一个source端的sequence并生成redo。在target端,Replicat从这个redo中执行sequence的初始化同步。你可以使用*通配符替换sequence名字中任何或者所有的字符(但所有者不能替换)。

12. 在source系统上启动初始化加载进程Extract

13. Extract进程会自动去调用Replicat启动,无需手动启动初始化Replicat进程,待source上的Extract初始化加载进程运行完毕,在target系统上发布以下命令去查看加载报告:

初始化数据完毕。

14. 在target系统上发布以下命令启动改变同步Replicat进程

15. 当确认同步改变复制进程rep1处理完所有在初始化期间发生的数据改变后,在target系统上发布以下命令去关闭HANDLECOLLISIONS参数禁用初始化加载error处理,并且修改rep1的参数文件将HANDLECOLLISIONS去除以免启动时被再次启用。

从这里开始,Oracle GoldGage继续同步数据改变。

 

使用SQL*Loader直接批量加载数据

QQ图片20131206163105

使用Oracle的SQL*Loader工具建立target数据,它的方式与OGG直接加载数据方式类似,也同样的不需要collector进程或文件而只要一个replicat task,但是Replicat是通过使用SQL*Loader的API接口作为一个直接路径去批量加载数据的。

这种方式也有它的限制:

  • 这种方式只用作Oracle的SQL*Loader,不能在其他数据库使用。
  • 这种方式不支持LOB或者LONG数据。
  • 这种方式不支持包含了LOB字段的物化视图,无论他们的大小如何。它也不支持数据加密。

 

通过以下步骤配置使用SQL*Loader直接批量加载数据:

由于这种方方式与使用Oracle GoldenGate直接加载方式加载数据的方式几乎一样,除了replicat初始化加载进程的参数稍有不同,所以这里请重复“使用Oracle GoldenGate直接加载方式加载数据”的所有步骤,除了第六步插入replicat参数文件的内容换成以下内容:

比之前多了一个参数bulkload,这个参数引导Replicat直接对接Oracle的SQL*Loader接口加载数据。

 

使用Teradata加载工具加载数据

两个Teradata数据之间同步的首选方法是使用任何的Teradata数据加载工具,建议使用MultiLoad。

这个过程要求Extract和Replicat change-synchronization组是有效的,并且需要正确配置了Teradata复制。如果你使用了多个Extract和Replicat进程组,那么对于所有的组要适当的执行每一个步骤。

由于没有Teradata数据库环境所以只能从理论上来阐述操作步骤:

1. 创建Teradata加载工具要求的脚本。

2. 启动primary Extract组。

3. 启动data pump如果需要。

4. 打开Replicat参数文件进行编辑。

5. 在Replicat参数文件中添加“END RUNTIME”和“HANDLECOLLISIONS”参数,这两个参数的作用不再赘述。

6. 启动加载工具。

7. 当在target系统上的加载完成后,启动Replicat进程。

8. 当每一个Replicat进程都停止的时候,从参数文件中移除“HANDLECOLLISIONS”和“END RUNTIME”参数。

9. 重启Replicat进程。这两个数据库现在被同步了,并且Oracle GoldenGate会通过复制保持他们一致。

请尊重我们的辛苦付出,未经允许,请不要转载 Ask600 的文章!