4.1.3 ddl同步
GoldenGate的DDL同步只支持两边一致的数据库,限制条件较多(如不能进行字段映射、转换等),具体可以参考官方文档。DDL的抓取不是通过日志抓取来捕获的,而是通过触发器来实现,所以对源数据库的性能影响要比单纯的数据抓取要大很多,可谓屏弃了GoldenGate的优势。尽量不要使用GoldenGate的DDL复制功能,在大多数业务系统中,实际上不会有频繁的数据库结构变动,完全可以通过手工的方式进行维护。确实有大量DDL操作的环境,如果可以,还是推荐物理DG之类的替换方案;确实要使用GoldenGate的DDL复制,那么请详细参考官方文档的限制和说明。
--以上主要为个人意见,有不同看法的请无视
开启DDL复制的基本配置步骤为: (1)关闭ORACLE的回收站功能。
(2)选择一个数据库schema存放支持DDL的GoldenGate对象,运行相应创建脚本。 (3)编辑globals参数文件。 (4)修改extl和repl的配置文件
具体操作步骤:
(1)关闭数据库回收站:
SQL>alter system set recyclebin=off scope=both;
(2)编辑globals参数文件: GGSCI>edit param ./globals 添加以下内容后保存:
GGSCHEMA ddw --标明支持DDL的GG对象存放在哪个schema下
(3)执行创建脚本:
首先需要命令行进入GG安装目录下,然后再运行sqlplus执行脚本,如果不进入目录下脚本执行会报错(应该是由于GG脚本中子脚本嵌套使用相对路径的问题所造成)。 SQL>@marker_setup.sql --提示输入目标schema
SQL>@ddl_setup.sql --提示输入目标schema,输入initialsetup最后输入yes SQL>@role_setup.sql
SQL>grant GGS_GGSUSER_ROLE to ddw; --不进行该步赋权后面起进程会报错 SQL>@ddl_enable.sql --使触发器生效
(4)修改提取进程和复制进程的配置文件,分别加入ddl include all属性。
此时repl必须指定assumetargetdefs属性,这表明只有两边数据库结构一致的情况下才可以启用DDL复制。另外,开启DDL同步不能再只映射单表了,对整个模式下的对象都有效。
加入DDL复制之后,数据复制的lag明显增加了。
16
清除数据库中DDL复制的设置
在实际测试中,由于我在同一个数据库中进行映射,映射表结构不一致,导致进程报了一系列的错误。这个时候需要把通过脚本创建的GG对象中的数据清空,安装目录下只提供了清除对象的脚本,可以如下操作:
首先要求把所有的GG进程停掉,包括mgr进程 SQL>@ddl_disable.sql --首先使DDL触发器失效 SQL>@ddl_remove.sql SQL>@marker_remove.sql
role_setup.sql没有对应的清除脚本,但是这块不影响配置信息的清除 然后重新再创建脚本。
4.2 oracle与db2同步
设置DB2数据库参数:
db2 connect to
db2 update db cfg for
Log retain for recovery status = RECOVERY User exit for logging status = YES
重启数据库并进行全库备份: db2 stop force db2 start
db2 backup db
指定归档路径:(OVERFLOWLOGPATH参数)
db2 connect to
GoldenGate中执行add trandata补全日志:
GGSCI> dblogin sourcedb sample userid db2admin,password db2admin
-- 除oracle外的数据库都需要指定sourcedb参数,指定数据库名称
17
GGSCI>add trandata db2admin.
其他的同步配置与Oracle中一样,需要注意的是进程配置文件中登陆DB2的部分都需要指定sourcedb这个参数(ORACLE不需要,指定了反而报错)。还有就是复制进程的配置文件中一般不能指定assumetargetdefs参数,因为不是结构一致的数据库,需要通过defgen工具生成数据定义文件进行映射。
4.3 oracle与sybase同步
Sybase数据库设置
使用sybase的SQL Advantage,用sa用户登录,执行dbcc settrunc( 'ltm', valid )修改参数。
GoldenGate中连接Sybase
GGSCI> dblogin sourcedb zhoubase userid sa password sasasa 同样做如下设置
GGSCI>add trandata
其他配置和Oracle中一样。
需要注意的是,Sybase是个区分大小写的数据库(sql server同样)。而Oracle不区分大小写,这就导致了表和字段在复制进程映射的时候,容易因大小写问题导致映射失败。解决方法是在表名外加上双引号或者单引号,参照如下复制进程的配置文件内容: /***
replicat repsy
sourcedefs d:\\tools\\GG\\gg10g\\dirdef\\extsy.ref
USERID ddw, PASSWORD ddw reperror default, discard
discardfile D:\\repsy.dsc,append,megabytes 100
MAP “dbo.BBTEST”, TARGET “DDW.AASYBASE”; --引号区分大小写 ***/
18
5、GoldenGate同步方案
GoldenGate工具虽小,但它提供表级字段级同步映射,而且同步性能优异、资源消耗低,使它的灵活性很强,可以提供多种数据同步、冗灾的解决方案。
5.1 使用GoldenGate初始化加载
这里所指的GoldenGate初始化加载,只是它指提供的direct load方式,因为其他几种官方介绍的初始化方式要么需要借助其他数据库工具(如extract->SQL*Loader),要么中间走了完全没必要的步骤导致性能很差(如extract->file->replicat方式),都不算纯正的GoldenGate方式。 初始化加载架构:
上图中,显示了初始化加载启用了两条同步路线:上面一条是真正的initial load,负责将源数据端的数据一次性发送到目标数据库;下面一条,其实就是普通的GoldenGate同步进程,负责抓取初始化加载时源端数据库进行的在线数据变化。因为在实际应用中,往往需要在生产库(源数据库)不停机的状态下,将数据加载到备用数据库(目标数据库)中并应用实时同步,在数据初始化的过程中,生产库将继续进行正常的事务操作,所以此时需要有抓取进程在初始化时开始将这些变化捕获,以免数据丢失。
实际部署时需要注意正确的执行顺序,大致可以分为以下几步: (1) 源端和目标端创建配置各个同步进程。
(2) 开启源端同步抓取进程(图上的Change Extract),开始捕获变化。 (3) 开启初始化进程(图上的Initial-Load Extract),开始数据初始化加载。 (4) 等初始化加载结束,开启目标端复制应用进程(图上的Change Replicat),开始
实时同步应用。
在目标端复制应用进程(图上的Change Replicat)中,需要在参数文件中配置HANDLECOLLISIONS参数,以避免重复应用第2和第3步之间的数据变化,因为这部分数据已经包含在初始化加载中传到目标数据库中了。
在这里需要特别提醒的一个概念上的问题,GoldenGate的初始化同步不会也不需要去初始化目标端的SCN号。这个问题在我与多位数据库DBA的交流中发现,他们往往以为GoldenGate是通过SCN来判断数据的应用情况的。GoldenGate的同步与Streams不同,它不需要依赖两端数据库保持一致的SCN来应用同步,实际上它只在抓取时可能会与数据库的SCN有关联(抓取时可以指定源数据库的特定SCN号开始解析日志),在trail传输以及目标端应用时,都和源端数据库的SCN毫无关系。它的实质是通过自己的一套队列文件检查
19
点机制来实现队列数据的管理,在目标端则通过数据的唯一键来定位数据行,trail文件最终解析成SQL语句在目标端数据库执行而实现数据的应用。所以这里的初始化加载,完全可以使用其他数据库工具来实现,比如说exp/imp、SQL*Loader、RMAN复制数据库等。 以下为一个简单的初始化加载的例子,对于实时同步配置同上面介绍的是一样的,这里不再说明,只列出初始化加载部分的进程配置。
5.1.1 GoldenGate初始化加载示例(direct load方式)
源端
添加提取进程:
GGSCI> add extract ext1,sourceistable --没有tranlog,意味着不是通过日志方式;没有begin XXX,表示
还未启动;使用sourceistable参数不会使用检查点机制 配置文件如下: /***
extract ext1
userid ddw,password ddw
rmthost 192.168.0.44, mgrport 7401
rmttask replicat, group rept1 --注意是rmttask,指定目标复制进程名 table ddw.test; ***/
不需要为该进程添加远端队列(rmttrail)。
目标端
添加复制应用进程:
add replicat rept1,specialrun --表示一次性加载 /***
replicat rept1
assumetargetdefs userid ddw,password ddw
reperror default, discard discardfile D:\\reptmy.dsc,append,megabytes 100
INSERTAPPEND --使用直接路径加载,提高加载速度
HANDLECOLLISIONS --当目标端已有数据时,略过重复数据错误 MAP ddw.test, TARGET ddw.test1; ***/
注意,这里的extract和replicat进程添加完后在info all中看不到这个进程,但是view report可以跟踪到。
要开始加载,在源端执行: GGSCI> start exttmy
20