Loading
2

Goldengate Oracle--Oracle 单向复制Change Synchronization安装部署

关于Oracle Goldengate的一些基础知识和概念可以跳转到我的另一篇文章--Oracle Goldengate 基础知识概念,本文主要阐述关于如何部署Oracle与Oracle数据库之间的单向复制

相关环境版本如下:

操作系统:Oracle Enterprise Linux 6.3 64bit

Oracle database:11.2.0.4.0 64bit  单节点 使用文件系统

Oracle Goldengate:11.2.1.0.14 for Oracle 11g on Linux x86-64

source ip:192.168.192.200

target ip:192.168.192.201

 

准备工作:

下载OGG:https://updates.oracle.com/Orion/Services/download/p17556008_1121014_Linux-x86-64.zip?aru=16952255&patch_file=p17556008_1121014_Linux-x86-64.zip

安装两台Oracle数据库服务器。

 

单向复制通常用于报表系统数据库,通常从生产库同步数据到公司内部报表使用数据库进行报表分析工作,他的架构很简单,一个源一个目标:

QQ图片20131126113915

从我之前的文章Oracle Goldengate 基础知识概念中提到了提取和复制是可以直接通讯也可以通过二级Extract组件Data pump将一级Extract与TCP/IP隔离,这里我们首先介绍如何配制Extract与target直接通讯进行提取复制,它的架构如下图:

QQ图片20131126114539

1. source和target端创建用于运行ogg的系统用户,该用户要与数据库系统账户同组以能访问相关文件

2. source和target端创建ogg安装目录

3. source和target端使用ogg账户解压ogg安装包到/ogg

4. source和target端设置ogg用户环境变量,vi .bash_profile添加如下内容

5. source和target端创建ogg子目录

当然你也可以在其他地方创建这些子目录,比如在ogg的家目录/home/ogg下创建

报错是由于ogg要加载ggMessage.dat这个文件,由于不是在ogg的安装目录下肯定无法找到,解决办法是创建一个ggMessage.dat的链接即可

6. 确认source数据库开启了归档模式、force logging和最小辅助日志

如果没有开启这些功能,请将他们开启。

开启归档

开启force logging

开启最小辅助日志

对于target端的数据库可以不用开启归档、FORCE LOGGING和最小辅助日志,但是对于以后的扩展可以一并开启。

7. source数据库创建一个测试用户yxd,并创建一些测试数据

创建一个sequence用来测试sequence的支持,注意这个sequence不能设置cache,否则会导致两端sequence不一致。

8. source数据库创建一个ogg使用的DDL用户,这里我们把它叫做ogg,它需要一个独享的表空间,不然在启用DDL支持的过程中会报错,赋予它相应的权限。

dbms_goldengate_auth.grant_admin_privilege包是在11.2.0.3版本开始有的,在之前的版本使用dbms_streams_auth.grant_admin_privilege包来赋权限,他会将所有OGG用户需要的权限都一次性赋予。

9. 将source和target数据库的enable_goldengate_replication参数设置为true,否则无法复制,这个参数是在11.2.0.4版本开始才有的,这个参数主要用来控制新的数据类型和操作的辅助日志的复制,以前这些提取是由辅助记录DDL来控制的,现在这个参数也必须被设置为true来启用辅助日志的请求,这个参数默认是false的,我们需要将它设置为true。

10. 启用DDL支持

source端需要以oracle账户进入ogg安装目录,用ogg数据库用户以sysdba角色登陆数据库,依次执行marker_setup.sql、ddl_setup.sql、role_setup.sql、ddl_enable.sql、ddl_pin.sql脚本。在那之前该ogg用户需要有执行utl_file的权限,由于我们已经赋予ogg为dba角色,其实它已经有了执行utl_file的权限,如果没有可以以sysdba用户登陆数据库用以下命令赋予权限:

 

marker_setup.sql创建了一些用于记录DDL信息的表,ddl_setup.sql创建相应的存储过程和trigger,role_setup.sql创建DDL同步需要的角色,ddl_enable.sql启用ddl trigger,ddl_pin.sql是为了优化这个ddl trigger的性能,使它作为数据库启动的一部分,ddl_pin.sql需要用到dbms_shared_pool包,如果没有需要安装。

要删除DDL支持,首先使用ddl_disable.sql禁用trigger,然后执行ddl_remove.sql移除相关的存储过程和trigger,最后使用marker_remove.sql删除相关的表。

 

11. 启用sequence支持

source端--同样的启用sequence支持需要一个DDLuser,这里我们用的同一个账号ogg,如果只需要支持sequence而不需要DDL支持,那么这个账户只需要connect、resource和dba权限即可,也不需要独享的表空间。

以oracle用户进入ogg安装目录,用ogg用户以sysdba角色登陆数据库执行sequence.sql

如果你的DDLuser与DBLOGIN user 不是同一个账户,那么你还需要将一些存储过程的执行权限赋予dblogin user,我们使用的是同一个账户,所以不需要执行以下命令,如果不是请执行以下命令

