OGG插件介绍

OGG采集工具


一、背景介绍

随着数据规模的不断扩大,传统的RDBMS难以满足OLAP的需求,本文将介绍如何将Oracle的数据实时同步到阿里云的大数据处理平台当中,并利用大数据工具对数据进行分析。

OGG(Oracle GoldenGate)是一个基于日志的结构化数据备份工具,一般用于Oracle数据库之间的主从备份以及Oracle数据库到其他数据库(DB2, MySQL等)的同步。下面是Oracle官方提供的一个OGG的整体架构图,从图中可以看出OGG的部署分为源端和目标端两部分组成,主要有Manager,Extract,Pump,Collector,Replicat这么一些组件。16-1

  • Manager:在源端和目标端都会有且只有一个Manager进程存在,负责管理其他进程的启停和监控等;
  • Extract:负责从源端数据库表或者事务日志中捕获数据,有初始加载和增量同步两种模式可以配置,初始加载模式是直接将源表数据同步到目标端,而增量同步就是分析源端数据库的日志,将变动的记录传到目标端,本文介绍的是增量同步的模式;
  • Pump:Extract从源端抽取的数据会先写到本地磁盘的Trail文件,Pump进程会负责将Trail文件的数据投递到目标端;
  • Collector:目标端负责接收来自源端的数据,生成Trail文件
  • Replicat:负责读取目标端的Trail文件,转化为相应的DDL和DML语句作用到目标数据库,实现数据同步。

本文介绍的Oracle数据同步是通过OGG的Datahub插件实现的,该Datahub插件在架构图中处于Replicat的位置,会分析Trail文件,将数据的变化记录写入Datahub中,可以使用流计算对datahub中的数据进行实时分析,也可以将数据归档到MaxCompute中进行离线处理。
当前插件版本为2.0.5,用户可以直接在文末下载最新版,也可以在github上下载源码自行打包。

二、支持数据库版本

数据库 支持版本 插件版本
Oracle 11g ~ 19c 2.0.2 ~ 2.0.8
MySQL 企业版 / 社区版 2.0.3 ~ 2.0.8

三、使用场景

这里以Oracle数据为例,展示一个简单的示例来说明数据的使用方法,例如我们在数据库有一张商品订单表orders(oid int, pid int, num int),该表有三列,分别为订单ID, 商品ID和商品数量。将这个表通过OGG Datahub进行增量数据同步之前,我们需要先将源表已有的数据通过DataX同步到MaxCompute中。增量同步的关键步骤如下:
(1)在Datahub上创建相应的Topic,Topic的schema为(string record_id, string optype, string readtime, bigint oid_before, bigint oid_after, bigint pid_before, bigint pid_after, bigint num_before, bigint num_after);
(2)OGG Datahub的插件按照上述的安装流程部署配置,其中列的Mapping配置如下:

  1. <ctypeColumn>optype</ctypeColumn>
  2. <ctimeColumn>readtime</ctimeColumn>
  3. <cidColumn>record_id</cidColumn>
  4. <columnMapping>
  5. <column src="oid" dest="oid_after" destOld="oid_before" isShardColumn="true"/>
  6. <column src="pid" dest="pid_after" destOld="pid_before"/>
  7. <column src="num" dest="num_after" destOld="num_before"/>
  8. </columnMapping>

其中optype和readtime字段是记录数据库的数据变更类型和时间,optype有”I”, “D”, “U”三种取值,分别对应为“增”,“删”,“改”三种数据变更操作。
(3)OGG Datahub插件部署好成功运行后,插件会源源不断的将源表的数据变更记录输送至datahub中,例如我们在源订单表中新增一条记录(1,2,1),datahub里收到的记录如下:

  1. +--------+------------+------------+------------+------------+------------+------------+------------+------------+
  2. | record_id | optype | readtime | oid_before | oid_after | pid_before | pid_after | num_before | num_after |
  3. +-------+------------+------------+------------+------------+------------+------------+------------+------------+
  4. | 14810373343020000 | I | 2016-12-06 15:15:28.000141 | NULL | 1 | NULL | 2 | NULL | 1 |

