资讯专栏INFORMATION COLUMN

使用dataX批量从ob迁移表到oracle

IT那活儿 / 2925人阅读
使用dataX批量从ob迁移表到oracle

点击上方“IT那活儿”公众号,关注后了解更多内容,不管IT什么活儿,干就完了!!!


  

某核心系统业务部分业务迁移到国产数据库OceanBase,但是历史数据仍然需要迁移到Oracle数据库,对数据实时性要求不高,只需要清理前完成1个月的数据迁移即可 。

开始一段时间使用的是OMS迁移,但是OMS迁移不支持单个分区的迁移,只能全表迁移,数据量较大,迁移时间较长。并且后续还有业务迁移到国产数据库OceanBase需要备份,所以考虑使用dataX迁移数据


DataX

1.1 DataX简介

DataX 是阿里巴巴集团内被广泛使用的离线数据同步工具,致力于实现包括:关系型数据库(MySQL、Oracle等)、HDFS、Hive、HBase、ODPS、FTP等各种异构数据源之间稳定高效的数据同步功能。

为了解决异构数据源同步问题,DataX将复杂的网状的同步链路变成了星型数据链路,DataX作为中间传输载体负责连接各种数据源。当需要接入一个新的数据源的时候,只需要将此数据源对接到DataX,便能跟已有的数据源做到无缝数据同步。
1.2 DataX 3.0 框架

DataX本身作为离线数据同步框架,采用Framework + plugin架构构建。

将数据源读取和写入抽象成为Reader/Writer插件,纳入到整个同步框架中,比较简洁。

  • Reader:Reader为数据采集模块,负责采集数据源的数据,将数据发送给Framework。

  • Writer:Writer为数据写入模块,负责不断向Framework取数据,并将数据写入到目的端。

  • Framework:Framework用于连接reader和writer,作为两者的数据传输通道,并处理缓冲,流控,并发,数据转换等核心技术问题。

datax的使用

2.1 在Oracle创建目标表的表结构
datax同步数据需要先在目标端创建相应的表结构。
在这里是使用的OMS直接从OB迁移表结构到Oracle。
2.2 创建配置文件(json格式)
Datax的基本执行语句为:
python  {DATAX_HOME}/bin/datax.py  {JSON_FILE_NAME}.json
每个任务的参数文件是一个 json 格式,主要由setting和一个 reader 和一个 writer 组成。
批量配置json为:
{
  "job": {
    "setting": {
      "speed": {
        "channel": 100,
    "bytes":0
      },
      "errorLimit": {
     "record":"",
       "percentage":
      }
    },
    "content": [
      {
        "reader": {
          "name": "oceanbasev10reader",
          "parameter": {
            "username": "",
            "password": "",
            "column": [
              "*"
            ],
            "connection": [
              {
                           "jdbcUrl":[ ""],
                            "querySql": [
                                           "select * from ${readTb} PARTITION(${readpartition}) "
                 ]
              }
            ],
            "batchSize": 1024
          }
        },
        "writer": {
          "name": "oraclewriter",
          "parameter": {
            "where": "",
            "column": ["*"],
            "preSql": [],
            "connection": [
              {
                                "jdbcUrl": "",
                                "table": ["${writeTb}"]
              }
            ],
            "username": "",
            "password": ""
          }
        }
      }
    ]
  }
}
  • channel表示任务并发数。
  • record:  出错记录数超过record设置的条数时,任务标记为失败.
  • percentage: 当出错记录数超过percentage百分数时,任务标记为失败.
  • bytes表示每秒字节数,默认为0(不限速)。
2.3 ${readTb} json文件中表示变量,传输时使用-D参数进行设置.
单个表同步:
python /home/admin/tools/datax3/bin/datax.py 
/home/admin/ob_ss/ob_to_ora_ss_tbcs5.json -p"-DreadTb=table1
-Dreadpartition=partition1 -DwriteTb=table1 "
同步完成后,job相关信息:
2.4 批量执行脚本
#!/bin/bash

v_table_list=/home/admin/ob_ss/source_table.lst
v_exec_command=/home/admin/tools/datax3/bin/datax.py
v_path_json=/home/admin/ob_ss/ob_to_ora_ss_tbcs5.json
v_path_log=/home/admin/ob_ss/log/

