阅读797 返回首页    go 阿里云 go 技术社区[云栖]


OGG MaxCompute插件__数据入云_数据集成-阿里云

Oracle Golden Gate软件是一种基于日志的结构化数据复制备份软件,它通过解析源数据库在线日志或归档日志获得数据的增量变化。本文介绍如何使用OGG将增量变化上传到ODPS DataHub

二、环境要求

  • 源端已安装好Oracle以及OGG
  • 宿端已安装好OGG(with java adaptor)

三、配置步骤

(Oracle/OGG相关参数配置以熟悉Oracle/OGG的运维人员配置为准,本示例只是提供一个可运行的样本)

    1. 源端Oracle配置:
  1. # 创建ogg_test用户,密码也为ogg_test
  2. create user ogg_test identified by ogg_test;
  3. # 给ogg_test赋予充分的权限
  4. grant connect,resource,dba to ogg_test;
  5. # 给用户ogg_test赋予库ogg_test的执行权限
  6. grant execute on ogg_test TO ogg_test;
  7. # 检查附加日志情况
  8. Select SUPPLEMENTAL_LOG_DATA_MIN, SUPPLEMENTAL_LOG_DATA_PK, SUPPLEMENTAL_LOG_DATA_UI, SUPPLEMENTAL_LOG_DATA_FK, SUPPLEMENTAL_LOG_DATA_ALL from v$database;
  9. # 增加数据库附加日志及回退
  10. alter database add supplemental log data;
  11. alter database add supplemental log data (primary key, unique,foreign key) columns;
  12. --- rollback
  13. alter database drop supplemental log data (primary key, unique,foreign key) columns;
  14. alter database drop supplemental log data;
  15. # 全字段模式,注意:在该模式下的delete操作也只有主键值
  16. ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;
  17. # 开启数据库强制日志模式
  18. alter database force logging;
  19. # 执行marker_setup.sql 脚本
  20. @marker_setup.sql
  21. # 执行@ddl_setup.sql
  22. @ddl_setup.sql
  23. # 执行role_setup.sql
  24. @role_setup.sql
  25. # 给ogg用户赋权
  26. grant GGS_GGSUSER_ROLE to ogg_test;
  27. # 执行@ddl_enable.sql,开启DDL trigger
  28. @ddl_enable.sql
  29. # 执行优化脚本
  30. @ddl_pin ogg_test
  31. # 安装sequence support
  32. @sequence.sql
  33. #
  34. alter table sys.seq$ add supplemental log data (primary key) columns;
  • 2.源端OGG extract配置
  1. # 查看全局情况
  2. info all
  3. # 配置mgr
  4. edit params mgr
  5. PORT 7839
  6. DYNAMICPORTLIST 7840-7849
  7. USERID ogg_test, PASSWORD ogg_test
  8. PURGEOLDEXTRACTS ./dirdat/*, USECHECKPOINTS, MINKEEPDAYS 7
  9. LAGREPORTHOURS 1
  10. LAGINFOMINUTES 30
  11. LAGCRITICALMINUTES 45
  12. PURGEDDLHISTORY MINKEEPDAYS 3, MAXKEEPDAYS 7
  13. PURGEMARKERHISTORY MINKEEPDAYS 3, MAXKEEPDAYS 7
  14. # 启动mgr(运行日志在%YOUR_OGG_DIRECTORY%/dirrpt中)
  15. start mgr
  16. # 查看mgr状态
  17. info mgr
  18. # 查看mgr配置
  19. view params mgr
  20. # 配置extract(名字可任取,extract是组名)
  21. edit params extract
  22. EXTRACT extract
  23. SETENV (NLS_LANG="AMERICAN_AMERICA.AL32UTF8")
  24. DBOPTIONS ALLOWUNUSEDCOLUMN
  25. USERID ogg_test, PASSWORD ogg_test
  26. REPORTCOUNT EVERY 1 MINUTES, RATE
  27. NUMFILES 5000
  28. DISCARDFILE ./dirrpt/ext_test.dsc, APPEND, MEGABYTES 100
  29. DISCARDROLLOVER AT 2:00
  30. WARNLONGTRANS 2h, CHECKINTERVAL 3m
  31. EXTTRAIL ./dirdat/st, MEGABYTES 200
  32. DYNAMICRESOLUTION
  33. TRANLOGOPTIONS CONVERTUCS2CLOBS
  34. TRANLOGOPTIONS RAWDEVICEOFFSET 0
  35. DDL &
  36. INCLUDE MAPPED OBJTYPE 'table' &
  37. INCLUDE MAPPED OBJTYPE 'index' &
  38. INCLUDE MAPPED OBJTYPE 'SEQUENCE' &
  39. EXCLUDE OPTYPE COMMENT
  40. DDLOPTIONS NOCROSSRENAME REPORT
  41. TABLE OGG_TEST.*;
  42. SEQUENCE OGG_TEST.*;
  43. # 增加extract进程(ext后的名字要跟上面`extract`对应,本例中extract是组名)
  44. add ext extract,tranlog,begin now
  45. # 添加抽取进程,每个队列文件大小为200m
  46. add exttrail ./dirdat/st,ext extract, megabytes 200
  47. # 启动抽取进程
  48. start extract extract
  49. 至此,extract配置完成,数据库的一条变更可以在ggate/dirdat目录下的文件中看到
  • 3.源端生成def文件并拷贝到宿端
  1. # 源端ggsci起来后执行如下命令
  2. edit params defgen
  3. DEFSFILE ./dirdef/ogg_test.def
  4. USERID ogg_test, PASSWORD ogg_test
  5. table OGG_TEST.*;
  6. # 生成ogg_test.def,拷贝到宿端相应目录下
  7. ./defgen paramfile ./dirprm/defgen.prm
  • 4.宿端启动OGG mgr
  1. # 创建必须目录
  2. create subdirs
  3. # 编辑mgr配置
  4. edit params mgr
  5. PORT 7839
  6. DYNAMICPORTLIST 7840-7849
  7. PURGEOLDEXTRACTS ./dirdat/*, USECHECKPOINTS, MINKEEPDAYS 7
  8. LAGREPORTHOURS 1
  9. LAGINFOMINUTES 30
  10. LAGCRITICALMINUTES 45
  11. PURGEDDLHISTORY MINKEEPDAYS 3, MAXKEEPDAYS 7
  12. PURGEMARKERHISTORY MINKEEPDAYS 3, MAXKEEPDAYS 7
  13. # 启动mgr
  14. start mgr
  • 5.源端OGG pump配置
  1. # 编辑pump配置
  2. edit params pump
  3. EXTRACT pump
  4. RMTHOST %YOUR_REMOTE_OGG_IP%, MGRPORT 7839, COMPRESS
  5. PASSTHRU
  6. NUMFILES 5000
  7. RMTTRAIL ./dirdat/st
  8. DYNAMICRESOLUTION
  9. TABLE OGG_TEST.*;
  10. SEQUENCE OGG_TEST.*;
  11. # 添加投递进程,从某一个队列开始投
  12. add ext pump,exttrailsource ./dirdat/st
  13. # 备注:投递进程,每个队文件大小为200m
  14. add rmttrail ./dirdat/st,ext pump,megabytes 200
  15. # 启动pump
  16. start pump
  17. 启动后可以在目标端的dirdat目录下看到过来的trailfile
  • 6.宿端安装aliyun-odps-ogg-plugin插件
  1. #从Github克隆项目:
  2. git clone git@github.com:aliyun/aliyun-odps-ogg-plugin.git
  3. #编译并打包:
  4. cd aliyun-odps-ogg-plugin/
  5. ./build.sh
  6. 编译完成后,插件会在aliyun-odps-ogg-plugin/build_1.0.0/datahub_lib/目录下
  • 7.宿端编写插件配置文件dirprm/extdatahub.properties
  1. goldengate.userexit.writers=jvm
  2. # jvm启动参数
  3. jvm.bootoptions=-Djava.class.path=%YOUR_OGG_HOME%/ggjava/ggjava.jar -Xmx512m -Xms32m
  4. # Goldengate classpath
  5. gg.classpath=%YOUR_aliyun-odps-ogg-plugin_DIRECTORY%/build_1.0.0/datahub_lib/*
  6. # 插件名称
  7. gg.handlerlist=ggdatahub
  8. # 插件类型
  9. gg.handler.ggdatahub.type=com.aliyun.odps.ogg.handler.datahub.DatahubHandler
  10. # 报警接口自定义实现,默认实现为使用log4j记录相关日志
  11. #gg.handler.ggdatahub.alarmImplement=com.test.LogAlarm
  12. # ODPS project name
  13. gg.handler.ggdatahub.project=%YOUR_ODPS_PROJECT%
  14. # ODPS table map. ODPS表应在OGG启动前完成创建
  15. gg.handler.ggdatahub.tableMap=ogg_test.test_1/ogg_test1,ogg_test.test_2/ogg_test2
  16. # Aliyun access_id
  17. gg.handler.ggdatahub.accessID=%YOUR_ODPS_ACCESS_ID%
  18. # Aliyun access_key
  19. gg.handler.ggdatahub.accessKey=%YOUR_ODPS_ACCESS_KEY%
  20. # ODPS end point
  21. gg.handler.ggdatahub.endPoint=https://service.odps.aliyun.com/api
  22. # ODPS datahub end point
  23. gg.handler.ggdatahub.datahubEndPoint=https://dh.odps.aliyun.com
  24. # ODPS表shard个数
  25. gg.handler.ggdatahub.shardNumber=1
  26. # ODPS表hublifecycle
  27. gg.handler.ggdatahub.hubLifeCycle=7
  28. # 加载shard超时时间
  29. gg.handler.ggdatahub.shardTimeout=60
  30. # 插件缓存日指条数的最大容量
  31. gg.handler.ggdatahub.batchSize=1000
  32. # 记录插件信息的文件路径,默认是dirdat/%handler_name%_handler_info
  33. gg.handler.ggdatahub.handlerInfoFileName=dirdat/ggdatahub_handler_info
  34. # 指定Oracle字段名和相应的ODPS数据类型
  35. gg.handler.ggdatahub.keyFields=ogg_test.test_1:id/bigint|ogg_test.test_2:id/bigint
  36. # 指定Oracle要监控的字段名和相应的ODPS数据类型,插件会将"字段名_before"和"字段名_after"作为ODPS表字段,存储变化前后的变量值
  37. gg.handler.ggdatahub.focusFields=ogg_test.test_1:name/string|ogg_test.test_2:name/string
  38. # 指定Dateformat用于解析日期字段。如果不存在日期字段可以不配置
  39. gg.handler.ggdatahub.dbDateFormat=yyyy-MM-dd:HH:mm:ss
  40. # ODPS分区字段,逗号分隔
  41. gg.handler.ggdatahub.partitionFields=pt,dt
  42. # ODPS分区值,顺序应与字段顺序一直
  43. # 支持2种方式自定义分区值
  44. # 1. 固定值
  45. # 2. timestamp转义序列(使用transaction的开始时间作为timestamp)
  46. gg.handler.ggdatahub.partitionValues=p1,%y-%m-%d
  47. # 上传包的最大重试次数,默认为3
  48. gg.handler.ggdatahub.retryCount=3
  49. # 最多忽略的失败操作个数,默认为0
  50. gg.handler.ggdatahub.passFailedOperationCount=10
  51. # 记录失败操作的文件路径,默认为dirrpt/%handler_name%_bad_operations.log
  52. gg.handler.ggdatahub.failedOperationFileName=dirrpt/ggdatahub_bad_operations.log
  • 8.宿端自动根据Oracle表结构生成ODPS datahub表
  1. cd %YOUR_aliyun-odps-ogg-plugin_DIRECTORY%/datahub_handler/table_tool/
  2. java -jar ogg-odps-table-1.0.0.jar CREATE %YOUR_OGG_DIRECTORY%/dirprm/extdatahub.properties
  • 9.宿端启动extract进程从trailfile里抓取增加数据写往ODPS datahub
  1. # 编辑writer配置
  2. edit params dhwriter
  3. extract dhwriter
  4. CUSEREXIT libggjava_ue.so CUSEREXIT PASSTHRU,INCLUDEUPDATEBEFORES,PARAMS "dirprm/extdatahub.properties"
  5. sourcedefs ./dirdef/ogg_test.def
  6. table OGG_TEST.*;
  7. # 添加writer
  8. add extract dhwriter, exttrailsource ./dirdat/st
  9. # 启动writer
  10. start dhwriter

至此,全部配置结束,你在源端库做的DML操作,会在ODPS datahub表里看到对应的流水记录。譬如源端插入一条记录insert into ogg_test.test_2(id,name) values(10,’j’)几分钟后你将会在ODPS datahub表里看到类似如下的记录:

optype readtime id name_before name_after pt dt
INSERT(5) 2015-12-22 12:14:35.218 10 NULL j p1 15-12-22

四、常见问题

  • 宿端报错 libjsig.so: cannot open shared object file: No such file or directory

设置LD_LIBRARY_PATH:

  1. export LD_LIBRARY_PATH=$JRE_HOME/lib/amd64/server
  2. export shared_libraries_variable=$OGG_HOME:$shared_libraries_variable
  • 常见排查

看dirrpt目录下的系统日志,看dirdat下trailfile是否有更新,看extract进程是否running,断点调试 dirprm/extdatahub.properties:jvm.bootoptions=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=5006

五、了解更多

[插件GitHub文档] (https://github.com/aliyun/aliyun-odps-ogg-plugin/wiki)

最后更新:2016-11-24 11:23:47

  上一篇:go Fluentd MaxCompute插件__数据入云_数据集成-阿里云
  下一篇:go 产品介绍__交通行业解决方案_大数据解决方案-阿里云