修改这条数据,比如把num改为20,datahub则会收到的一条变更数据记录,如下:

  1. +-------+------------+------------+------------+------------+------------+------------+------------+------------+
  2. | record_id | optype | readtime | oid_before | oid_after | pid_before | pid_after | num_before | num_after |
  3. +--------+------------+------------+------------+------------+------------+------------+------------+------------+
  4. | 14810373343080000 | U | 2016-12-06 15:15:58.000253 | 1 | 1 | 2 | 2 | 1 | 20 |

(4)在源端OGG运行ggsci,然后运行stats dhext可以查看每个表的操作统计,在目标端同样可以使用,可以查看采集端和目标端操作统计是否一致。

实时计算

在前一天的离线计算的基础数据上,我们可以写一个StreamCompute流计算的分析程序,很容易地对数据进行实时汇总,例如实时统计当前总的订单数,每种商品的销售量等。处理思路就是对于每一条到来的变更数据,可以拿到变化的数值,实时更新统计变量即可。

离线处理

为了便于后续的离线分析,我们也可以将Datahub里的数据归档到MaxCompute中,在MaxCompute中创建相应Schema的表:

  1. create table orders_log(record_id string, optype string, readtime string, oid_before bigint, oid_after bigint, pid_before bigint, pid_after bigint, num_before bigint, num_after bigint);

在Datahub上创建MaxCompute的数据归档,上述流入Datahub里的数据将自动同步到MaxCompute当中。建议将同步到MaxCompute中的数据按照时间段进行划分,比如每一天的增量数据都对应一个独立分区。这样当天的数据同步完成后,我们可以处理对应的分区,拿到当天所有的数据变更,而与和前一天的全量数据进行合并后,即可得到当天的全量数据。为了简单起见,先不考虑分区表的情况,以2016-12-06这天的增量数据为例,假设前一天的全量数据在表orders_base里面,datahub同步过来的增量数据在orders_log表中,将orders_base与orders_log做合并操作,可以得到2016-12-06这天的最终全量数据写入表orders_result中。这个过程可以在MaxCompute上用如下这样一条SQL完成。

  1. INSERT OVERWRITE TABLE orders_result
  2. SELECT t.oid, t.pid, t.num
  3. FROM
  4. (
  5. SELECT oid, pid, num, '0' x_record_id, 1 AS x_optype
  6. FROM
  7. orders_base
  8. UNION ALL
  9. SELECT decode(optype,'D',oid_before,oid_after) AS oid
  10. , decode(optype,'D', pid_before,pid_after) AS pid
  11. , num_after AS num
  12. , record_id x_record_id
  13. , decode(optype, 'D', 0, 1) AS x_optype
  14. FROM
  15. orders_log
  16. ) t
  17. JOIN
  18. (
  19. SELECT
  20. oid
  21. , pid
  22. , max(record_id) x_max_modified
  23. FROM
  24. (
  25. SELECT
  26. oid
  27. , pid
  28. , '0' record_id
  29. FROM
  30. orders_base UNION ALL SELECT
  31. decode(optype,'D',oid_before,oid_after) AS oid
  32. , decode(optype,'D', pid_before,pid_after) AS pid
  33. , record_id
  34. FROM
  35. orders_log ) g
  36. GROUP BY oid , pid
  37. ) s
  38. ON
  39. t.oid = s.oid AND t.pid = s.pid AND t.x_record_id = s.x_max_modified AND t.x_optype <> 0;

四、参数详细介绍

configure

