乐趣区

关于mysql:Alibaba-数据库迁移开源工具-Datax-安装和使用

起因

事件是这样的,服务商有一批数据,当初的数据量大抵为 2 千万条(单表),每天都会减少数据(减少多少暂不晓得),然而呢给咱们提供的查问不是一张数据表而是一张视图,咱们再依据这个数据对外提供一个查问服务。因为是视图查问的时候就比较慢,咱们也没有权限进行表的优化,所以就须要将数据同步到咱们本地数据库,在本地进行数据表的优化(加索引等等的),然而数据量是 2 千万多,就须要一个工具来把远端数据同步到本地,而后在 github 上发现了 Datax,就依照文档

依赖关系

  • Linux
  • JDK(1.8 以上,举荐 1.8)
  • Python(2 或 3 都能够)

jdk 装置

JDK1.8 华为镜像下载地址

解压重命名

解压重名为 java1.8 并挪动到 /usr/local 目录下 /usr/local/java1.8

运行环境配置

vim ~/.bashrc


# 写入一下内容
export JAVA_HOME=/usr/local/java1.8
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH

# 执行 source
source ~/.bashrc

# 查看版本
java -version

java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)

Python 装置

Python 在 Ubuntu 零碎上曾经默认装置了,能够应用命令 python -Vpython3 -V 查看以后版本。

能够应用命令 apt install python3 装置 Python3。也能够本人应用编译的形式装置。

datax 装置

DataX Github 地址

Datax 下载地址

能够间接下载工具包,不须要再编译装置,能够间接应用。

验证是否装置胜利

输出

python3 /usr/local/datax/bin/datax.py /usr/local/datax/job/job.json

输入

2022-11-21 14:05:28.828 [job-0] INFO  JobContainer - PerfTrace not enable!
2022-11-21 14:05:28.829 [job-0] INFO  StandAloneJobContainerCommunicator - Total 100000 records, 2600000 bytes | Speed 261.91KB/s, 20000 records/s | Error 0 records, 0 bytes |  All Task WaitWriterTime 0.070s |  All Task WaitReaderTime 0.068s | Percentage 100.00%
2022-11-21 14:05:28.829 [job-0] INFO  JobContainer - 
工作启动时刻                    : 2022-11-21 14:05:18
工作完结时刻                    : 2022-11-21 14:05:28
工作总计耗时                    :                 10s
工作均匀流量                    :          253.91KB/s
记录写入速度                    :          10000rec/s
读出记录总数                    :              100000
读写失败总数                    :                   0

job.json 文件解析