对source端的sys.seq$表添加主键的辅助日志:

target端--创建一个ddl用户用来支持sequence,同样的我们也叫它为ogg,这个用户同样也是ogg用于登陆数据库的用户,如果只需要支持sequence,只作为target端而不作为source端去支持ddl,那么该用户可以与其他用户共享表空间,为了以后的扩展不会有不必要的麻烦,我们还是给ogg用户独享的表空间。

以oracle用户进入ogg安装目录,用ogg用户以sysdba用户登陆数据库执行sequence.sql

同样的,如果你使用的DDLuser与Replicat user不是同一个用户,那么你需要将执行存储过程的权限赋予这个Replicat user,我们使用的是同一个用户所以不用再赋予权限,如果不是那么请执行以下命令:

12. source端和target端配置ogg的Manager

以系统的ogg用户进入ogg安装根目录,执行ggsci进入命令行接口进行配置

配置全局参数文件GLOBALS,这个文件必须为大写,必须放在ogg的安装根目录下,加上“./”表示在当前目录下创建,否则ogg会默认将配置文件创建在ogg安装目录下的dirprm子目录中,在GLOBALS配置文件中添加GGSCHEMA参数,这个GGSCHEMA就是你的DDLuser,也就是我们的ogg Oracle数据库账户

此时会进入vi界面,插入以下内容然后保存退出:

ogg的参数文件中一行就是一个参数选项,如果一行太长要换行可用“&”作为换行提示

配置Manager参数文件:

插入以下内容保存退出:

port是Manager进程的端口,dynamicportlist是Manager可管理的动态端口列表,可用“-”表示一段,用“,”分割单独的端口,autostart表示Manager会控制进程随系统自动启动,er表示extract和replicat进程,可用通配符选择多个进程,autorestart表示当进程失败后Manager会控制它自动重启,retries表示重试次数,waitminutes表示间隔多少时间重试,startupvalidationdelay表示启动后延迟校验避免出现error,purgeoldextracts表示定时清理过期老旧的trail,使用检查点,最少保持2小时的trail,lt*表示是本地的trail,一般以lt表示local trail而rt表示remote trail,target端lt*改为rt*。

Manager的参数最少只需要一个port参数即可,其他不是必须的。

启动Manager

info all可以查看所有进程的状态信息,也可以info单独的一个进程组查看其信息

 

13. source端配置提取进程extract

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

add extract ext1,integrated tranlog,begin now--这段命令的意思是添加一个group为ext1的extract进程,并且使用的integrated捕获模式,开始使用时间是now。这里我用的是integrated tranlog集成捕获模式,而不是classic的tranlog,关于Oracle Goldengate的Capture Method可以参考我的另一篇文章Oracle GoldenGate Capture Method了解详细信息。

add rmttrail--这段命令表示为ext1进程添加一个remote trail的链接,表明将会把trail传到目标端的/home/ogg/dirdat目录下,并以rt作为一系列trail的前缀。

extract ext1--表示这是个extract进程,group为ext1。

userid ogg,password 000000--这一端注明了登陆数据库使用的dblogin账户和密码。

rmthost 192.168.192.201, mgrport 7809--表明了目标端的地址或者host,以及目标端Manager进程使用的端口。

rmttrail--这段表明了目标端trail存放的位置

ddl include all--这段表明了启用DDL,并且是包含了所有的DDL操作,可用其他参数过滤不需要复制的DDL。

gettruncates--表明需要复制truncate操作。

sequence--这段表明了需要同步的sequence.

table--表明了需要同步的表。

 

14. source端启动Extract

查看ext1的状态

发现ext1并没有启动起来,使用view report ext1查看ext1的输出报告来排查是什么原因

发现报错信息

报错信息提示在这个Oracle数据库上没有logmining server,由于我们使用了Integrated捕获模式,所以需要部署logmining server,而光在add extract中加上integrated tranlog选项是不够的,在启动这个extract之前还需要将这个extract注册到数据库中,以告诉extract从哪个点开始挖掘,使用以下命令注册:

ps:由于这篇文章是分两天写的,所以在时间上有点跨度。

再次启动extract

extract ext1已启动成功。

 

15. target端配置replicat

首先需要创建checkpoint table,使用dblogin登陆数据库,add checkpointtable命令会创建你指定的表名的表作为checkpointtable,也可以通过运行ogg安装目录下的chkpt_ora_create.sql脚本来实现。

配置replicat进程

 

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

add replicat--这段表明添加一个replicat进程,group为rep1,并且链接到相应的trail,使用名为ogg.checkpoint_table作为checkpointtable,这个ogg.checkpoint_table就是之前添加的。

replicat rep1--表明这是一个group为rep1的replicat进程参数。