名称 默认值 是否必须 描述
batchSize 1000 可选 上传到datahub, 一批的最多纪录数
batchTimeoutMs 5000 可选 数据量小于batchSize最长等待时间,最小1000,单位:毫秒
dirtyDataContinue false 可选 脏数据是否继续
dirtyDataFile datahub_ogg_plugin.dirty 可选 脏数据文件
dirtyDataFileMaxSize 500 可选 脏数据文件最大size,单位:MB
retryTimes -1 可选 重试次数, -1:无限重试 0:不重试 n:重试次数
retryInterval 3000 可选 重试间隔, 单位:毫秒
disableCheckPointFile false 可选 是否禁用checkpoint file
checkPointFileName datahub_ogg_plugin.chk 可选 adapter进程的点位文件名
storageCtimeColumnAsTimestamp
(Deprecated)
false 可选 弃用之后,会根据DataHub中的字段类型进行转换,timestamp存储微秒时间戳,STRING存储为yyyy-MM-dd HH:mm:ss.SSSSSS
charset UTF-8 可选 oracle源端字符集,一般不需要关注,当出现中文乱码时需要根据源端字符集来进行配置
commitFlush true 可选 置为true可以保证数据不会丢失,但同时会影响整体性能。置为false可以提升性能,但是存在丢数据的风险,正常情况下不建议设置成false。
reportMetric false 可选 是否打印metric
reportMetricIntervalMs 5 60 1000 可选 metric周期,每次打印metric之后会重新开始统计,单位:毫秒
buildCorePollSize 默认为配置table数量 可选 解析数据线程池最少线程数
buildMaximumPoolSize 默认为buildCorePollSize两倍 可选 解析数据线程池最多线程数
writeCorePollSize 默认为配置table数量 可选 写入DataHub线程池最少线程数
writeMaximumPoolSize 默认为配置table数量 可选 写入DataHub线程池最多线程数

defaultOracleConfigure

名称 默认值 是否必须 描述
sid - 必须 oracle 数据库的SID
schema - 必须 oracle schema
dateFormat(Deprecated) yyyy-MM-dd HH:mm:ss 可选 默认时间字段转换格式

defaultDatahubConfigure

名称 默认值 是否必须 描述
endPoint - 必须 DataHub endpoint
project - 必须 DataHub project
accessId - 必须 DataHub accessId
accessKey - 必须 DataHub accessKey
compressType - 可选 数据传输压缩格式,现支持DEFLATE和LZ4,默认不压缩
enablePb false 可选 数据传输是否使用protobuf
ctypeColumn - 可选 数据变更类型同步到datahub对应的字段,可以被columnMapping中的ctypeColumn覆盖,必须为String类型
ctimeColumn - 可选 数据在oracle中insert/update/delete的时间同步到datahub对应的字段,可以被columnMapping中的ctimeColumn覆盖,必须为String或者Timestamp类型
cidColumn - 可选 数据变更序号同步到datahub对应的字段, 按数据变更先后递增, 不保证连续, 可以被columnMapping中的cidColumn覆盖,必须为String类型
constColumnMap - 可选 额外增加的常量列,每条record该列值为指定值,格式为c1=xxx,c2=xxx,可以被columnMapping中的constColumnMap覆盖,并且可以用来获取自定义格式时间,获取的时间为数据在数据在源库修改的时间,具体方式可参考以下内容

constColumnMap 获取时间参数说明

参数 含义
%t Unix毫秒时间戳
%a 星期别名 (Mon, Tue, …)
%A 星期全名 (Monday, Tuesday, …)
%b 月别名 (Jan, Feb, …)
%B 月全名 (January, February, …)
%c 日期和时间 (Thu Mar 3 23:05:25 2005)
%d 每月的第几天 (01)
%D 日期 (05/09/20)
%H 24制小时 (00..23)
%I 12制小时 (01..12)
%j 每月的第几天 (001..366)
%k 24制小时 ( 0..23)
%m 月 (01..12)
%M 分钟 (00..59)
%p am/pm
%s Unix秒时间戳
%S 秒 (00..59)
%y 年的后两位 (00..99)
%Y 年 (2010)
%z 时区(东八区,+0800)

例如:同步到MaxCompute时,想以天作为分区值,就可以添加配置<constColumnMap>ds=%Y%m%d</constColumnMap>,就会在DataHub中ds列中写入数据20200509