{
    "job": {
        "content": [
            {
                "reader": {
                    "name": "mysqlreader",# 读端,这个 name 不能 streamreader 会报错的
                    "parameter": {
                        "username": "",# 用户"password":"",# 明码
                        "connection": [
                            {"jdbcUrl": [],# 连贯信息,貌似能够连贯多个数据库,没有进行测试
                                "table": []# 数据表}
                        ], 
                        "column": ["*"],# 须要同步的列 (* 示意所有的列)
                        "where": "id >= 500000 and id < 500100"# 形容筛选条件,多个表时不实用
                    }
                }, 
                "writer": {
                    "name": "mysqlwriter",# 写端
                    "parameter": {
                        "username": "",# 账号"password":"", # 明码
                        "writeMode": "insert",# 操作类型,可选:【insert | replace | update】"connection": [
                            {"jdbcUrl": "", # 连贯信息,这个连贯信息最好是这样写,否则会出错"table": []# 数据表
                            }
                        ], 
                        "column": ["*"],# 须要同步的列,要和 reader 中的字段统一
                        "preSql": [],# 同步前操作,是 sql 语句
                        "postSql": [],# 同后前操作,是 sql 语句
                        "session": [] # 设置 session,是 sql 语句}
                }
            }
        ], 
        "setting": {
            "speed": {"channel": 1 # 指定并发数,目前不晓得什么作用,有晓得的能够告知下}
        }
    }
}

job.json 示例

{
    "job": {
        "content": [
            {
                "reader": {
                    "name": "mysqlreader",
                    "parameter": {
                        "username": "datax2",
                        "password": "datax2",
                        "connection": [
                            {
                                "jdbcUrl": ["jdbc:mysql://192.168.0.174:3306/datax2?useUnicode=true&characterEncoding=utf8"],
                                "table": ["user"]
                            }
                        ],
                        "column": ["*"]
                    }
                },
                "writer": {
                    "name": "mysqlwriter",
                    "parameter": {
                        "username": "datax",
                        "password": "datax",
                        "writeMode": "insert",
                        "connection": [
                            {
                                "jdbcUrl": "jdbc:mysql://192.168.0.174:3306/datax?useUnicode=true&characterEncoding=utf8",
                                "table": ["user"]
                            }
                        ],
                        "column": ["*"]
                    }
                }
            }
        ],
        "setting": {
            "speed": {"channel": 2}
        }
    }
}

增量同步倡议

对于增量同步数据,倡议每张表有独自的 job.json 配置文件,记录上次同步的最大的 ID,在 reader.where 进行判断 id > last_max_sync_id
where 示例,实用于单表的状况:

{
    "parameter": {"where": "id > last_max_sync_id"}
}

针对失败数据的解决形式

Datax 在同步过程中,失败的数据会写入到 /datax/log/ 文件中,并认定为 脏数据 ,能够从日志 脏数据 中抽离出失败数据的内容组成 sql 语句,或者找出 主键 ID 再去查问同步。

失败数据日志内容如下:

2022-11-22 09:52:50.696 [0-0-0-writer] ERROR StdoutPluginCollector - 脏数据: 
{
    "exception":"Incorrect integer value:'inno'for column'id'at row 1",
    "record":[
        {
            "byteSize":8,
            "index":0,
            "rawData":"inno",
            "type":"STRING"
        },
        {
            "byteSize":32,
            "index":1,
            "rawData":"9ddfaac20670c9sda5s1d5a587fc40f104",
            "type":"STRING"
        },
        {
            "byteSize":14,
            "index":2,
            "rawData":"手持设施调用",
            "type":"STRING"
        },
        {
            "byteSize":4,
            "index":3,
            "rawData":9243,
            "type":"LONG"
        },
        {
            "byteSize":3,
            "index":4,
            "rawData":441,
            "type":"LONG"
        },
        {
            "byteSize":5,
            "index":5,
            "rawData":"admin",
            "type":"STRING"
        },
        {
            "byteSize":32,
            "index":6,
            "rawData":"49b1d2b5ds1d5a1s1d5a7414890ad2",
            "type":"STRING"
        },
        {
            "byteSize":1,
            "index":7,
            "rawData":1,
            "type":"LONG"
        },
        {
            "byteSize":61,
            "index":8,
            "rawData":"[[\"app_id\", \"=\", \"yuan\"], [\"id_name\", \"like\", \"% 天华 %\"]]",
            "type":"STRING"
        },
        {
            "byteSize":127,
            "index":9,
            "rawData":"SELECT COUNT(*) AS count FROM `device_request_history` WHERE  `app_id` ='yuan'AND `id_name` LIKE'% 天华 %'LIMIT 1",
            "type":"STRING"
        },
        {
            "byteSize":8,
            "index":10,
            "rawData":1668575331000,
            "type":"DATE"
        }
    ],
    "type":"writer"
}

对于读取视图数据到本地的形式

视图读取问题

Datax 能够从 reader 中读取视图数据,然而无奈读取 writer 中的视图数据结构元信息,为了确保数据可能同步胜利,须要先校验数据表构造一致性,Datax 须要判断写入目标表的数据结构是否和读取源数据表的构造统一。

针对视图读取问题解决计划

能够在目标数据库中新建数据表,新建数据表的构造和源数据视图的构造统一,这样 Datax 在校验数据表构造和视图构造一致性时就能够通过。

20000000 条数据实测案例

同步计划

为了不便测试,将 2 千万条数据依照 10 次进行同步(依照本人的理论状况来,能够一次性进行同步)。

计划划分

id > 0 and id <= 2000000
id > 2000000 and id <= 4000000
id > 4000000 and id <= 6000000
id > 6000000 and id <= 8000000
id > 8000000 and id <= 10000000
id > 10000000 and id <= 12000000
id > 12000000 and id <= 14000000
id > 14000000 and id <= 16000000
id > 16000000 and id <= 18000000
id > 18000000 and id <= 20000000

id > 0 and id <= 2000000

这个 id 之间数据有断层。短少 144 条数据。

2022-11-23 14:58:06.418 [job-0] INFO  JobContainer -
工作启动时刻                    : 2022-11-23 14:53:34
工作完结时刻                    : 2022-11-23 14:58:06
工作总计耗时                    :                271s
工作均匀流量                    :            1.28MB/s
记录写入速度                    :           7406rec/s
读出记录总数                    :             1999856
读写失败总数                    :                   0

id > 2000000 and id <= 4000000

2022-11-23 15:03:39.879 [job-0] INFO  JobContainer -
工作启动时刻                    : 2022-11-23 14:59:08
工作完结时刻                    : 2022-11-23 15:03:39
工作总计耗时                    :                271s
工作均匀流量                    :            1.28MB/s
记录写入速度                    :           7407rec/s
读出记录总数                    :             2000000
读写失败总数                    :                   0

id > 4000000 and id <= 6000000

这个 id 之间数据有断层。短少 13 条数据。

2022-11-23 15:09:38.418 [job-0] INFO  JobContainer -
工作启动时刻                    : 2022-11-23 15:04:56
工作完结时刻                    : 2022-11-23 15:09:38
工作总计耗时                    :                282s
工作均匀流量                    :            1.24MB/s
记录写入速度                    :           7142rec/s
读出记录总数                    :             1999987
读写失败总数                    :                   0

id > 6000000 and id <= 8000000

2022-11-23 15:17:05.814 [job-0] INFO  JobContainer -
工作启动时刻                    : 2022-11-23 15:12:14
工作完结时刻                    : 2022-11-23 15:17:05
工作总计耗时                    :                291s
工作均匀流量                    :            1.19MB/s
记录写入速度                    :           6896rec/s
读出记录总数                    :             2000000
读写失败总数                    :                   0

id > 8000000 and id <= 10000000

2022-11-23 15:22:41.729 [job-0] INFO  JobContainer -
工作启动时刻                    : 2022-11-23 15:17:30
工作完结时刻                    : 2022-11-23 15:22:41
工作总计耗时                    :                311s
工作均匀流量                    :            1.12MB/s
记录写入速度                    :           6451rec/s
读出记录总数                    :             2000000
读写失败总数                    :                   0

id > 10000000 and id <= 12000000

这个 id 之间数据有断层。短少 462 条数据。

2022-11-23 15:29:08.710 [job-0] INFO  JobContainer -
工作启动时刻                    : 2022-11-23 15:23:56
工作完结时刻                    : 2022-11-23 15:29:08
工作总计耗时                    :                311s
工作均匀流量                    :            1.12MB/s
记录写入速度                    :           6450rec/s
读出记录总数                    :             1999538
读写失败总数                    :                   0

id > 12000000 and id <= 14000000

2022-11-23 15:34:23.699 [job-0] INFO  JobContainer -
工作启动时刻                    : 2022-11-23 15:29:42
工作完结时刻                    : 2022-11-23 15:34:23
工作总计耗时                    :                281s
工作均匀流量                    :            1.24MB/s
记录写入速度                    :           7142rec/s
读出记录总数                    :             2000000
读写失败总数                    :                   0

id > 14000000 and id <= 16000000

2022-11-23 15:39:16.394 [job-0] INFO  JobContainer -
工作启动时刻                    : 2022-11-23 15:34:54
工作完结时刻                    : 2022-11-23 15:39:16
工作总计耗时                    :                261s
工作均匀流量                    :            1.33MB/s
记录写入速度                    :           7692rec/s
读出记录总数                    :             2000000
读写失败总数                    :                   0

id > 16000000 and id <= 18000000

2022-11-23 15:45:19.011 [job-0] INFO  JobContainer -
工作启动时刻                    : 2022-11-23 15:40:07
工作完结时刻                    : 2022-11-23 15:45:19
工作总计耗时                    :                311s
工作均匀流量                    :            1.12MB/s
记录写入速度                    :           6451rec/s
读出记录总数                    :             2000000
读写失败总数                    :                   0

id > 18000000 and id <= 20000000

2022-11-23 15:51:07.983 [job-0] INFO  JobContainer -
工作启动时刻                    : 2022-11-23 15:45:56
工作完结时刻                    : 2022-11-23 15:51:07
工作总计耗时                    :                311s
工作均匀流量                    :            1.09MB/s
记录写入速度                    :           6276rec/s
读出记录总数                    :             1945569
读写失败总数                    :                   0
退出移动版