项目背景,公司需要把老系统的数据迁移到新系统上,老系统使用了很多年了,历史数据比较多,又不能丢掉。新系统和老系统数据库结构和系统架构不一致,因此需要进去数据迁移。
之前做数据迁移用过Kettle,后面有时间写一期kettle数据迁移的教程。相对来说单纯的数据迁移DATAX效率较高,使用起来方便一点。
dataX是阿里开源的离线数据库同步工具 (支持国产开源),实现了包括 MySQL、Oracle、OceanBase、SqlServer、Postgre、HDFS、Hive、ADS、HBase、TableStore(OTS)、MaxCompute(ODPS)、Hologres、DRDS 等各种异构数据源之间高效的数据同步功能。
DataX本身作为数据同步框架,将不同数据源的同步抽象为从源头数据源读取数据的Reader插件,以及向目标端写入数据的Writer插件,理论上DataX框架可以支持任意数据源类型的数据同步工作。同时DataX插件体系作为一套生态系统, 每接入一套新数据源该新加入的数据源即可实现和现有的数据源互通。这一点理解起来很简单,一个输入口,一个输出口,可以独立匹配不同的数据读取和写入。
github地址:https://github.com/alibaba/DataX。这里有源码和文档。
官方下载地址:DataX下载地址
官方指南,里面有下载和安装使用DataX/userGuid.md at master · alibaba/DataX · GitHub
运行环境:
Linux JDK(1.8以上,推荐1.8) Python(2或3都可以) Apache Maven 3.x (Compile DataX)
官方文档里面有详细的安装过程,写的很清楚,我就不多说了。
安装完成之后着重说明一下迁移脚本
oracle-oracle数据库迁移脚本示例:
1、采用querySql方式,当数据库结构有差异的时候。
{ "job": { "setting": { "speed": { // channel 表示通道数量,byte表示通道速度,如果单通道速度1MB,配置byte为1048576表示一个channel "channel": 1 //设置传输速度 byte/s 尽量逼近这个速度但是不高于它,可以不写 // "byte": 1048576 } }, "content": [ { //读取部分脚本 "reader": { "name": "oraclereader", "parameter": { //数据库用户名密码 "username": "root", "password": "root", //如果采用sql查询的话,就不需要写where条件了 "where": "", "connection": [ { //写一个完整的查询sql,要注意查询出来的字段要和后面的写入字段一一对应。 "querySql": [ "SELECT ROWID AS XSELSH, JDJGDM AS JKJGDM , JDJGMC AS JKJGMC , JDRQ AS JKRQ , JDRYGH AS JKRYGH , JDRYXM AS JKRYXM , GRDAID AS GRDAID , EMPI AS EMPI , XM AS XM , XBDM AS XBDM , CSRQ AS CSRQ , ZJLXDM AS ZJLXDM , ZJHM AS ZJHM GLXQDM AS GLXQDM FROM gr_jbxx" ], //jdbc连接信息 "jdbcUrl": [ "jdbc:oracle:thin:@10.127.0.0:2021:orcl" ] } ] } }, //写入部分脚本 "writer": { "name": "oraclewriter", "parameter": { //数据库用户名密码 "username": "root", "password": "root", //写入数据库的对应字段,如果不需要指定字段,删除column节点 "column": [ "XSELSH" , "JKJGDM" , "JKJGMC" , "JKRQ" , "JKRYGH" , "JKRYXM" , "GRDAID" , "EMPI" , "XM" , "XBDM" , "CSRQ" , "ZJLXDM" , "ZJHM" , ], "connection": [ { "jdbcUrl": "jdbc:oracle:thin:@10.127.0.1:2022:orcl", //指定写入table "table": [ "ht_rhat" ] } ] } } } ] } }
2、采用table读取方式,当数据库结构差异不大时。
{ "job": { "setting": { "speed": { //设置传输速度 byte/s 尽量逼近这个速度但是不高于它. // channel 表示通道数量,byte表示通道速度,如果单通道速度1MB,配置byte为1048576表示一个channel "byte": 1048576, "channel": 4 }, }, "content": [ { "reader": { "name": "oraclereader", "parameter": { // 数据库连接用户名 "username": "root", // 数据库连接密码 "password": "root", "column": [ //读取指定字段,如果不需要指定字段,删除column节点 "id","name" ], //切分主键,通过该字段分片处理table,配合channel使用 "splitPk": "db_id", "connection": [ { "table": [ "user" ], "jdbcUrl": [ "jdbc:oracle:thin:@[HOST_NAME]:PORT:[DATABASE_NAME]" ] } ] } }, //写入部分脚本 "writer": { "name": "oraclewriter", "parameter": { //数据库用户名密码 "username": "root", "password": "root", //写入数据库的对应字段,如果不需要指定字段,删除column节点 "column": [ "id" , "name" , ], "connection": [ { "jdbcUrl": "jdbc:oracle:thin:@10.127.0.1:2022:orcl", //指定写入table "table": [ "user" ] } ] } } } ] } }
目前OracleReader支持大部分Oracle类型,但也存在部分个别类型没有支持的情况,请注意检查你的类型。暂时只支持一下类型,其他类型需要先对数据库进行处理,转换成能够支持的类型之后才能进行迁移工作。
Oracle 数据类型 | DataX 内部类型 |
---|---|
NUMBER,INTEGER,INT,SMALLINT | Long |
NUMERIC,DECIMAL,FLOAT,DOUBLE PRECISION,REAL | Double |
LONG,CHAR,NCHAR,VARCHAR,VARCHAR2,NVARCHAR2,CLOB,NCLOB,CHARACTER,CHARACTER VARYING,CHAR VARYING,NATIONAL CHARACTER,NATIONAL CHAR,NATIONAL CHARACTER VARYING,NATIONAL CHAR VARYING,NCHAR VARYING | String |
TIMESTAMP,DATE | Date |
bit, bool | Boolean |
BLOB,BFILE,RAW,LONG RAW | Bytes |