mapping

名称 默认值 是否必须 描述
oracleSchema - 可选 如果不配置,则采用defaultOracleConfigure中的schema
oracleTable - 必须 oracle table
datahubProject - 可选 如果不配置,则采用defaultDatahubConfigure中的project
datahubAccessId
(Deprecated)
- 可选 弃用,默认采用defaultDatahubConfigure中的accessId
datahubAccessKey
(Deprecated)
- 可选 弃用,默认采用defaultDatahubConfigure中的accessKey
datahubTopic - 必须 DataHub topic
shardId(Deprecated) - 可选 shardId列表,如果指定,则不会自动更新shardId列表。例如0,1,2
rowIdColumn - 可选 oracle表中的rowid与DataHub相对应的字段,必须为String类型,一般在没有主键的oracle表中使用
ctypeColumn - 可选 同defaultDatahubConfigure中的ctypeColumn
ctimeColumn - 可选 同defaultDatahubConfigure中的ctimeColumn
cidColumn - 可选 同defaultDatahubConfigure中的cidColumn
constColumnMap - 可选 同defaultDatahubConfigure中的constColumnMap

columnMapping中的column

名称 默认值 是否必须 描述
src - 必须 oracle字段名称
dest - 必须 DataHub topic 字段名称
destOld - 可选 变更前数据落到DataHub topic 字段名称
isShardColumn false 可选 是否作为shard的hashkey
isKeyColumn false 可选 如果变更后值为NULL,但是变更前是有值的,那么可以设置该参数使用变更前的值写入dest对应的DataHub字段
isDateFormat true 可选 只有在DataHub中的字段为TIMESTAMP时才会生效,是否采用DateFormat将时间格式转换,如果oracle字段是date或者timestamp,则不需要进行设置,如果是false, 源端数据必须是long
dateFormat yyyy-MM-dd HH:mm:ss[.fffffffff] 可选 一般不需要进行设置,当时间格式不符合默认值格式时需要进行设置
isDefaultCharset true 可选 一般不需要关注,当出现中文乱码时,需要首先设置charset,然后将源字段含有中文的列配置为false。

五、常见问题

问题排查常用文件:

datahub-ogg-plugin.log: 插件日志,DataHub插件进程打印的日志,一半以上的问题都可以通过查看这个日志报错来解决,在插件目录的log目录下。

ggserr.log: 监控日志。一般记录用户的操作记录,和是否启动成功,ogg/adapter主目录下。一般extract进程配置错误,或者缺少动态库文件报错记录都会在这个文件中。

dirrpt: report文件,可以查看该进程运行时的报错信息等(view report就是查看该文件),如果数据正常传输到目标端,ggserr.log和插件日志都没有报错,那么很可能错误记录在这个文件中。

dirchk: OGG的点位文件,记录了该进程的点位信息

datahub_ogg_plugin.chk: datahub插件自己的点位记录。

Q: 数据无法写入DataHub

A : 检查整条链路。

  • 检查源端的dirdat是否有数据,如果没有那么是源端extract的问题
  • 检查目标端dirdat是否有数据,如果没有那么是源端pump的问题
  • 检查插件日志是否有记录,有可能是插件自己的点位导致直接忽略了数据,或者是插件有报错(最常见),
  • 如果插件日志完全没有数据,数据也被投递过来了,那么查看dirrpt下的日志,可能是目标端OGG自己的点位检查直接忽略掉数据了。
  • 检查oracleSchema配置是否正确,有可能是oracleSchema和源端不匹配导致数据被忽略。

Q: 无法获取rowid,其余数据正常

A : 多是配置错误引起,需仔细检查配置。

  • 检查版本,2.0.3才可以获取rowid。
  • 检查源端extract是否正确配置token,TABLE OGG_TEST.*,tokens (TKN-ROWID=@GETENV('RECORD','rowid'));,之前就有用户将TKN-ROWID错写成TKN_ROWID,导致一致无法获取到rowid.
  • 检查目标端configure.xml是否配置rowid, <rowIdColumn></rowIdColumn>
  • 检查抽取数据(logdump)是否成功获取rowid,如下图

