随着数据规模的不断扩大,传统的RDBMS难以满足OLAP的需求,本文将介绍如何将Oracle的数据实时同步到阿里云的大数据处理平台当中,并利用大数据工具对数据进行分析。
OGG采集工具
一、背景介绍
随着数据规模的不断扩大,传统的RDBMS难以满足OLAP的需求,本文将介绍如何将Oracle的数据实时同步到阿里云的大数据处理平台当中,并利用大数据工具对数据进行分析。
OGG(Oracle GoldenGate)是一个基于日志的结构化数据备份工具,一般用于Oracle数据库之间的主从备份以及Oracle数据库到其他数据库(DB2, MySQL等)的同步。下面是Oracle官方提供的一个OGG的整体架构图,从图中可以看出OGG的部署分为源端和目标端两部分组成,主要有Manager,Extract,Pump,Collector,Replicat这么一些组件。
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配置如下:
<ctypeColumn>optype</ctypeColumn>
<ctimeColumn>readtime</ctimeColumn>
<cidColumn>record_id</cidColumn>
<columnMapping>
<column src="oid" dest="oid_after" destOld="oid_before" isShardColumn="true"/>
<column src="pid" dest="pid_after" destOld="pid_before"/>
<column src="num" dest="num_after" destOld="num_before"/>
</columnMapping>
其中optype和readtime字段是记录数据库的数据变更类型和时间,optype有”I”, “D”, “U”三种取值,分别对应为“增”,“删”,“改”三种数据变更操作。(3)OGG Datahub插件部署好成功运行后,插件会源源不断的将源表的数据变更记录输送至datahub中,例如我们在源订单表中新增一条记录(1,2,1),datahub里收到的记录如下:
+--------+------------+------------+------------+------------+------------+------------+------------+------------+
| record_id | optype | readtime | oid_before | oid_after | pid_before | pid_after | num_before | num_after |
+-------+------------+------------+------------+------------+------------+------------+------------+------------+
| 14810373343020000 | I | 2016-12-06 15:15:28.000141 | NULL | 1 | NULL | 2 | NULL | 1 |
修改这条数据,比如把num改为20,datahub则会收到的一条变更数据记录,如下:
+-------+------------+------------+------------+------------+------------+------------+------------+------------+
| record_id | optype | readtime | oid_before | oid_after | pid_before | pid_after | num_before | num_after |
+--------+------------+------------+------------+------------+------------+------------+------------+------------+
| 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的表:
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完成。
INSERT OVERWRITE TABLE orders_result
SELECT t.oid, t.pid, t.num
FROM
(
SELECT oid, pid, num, '0' x_record_id, 1 AS x_optype
FROM
orders_base
UNION ALL
SELECT decode(optype,'D',oid_before,oid_after) AS oid
, decode(optype,'D', pid_before,pid_after) AS pid
, num_after AS num
, record_id x_record_id
, decode(optype, 'D', 0, 1) AS x_optype
FROM
orders_log
) t
JOIN
(
SELECT
oid
, pid
, max(record_id) x_max_modified
FROM
(
SELECT
oid
, pid
, '0' record_id
FROM
orders_base UNION ALL SELECT
decode(optype,'D',oid_before,oid_after) AS oid
, decode(optype,'D', pid_before,pid_after) AS pid
, record_id
FROM
orders_log ) g
GROUP BY oid , pid
) s
ON
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 |
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,如下图
Q: Error in token clause for TKN-ROWID
报错信息:
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.
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".
2020-01-17 16:17:17 ERROR OGG-00369 Oracle GoldenGate Capture for Oracle, dhext.prm: Error in token clause for TKN-ROWID.
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自身的点位就足够了,所以可以尝试禁用掉插件点位(disableCheckPointFile设为true),不会对程序有影响,并且在接下来的版本中,我们也会完全弃用Datahub插件的点位。
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/st
为RMTTRAIL ./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
报错信息:
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]
java.lang.StringIndexOutOfBoundsException: String index out of range: 10
at java.lang.AbstractStringBuilder.setCharAt(AbstractStringBuilder.java:407)
at java.lang.StringBuilder.setCharAt(StringBuilder.java:76)
at com.aliyun.odps.ogg.handler.datahub.RecordBuilder.convertStrToMicroseconds(RecordBuilder.java:272)
at com.aliyun.odps.ogg.handler.datahub.RecordBuilder.setTupleData(RecordBuilder.java:242)
at com.aliyun.odps.ogg.handler.datahub.RecordBuilder.buildTupleRecord(RecordBuilder.java:172)
at com.aliyun.odps.ogg.handler.datahub.RecordBuilder.buildRecord(RecordBuilder.java:82)
at com.aliyun.odps.ogg.handler.datahub.operations.OperationHandler.processOperation(OperationHandler.java:50)
at com.aliyun.odps.ogg.handler.datahub.operations.InsertOperationHandler.process(InsertOperationHandler.java:31)
at com.aliyun.odps.ogg.handler.datahub.DatahubHandler.operationAdded(DatahubHandler.java:108)
at oracle.goldengate.datasource.DsEventManager$3.send(DsEventManager.java:439)
at oracle.goldengate.datasource.DsEventManager$EventDispatcher.distributeEvent(DsEventManager.java:231)
at oracle.goldengate.datasource.DsEventManager.fireOperationAdded(DsEventManager.java:447)
at oracle.goldengate.datasource.AbstractDataSource.fireOperationAdded(AbstractDataSource.java:464)
at oracle.goldengate.datasource.UserExitDataSource.addOperationToTransactionAndFireEvent(UserExitDataSource.java:1337)
at oracle.goldengate.datasource.UserExitDataSource.createOperation(UserExitDataSource.java:1305)
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
报错信息:
2019-12-23 18:03:58 [main] ERROR UserExitMain - java.lang.UnsupportedClassVersionError: com/aliyun/datahub/client/model/RecordSchema : Unsupported major.minor version 52.0
java.lang.UnsupportedClassVersionError: com/aliyun/datahub/client/model/RecordSchema : Unsupported major.minor version 52.0
at oracle.goldengate.datasource.DataSourceLauncher.<init>(DataSourceLauncher.java:161)
at oracle.goldengate.datasource.UserExitMain.main(UserExitMain.java:108)
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
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:169)
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:570)
... 11 more
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
报错信息:
2020-01-17 17:28:32 [main] ERROR DatahubHandler - Init error
java.lang.RuntimeException: defaultDatahubConfigure is null
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