#从table_name.txt获取表名、分区
for table_name in `cat $v_table_list`
Do
v_source_table_name1=`echo $table_name|awk -F ":" {print $1}`
v_source_table_partition=`echo $table_name|awk -F ":" {print $2}`
v_target_table_name=`echo $table_name|awk -F ":" {print $1}|awk -F "." {print $2}`
$v_exec_command --loglevel=info -p "
-DreadTb=${v_source_table_name1} 
-Dreadpartition=${v_source_table_partition} 
-DwriteTb=${v_target_table_name} 
"
 $v_path_json  >> "$v_path_log"$v_source_table_name1"_"$v_source_table_partition".log



DataX的并发参数

Json配置文件读写数据有两种模式:

  • 一种是table模式;
  • 一种是querySql模式.
因为channel参数的实现是通过生成多个SQL语句实现的,所以 channel生效仅在能够split出多个SQL语句的场景下,也就是table模式+spliPk下有用。
在table模式下, channel个数决定了reader和writer的个数上限,假设为m个:如果指定了splitPk字段,DataX会将mysql表中数据按照splitPk切分成n段,n大致为5倍的channel个数。
splitPk的字段限制了必须是整型或者字符串类型。由于DataX的实现方式是按照spliPk字段分段查询数据库表,那么spliPk字段的选取应该尽可能的选择分布均匀且有索引的字段,比如主键id、唯一键等字段。
DataX会启动m个reader线程,消费DataX切分好的n个查询sql语句(task), 对应的会有m个writer线程将查询出来的数据写入目标数据源中,并行度为m(也就是配置的channel个数),如果不指定splitPk字段,DataX将不会进行数据的切分,并行度直接退化成1。
需要指出的是,oceanbasev10readerplitPk的字段限制了必须是整型


遇到的问题

  • 原因:TBCS.SYS_C0038005是全局索引,当在json的preSql设置”alter table **  truncate partition **” 时导致索引失效。
  • 解决办法:rebuild重建索引,preSql设置” truncate  table  **”.

文章结语:dataX的总体使用相对比较简单,作为数据同步框架,将不同数据源的同步抽象为从源头数据源读取数据的 Reader 插件,以及向目标端写入数据的 Writer 插件,只要有相应的读写插件理论上 DataX 框架可以支持任意数据源类型的数据同步工作

比较麻烦的是如何尽可能的提高同步的效率,虽然提供了 channel并发参数,但对于表本身的结构和数据要求比较高,并不是所有的表都能满足channel的条件。另外由于表结构需要事先建立,对于批量的同步和表结构变更的情况,支持性差。

本文作者:张振浩(上海新炬王翦团队)

本文来源:“IT那活儿”公众号

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/129386.html

相关文章

  • DataX在有赞大数据平台的实践

    摘要:与大数据体系交互上报运行统计数据自带了运行结果的统计数据,我们希望把这些统计数据上报到元数据系统,作为的过程元数据存储下来。基于我们的开发策略,不要把有赞元数据系统的嵌入源码,而是在之外获取,截取出打印的统计信息再上报。一、需求 有赞大数据技术应用的早期,我们使用 Sqoop 作为数据同步工具,满足了 MySQL 与 Hive 之间数据同步的日常开发需求。 随着公司业务发展,数据同步的场景越...

    JerryWangSAP 评论0 收藏0
  • Oceanbase新版本复合分区添加分区操作

    Oceanbase新版本复合分区添加分区操作 img{ display:block; margin:0 auto !important; width:100%; } body{ width:75%; ...

    不知名网友 评论0 收藏2700
  • 表到里学习JVM实现

    在社会化分工、软件行业细分专业化的趋势下,会真的参与到底层系统实现的人肯定是越来越少(比例上说)。真的会参与到JVM实现的人肯定是少数。 但如果您对JVM是如何实现的有兴趣、充满好奇,却苦于没有足够系统的知识去深入,那么可以参考RednaxelaFX整理的这个书单。 showImg(http://segmentfault.com/img/bVbGzn); 本豆列的脉络是:    1. JV...

    Cristic 评论0 收藏0
  • SparkSQL 在有赞的实践

    摘要:在有赞的技术演进。业务数据量正在不断增大,这些任务会影响业务对外服务的承诺。监控需要收集上执行的的审计信息,包括提交者执行的具体,开始结束时间,执行完成状态。还有一点是详细介绍了的原理,实践中设置了的比默认的减少了以上的时间。 前言 有赞数据平台从2017年上半年开始,逐步使用 SparkSQL 替代 Hive 执行离线任务,目前 SparkSQL 每天的运行作业数量5000个,占离线...

    hzx 评论0 收藏0

发表评论

0条评论

IT那活儿

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<