16-2

Q: Error in token clause for TKN-ROWID

报错信息:

  1. 2020-01-17 16:17:17 INFO OGG-06509 Oracle GoldenGate Capture for Oracle, dhext.prm: Using the following key columns for source table OGG_TEST.ORDERS: OID.
  2. 2020-01-17 16:17:17 INFO OGG-01298 Oracle GoldenGate Capture for Oracle, dhext.prm: Column function diagnostic message: could not find column "RECORD".
  3. 2020-01-17 16:17:17 ERROR OGG-00369 Oracle GoldenGate Capture for Oracle, dhext.prm: Error in token clause for TKN-ROWID.
  4. 2020-01-17 16:17:17 ERROR OGG-01668 Oracle GoldenGate Capture for Oracle, dhext.prm: PROCESS ABENDING.

A: 源端配置TABLE OGG_TEST.*,tokens (TKN-ROWID=@GETENV('RECORD','rowid'));之后,无法启动。

  • 检查版本,2.0.3及以上版本才可以获取rowid
  • 仔细检查配置是否与官方文档一致
  • 如果一致可以尝试切换一下@GETENV('RECORD','rowid'))的单双引号
  • 重启mgr

Q: dsOperation.getPosition():xxxxxxx old sendPosition is xxxxx, Skip this Operation, it maybe duplicated.

A: 多数情况是因为源端重启导致。

  • 删除点位文件datahub_ogg_plugin.chk,然后重启目标端进程
  • 如果删除点位文件仍无法解决,可以尝试禁用掉插件的点位来解决,但是可能会导致重复。
  • 如果存在多个目标端,那么两个目标端公用一个点位文件可能会出现这个问题,需要在配置文件中手动配置checkPointFileName为不同的文件名。

Q: dirrpt下的日志报错 Unable to create operation: com.goldengate.atg.datasource.ConcurrentTransactionException: Multiple “Begin-Transaction” operations received for the same source transaction. Current transaction begin position: xxx(xxx); current trail position: xxx。

A: 源端事务冲突导致,需要排查源端oracle是否有问题。

Q: 数据上传到DataHub之后有8小时的时间延迟

A: 修改javaue.properties中的参数goldengate.userexit.timestamp为utc+8,然后重启dhwriter。

Q: datahub插件解析后某些数据字段为空

A: 插件日志DEBUG模式下会打印全量数据,检查是否与源端数据匹配。

  • 如果日志中打印数据正确,那可能是用户配置columnMapping错误导致数据缺失
  • 如果日志中打印数据已经不匹配,那么检查OGG抽取数据是否正确,查看方法参考 logdump官方文档。rba信息可以在日志中看到。

Q:源端使用OGG12.3,插件解析trail文件失败

A: 首先建议使用OGG12.2,或者也可以目标端修改extract配置RMTTRAIL ./dirdat/stRMTTRAIL ./dirdat/st format RELEASE 12.2

Q: java.lang.NumberFormatException: for input string : “xxxx”

A: 检查所有的配置字段是否对应,对应关系可以参考oracle类型与DataHub类型对应说明。之前有用户,把oracle的字符串的destOld对应到DataHub的BIGINT字段,导致BIGINT解析失败。

Q: String index out of range: 10

