暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

IT那活儿 2022-07-20
2760

点击上方“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那活儿”公众号

文章转载自IT那活儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论