handlecollisions--这个参数表示开启冲突处理,我们配置的是change synchronization Extract,先开启了extract,然后会使用expdp和impdp将source端yxd下的数据导出并导入到target端的yxd账户下作为初始数据加载,由于数据库是活动的,在初始化加载时和之后的数据有更新需要同步,当开启replicat进程后,它会从最初extract传送过来的trail开始复制,这之中可能会有与初始数据重叠的地方,也就是有重复的数据,开启handlecollisions会处理这些冲突。

assumetargetdefs--这个参数表明假设source端与target端的数据定义是一致的,不再查找source结构的定义。

discardfile--这个表明如果有丢弃的数据则丢弃到一个指定的文件中,以追加的方式写入新的内容,文件最大10M。

ddl include all--启用ddl复制。

map--用来映射source对象与target对象的关系,source与target的用户是可以不同的。

配置完成后不要启动replicat rep1,待初始化数据完成后再启动。

 

16. 使用expdp和impdp导出source数据导入target库

在source端使用expdp导出数据

在导出数据的过程中你可以在yxd用户下作一些操作比如,建立个表插一些数据,在原本的那些表里插一些数据,删除一些数据等,总之让实际的数据与导出的数据有差异。

 

将导出的dmp文件传至target端

在target端将数据导入数据库

到这里初始化数据完成。

 

17. target端启动replicat进程开始同步

replicat rep1已成功启动。

 

18. target端与source端比对数据是否一致

source端有的表

TT是原先在初始化时就有的表,XX表是之后加的。

target端有的表

当初使用expdp和impdp初始化数据加载时只有TT这张表,但XX这张表也同步过来了。

查看source端表的数据情况,TT表的数据我们当初导出时是10000条数据,在之后我们有做过删除,XX是我们初始化后新建的。

查看target端表的数据情况,TT表的数据我们当初导出时是10000条数据,在之后我们有做过删除,XX是我们初始化后新建的。

source端和target端的数据一致。

 

19. 查看source端与target端的sequence是否一致

source端的sequence

target端的sequence

两端的sequence保持一致,是否一致主要看的是LAST_NUMBER是否一致,如果出现target端的sequence的值比source端的值小,那么可以在source端或者target端的ggsci命令行接口里执行flush sequence操作,使sequence同步。

如果target端的sequence的值大于source端的值则无法使用这种方式调整同步,只能将target端的sequence重建然后同步。

20. 测试在线数据同步

在source端插入数据、建一些表等操作。

对比source端与target端的数据。

source端:

target端:

测试下来source端与target端保持一致,标准的单向复制搭建完成。

 

21. 优化结构,使用Data pump传输trail,将Extract与TCP/IP隔离

使用Data pump的单向复制的架构如下:

QQ图片20131127165205

source端停止extract ext1捕获进程。

添加Data pump

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

exttrailsource--表示这是个data pump Extract与本地的trail作链接。

add rmttrail--将pump与remote trail做链接

passthru--表明绕过数据定义检测。

 

添加extract ext1对本地trail的链接

修改Extract ext1的参数文件为以下内容:

启动ext1

启动pump1

ext1与pump1都已成功启动。

source插入一些数据测试target是否同步:

source端:

target端:

数据同步成功,使用data pump的单向复制部署完成。

 

22. 使用中继系统的单向复制

使用这种方式复制是因为source与target不在同一个网络中,并且两个网络无法直接连接,需要通过第三台服务器中转trail到target。

使用中继系统单向复制的架构如下:

QQ图片20131127165702

在中继系统上不需要有数据库,只需要安装一个ogg即可,source端的data pump的rmthost指向的是中继系统,其他配置一样,由中继系统的data pump的rmthost指向target,将source传过来的rmttrail作为exttrailsource传到target端的rmttrail让replicat进行应用,中继系统只需要配置一个data pump即可,sourcedefs和targetdefs是在source与target的定义结构不一致时需要的,target端的配置没有变化。

 

23. 级联配置

级联配置的架构图如下:

QQ图片20131127171435

其实会单向复制其他的架构也一样会配置,级联配置无非是当中的节点既作为target端接收上一个节点的数据,又作为source端挖掘数据向下一个节点发送,也就是中间的节点上既有Extract进程也有Replicat进程,配置没有什么不同,rmthost指向下一个节点即可,不再详细介绍。

24. 分布式架构配置

分布式架构图:

QQ图片20131127173254

QQ图片20131127173328

分布式架构的配置其实与一般的单向配置没什么差别,无非是通过在source端使用配置多个data pump指向多个target而已,相信通过上面最基本的单向配置的学习,分布式配置对你也没有什么难度,本文也不再多做介绍。

 

25. 合并配置--即多个source对一个target,一般用于数据仓库集中存放生产历史数据

合并配置架构:

QQ图片20131127173942

QQ图片20131127174004

同样的,举一反三,合并模式只是在target端起用多个replicat进程来应用来自不同target的trail,我相信到这里Oracle GoldenGate的单向复制部署对你应该不会再有什么难度了。

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