报错信息:

  1. 2020-01-14 10:03:24 [main] ERROR OperationHandler - dirty data : INSERT on WF_YN_07.CJ_GLQX202001 [B] [columns: 27] [pos: 00000007260404799638 (seqno=726, rba=404799638)] [time: 2020-01-14 08:49:43.883741]
  2. java.lang.StringIndexOutOfBoundsException: String index out of range: 10
  3. at java.lang.AbstractStringBuilder.setCharAt(AbstractStringBuilder.java:407)
  4. at java.lang.StringBuilder.setCharAt(StringBuilder.java:76)
  5. at com.aliyun.odps.ogg.handler.datahub.RecordBuilder.convertStrToMicroseconds(RecordBuilder.java:272)
  6. at com.aliyun.odps.ogg.handler.datahub.RecordBuilder.setTupleData(RecordBuilder.java:242)
  7. at com.aliyun.odps.ogg.handler.datahub.RecordBuilder.buildTupleRecord(RecordBuilder.java:172)
  8. at com.aliyun.odps.ogg.handler.datahub.RecordBuilder.buildRecord(RecordBuilder.java:82)
  9. at com.aliyun.odps.ogg.handler.datahub.operations.OperationHandler.processOperation(OperationHandler.java:50)
  10. at com.aliyun.odps.ogg.handler.datahub.operations.InsertOperationHandler.process(InsertOperationHandler.java:31)
  11. at com.aliyun.odps.ogg.handler.datahub.DatahubHandler.operationAdded(DatahubHandler.java:108)
  12. at oracle.goldengate.datasource.DsEventManager$3.send(DsEventManager.java:439)
  13. at oracle.goldengate.datasource.DsEventManager$EventDispatcher.distributeEvent(DsEventManager.java:231)
  14. at oracle.goldengate.datasource.DsEventManager.fireOperationAdded(DsEventManager.java:447)
  15. at oracle.goldengate.datasource.AbstractDataSource.fireOperationAdded(AbstractDataSource.java:464)
  16. at oracle.goldengate.datasource.UserExitDataSource.addOperationToTransactionAndFireEvent(UserExitDataSource.java:1337)
  17. at oracle.goldengate.datasource.UserExitDataSource.createOperation(UserExitDataSource.java:1305)
  18. at oracle.goldengate.datasource.UserExitDataSource.createOperation(UserExitDataSource.java:1046)

A: 用户把时间戳类型的数据映射到TIMESTAMP上,因为TIMESTAMP字段对应的oracle字段类型一般默认为date或者timestamp,所以直接是按时间字符串”2020-01-10:10:00:00”来处理的,这个实际传过来是时间戳字符串,所以就会发生越界的情况。 解决方法:配置columnMapping中的isDateFormat="false"

Q: 无法获取update的before值

A: 检查源端是否有配置GETUPDATEBEFORES

Q: oracle中有主键的表,OGG获取update操作,after的值为””

A: oracle的表有没有主键,OGG获取的update操作的值是不同的:

  • 对于没有主键表的update操作,如果一列从a更新到b,那么显示"b" [before="a"],如果某一列没有被更新,并且更新前的值是c,那么显示"c" [before="c"]
  • 对于有主键表的update操作,如果一列从a更新到b,那么显示"b" [before="a"],如果某一列没有被更新,并且更新前的值是c,那么显示"" [before="c"]
  • 解决方案一:例如一张表有三个字段a b c,主键为a,如果update值不更新b,那么b的after就为””,如果想以b的before值作为after的值,可以在源端extract设置TABLE OGG_TEST.*,keycols(a,b);
  • 解决方案二:在columnMap中增加isKeyColumn配置,例如:<column src="b" dest="b" destOld="b_old" isKeyColumn="true"/>

Q: Unsupported major.minor version 52.0

报错信息:

  1. 2019-12-23 18:03:58 [main] ERROR UserExitMain - java.lang.UnsupportedClassVersionError: com/aliyun/datahub/client/model/RecordSchema : Unsupported major.minor version 52.0
  2. java.lang.UnsupportedClassVersionError: com/aliyun/datahub/client/model/RecordSchema : Unsupported major.minor version 52.0
  3. at oracle.goldengate.datasource.DataSourceLauncher.<init>(DataSourceLauncher.java:161)
  4. at oracle.goldengate.datasource.UserExitMain.main(UserExitMain.java:108)
  5. Caused by: org.springframework.beans.factory.BeanDefinitionStoreException: Factory method [public final oracle.goldengate.datasource.GGDataSource oracle.goldengate.datasource.factory.DataSourceFactory.getDataSource()] threw exception; nested exception is java.lang.UnsupportedClassVersionError: com/aliyun/datahub/client/model/RecordSchema : Unsupported major.minor version 52.0
  6. at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:169)
  7. at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:570)
  8. ... 11 more
  9. Caused by: java.lang.UnsupportedClassVersionError: com/aliyun/datahub/client/model/RecordSchema : Unsupported major.minor version 52.0

A: JDK版本不对,插件的编译环境是JDK1.8,用户可能使用了1.7的JDK,建议修改到JDK1.8或者自行去github上clone代码,编译jar包。

Q: Error opening module ./libggjava_ue.so - libjsig.so:cannot open shared object file:no such file or directory

A: 检查版本是否正确,检查文件是否存在,检查环境变量是否生效,重启mgr,重启机器(不推荐,但是之前有用户遇到这个问题,重启了一下机器解决了)。

Q: OGG-00425 No DB login established to retrieve a definition for table xxx.xxx

A: 源端重新生成一下def文件,复制到目标端。

Q: defaultDatahubConfigure is null

报错信息:

  1. 2020-01-17 17:28:32 [main] ERROR DatahubHandler - Init error
  2. java.lang.RuntimeException: defaultDatahubConfigure is null
  3. at com.aliyun.odps.ogg.handler.datahub.ConfigureReader.reader(ConfigureReader.java:117)

A: 插件2.0.3更新了一个配置文件的拼写错误,如果继续使用2.0.2的配置文件,需要修改defalutDatahubConfigure => defaultDatahubConfigure

Q:目标端报错 OGG-06551 Oracle GoldenGate Collector: Could not translate host name localhost into an Internet address.

A:目标端机器hostname在/etc/hosts里面重新设置localhost对应的ip

Q:找不到jvm相关的so包

A:将jvm的so路径添加到LD_LIBRARY_PATH后,重启mgr。例如:export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:$JAVA_HOME/lib/amd64:$JAVA_HOME/lib/amd64/server

Q:有了DDL语句,比如增加一列,源端ogg没有问题,但是adapter端的ffwriter和jmswriter进程退出,且报错: 2015-06-11 14:01:10 ERROR OGG-01161 Bad column index (5) specified for table OGG_TEST.T_PERSON, max columns = 5.

A:由于表结构改变,需要重做def文件,将重做的def文件放入dirdef后重启即可

Q: OGG report文件中报错 Error (4) retrieving column value.

A: 一般OGG是trail文件解析失败,开启debug日志可以看到具体是哪个RBA报错,调整点位跳过这个RBA方可解决。

六、版本更新说明

2.0.2

2.0.3

  • 下载链接
  • 支持采集oracle表的rowid。
  • 支持DataHub的DECIMAL、TIMESTAMP等类型。
  • 修改配置参数的拼写错误(defalutDatahubConfigure => defaultDatahubConfigure),如果在升级插件版本之后,依旧使用旧的配置文件,则需要修改此参数。
  • 支持压缩、protobuf传输等功能。

2.0.4

  • 下载链接
  • 支持配置字符集,对于非utf-8编码的源数据库,可以避免中文乱码

2.0.5

  • 下载链接
  • 性能优化,TPS最高可提升70%
  • 日志可配置metric打印
  • 修复constColumnMap获取时间与真实时间不一致的bug

2.0.6

  • 下载链接
  • 修复2.0.5线程数据过多BUG
  • 修复after值为空不能哈希的问题
  • 支持DataHub新类型,TINYINT , SMALLINT , INTEGER , FLOAT

2.0.7

  • 下载链接
  • 适配OGG for Bigdata 12.3.2.1,不再支持OGG Adpater

2.0.8

  • 下载链接
  • 适配OGG for Bigdata 19.1.0.0,不再支持OGG Adpater