DataX 实战:MySQL 读写与自定义 SQL 同步任务配置详解

1. 引言

DataX 是阿里巴巴开源的数据同步工具,支持多种异构数据源之间的高效数据迁移。本文通过三个实战案例,详细介绍如何使用 DataX 完成 MySQL 数据的读取、写入以及自定义 SQL 同步任务,帮助读者快速上手 DataX 的作业配置。

2. 环境准备

在开始之前,请确保已完成以下准备工作:

  • 已安装并配置好 DataX 运行环境,具备 Java 运行环境。
  • 本地 MySQL 服务正常运行,并准备好测试数据库和表。
  • 准备好 DataX 的作业配置文件,通常为 JSON 格式。

3. 案例一:MySQL 读取到本地(mysqlreader + streamwriter)

第一个案例演示如何从 MySQL 数据库同步抽取数据到本地,使用 mysqlreader 作为读取插件,streamwriter 作为写入插件,将数据打印到控制台。

3.1 作业配置

以下是完整的作业配置脚本:

json 复制代码
{
    "job": {
        "setting": {
            "speed": {
                "channel": 3
            },
            "errorLimit": {
                "record": 0,
                "percentage": 0.02
            }
        },
        "content": [
            {
                "reader": {
                    "name": "mysqlreader",
                    "parameter": {
                        "username": "root",
                        "password": "root",
                        "column": [
                            "id",
                            "name"
                        ],
                        "splitPk": "db_id",
                        "connection": [
                            {
                                "table": [
                                    "table"
                                ],
                                "jdbcUrl": [
                                    "jdbc:mysql://127.0.0.1:3306/database"
                                ]
                            }
                        ]
                    }
                },
                "writer": {
                    "name": "streamwriter",
                    "parameter": {
                        "print": true
                    }
                }
            }
        ]
    }
}

3.2 配置说明

下面对上述配置中的关键参数进行说明:

参数 说明
channel 并发通道数,设置为 3 表示同时使用 3 个通道并行读取数据。
errorLimit 错误记录数限制,record 为 0 表示不允许有错误记录,percentage 为 0.02 表示错误比例不超过 2%。
column 需要读取的列名列表,这里读取 id 和 name 两列。
splitPk 分片主键,用于数据分片并行读取,这里使用 db_id 作为分片键。
jdbcUrl MySQL 数据库连接地址。
print streamwriter 的打印开关,设置为 true 时会将读取到的数据打印到控制台。

3.3 运行结果

执行该作业后,DataX 会从 MySQL 的 table 表中读取 id 和 name 两列数据,并通过 streamwriter 打印到控制台。由于设置了 3 个并发通道,读取速度会有所提升。

4. 案例二:自定义 SQL 同步任务(mysqlreader + streamwriter)

第二个案例演示如何通过自定义 SQL 语句从 MySQL 同步数据到本地,使用 querySql 参数代替简单的表名读取。

4.1 作业配置

以下是使用自定义 SQL 的作业配置脚本:

json 复制代码
{
    "job": {
        "setting": {
            "speed": {
                "channel": 1
            }
        },
        "content": [
            {
                "reader": {
                    "name": "mysqlreader",
                    "parameter": {
                        "username": "root",
                        "password": "root",
                        "connection": [
                            {
                                "querySql": [
                                    "select db_id,on_line_flag from db_info where db_id < 10;"
                                ],
                                "jdbcUrl": [
                                    "jdbc:mysql://bad_ip:3306/database",
                                    "jdbc:mysql://127.0.0.1:bad_port/database",
                                    "jdbc:mysql://127.0.0.1:3306/database"
                                ]
                            }
                        ]
                    }
                },
                "writer": {
                    "name": "streamwriter",
                    "parameter": {
                        "print": false,
                        "encoding": "UTF-8"
                    }
                }
            }
        ]
    }
}

4.2 配置说明

该配置与案例一的主要区别在于使用了 querySql 参数,直接指定查询语句来读取数据。需要注意以下几点:

  • querySql:自定义查询语句,可以灵活筛选需要同步的数据,这里查询 db_id 小于 10 的记录。
  • jdbcUrl 多地址:配置了多个 JDBC 地址,DataX 会依次尝试连接,直到成功为止。示例中前两个地址是故意配置的错误地址,用于演示容错机制。
  • encoding:streamwriter 的输出编码,设置为 UTF-8。
  • print:设置为 false,表示不打印数据到控制台。

4.3 运行结果

执行该作业后,DataX 会通过自定义 SQL 查询 db_info 表中 db_id 小于 10 的记录,并将结果输出。由于配置了多个 JDBC 地址,DataX 会跳过不可用的地址,最终连接到有效的数据库。

5. 案例三:内存数据写入 MySQL(streamreader + mysqlwriter)

第三个案例演示反向操作,即从内存产生数据并写入 MySQL 数据库,使用 streamreader 作为读取插件,mysqlwriter 作为写入插件。

5.1 作业配置

以下是完整的作业配置脚本:

json 复制代码
{
    "job": {
        "setting": {
            "speed": {
                "channel": 1
            }
        },
        "content": [
            {
                "reader": {
                    "name": "streamreader",
                    "parameter": {
                        "column": [
                            {
                                "value": "DataX",
                                "type": "string"
                            },
                            {
                                "value": 19880808,
                                "type": "long"
                            },
                            {
                                "value": "1988-08-08 08:08:08",
                                "type": "date"
                            },
                            {
                                "value": true,
                                "type": "bool"
                            },
                            {
                                "value": "test",
                                "type": "bytes"
                            }
                        ],
                        "sliceRecordCount": 1000
                    }
                },
                "writer": {
                    "name": "mysqlwriter",
                    "parameter": {
                        "writeMode": "insert",
                        "username": "root",
                        "password": "root",
                        "column": [
                            "id",
                            "name"
                        ],
                        "session": [
                            "set session sql_mode='ANSI'"
                        ],
                        "preSql": [
                            "delete from test"
                        ],
                        "connection": [
                            {
                                "jdbcUrl": "jdbc:mysql://127.0.0.1:3306/datax?useUnicode=true&characterEncoding=gbk",
                                "table": [
                                    "test"
                                ]
                            }
                        ]
                    }
                }
            }
        ]
    }
}

5.2 配置说明

下面对该配置中的关键参数进行说明:

参数 说明
streamreader.column 定义内存中生成的数据列,包括字符串、长整型、日期、布尔值和字节数组等类型。
sliceRecordCount 每个分片生成的记录数,这里设置为 1000,表示生成 1000 条记录。
writeMode 写入模式,设置为 insert 表示插入数据。
session 执行前设置的会话参数,这里设置 sql_mode 为 ANSI。
preSql 写入前执行的 SQL 语句,这里先删除 test 表中的数据。
jdbcUrl 目标数据库连接地址,注意 URL 中的参数需要使用转义字符。

5.3 运行结果

执行该作业后,DataX 会在内存中生成 1000 条测试数据,并在写入前清空 test 表,然后将数据插入到 MySQL 的 test 表中。

6. 总结

本文通过三个实战案例,详细介绍了 DataX 在 MySQL 数据同步中的典型用法:

  • MySQL 读取到本地:使用 mysqlreader 和 streamwriter 实现数据抽取与打印。
  • 自定义 SQL 同步:通过 querySql 灵活筛选数据,并演示了多 JDBC 地址的容错机制。
  • 内存数据写入 MySQL:使用 streamreader 生成测试数据,通过 mysqlwriter 写入数据库。

掌握这些基础配置后,读者可以根据实际业务需求,灵活组合 DataX 的各种插件,构建高效可靠的数据同步管道。

相关推荐
zhangjin12224 个月前
DataX从入门到精通 第1课 ETL之DataX 安装DataX
数据仓库·etl·datax·datax安装教程
zhangjin12224 个月前
DataX从入门到精通 第2课 ETL之DataX 安装datax-web
数据仓库·etl·datax·datax-web·datax-web安装教程
zhangjin12224 个月前
DataX从入门到精通 第3课 ETL之DataX datax-web单表数据同步
数据仓库·etl·datax·datax-web·datax单表同步
RestCloud6 个月前
2026年企业级ETL工具选型指南:从开源DataX到商业化ETLCloud的演进
数据仓库·开源·etl·datax·数据处理·数据集成·数据传输
SeaTunnel8 个月前
六大主流数据同步工具全面对比:DataX、Airbyte、Canal、Debezium、Fivetran 与 Apache SeaTunnel
大数据·数据库·apache·debezium·datax·seatunnel
丁丁丁梦涛8 个月前
DataX同步数据
datax·datax数据表同步·数据表同步
Slow菜鸟1 年前
数据迁移工具之 DataX + DataX-Web(windows)
datax
请提交用户昵称1 年前
大数据各组件flume,datax,presto,DolphinScheduler,findBI在大数据数仓架构中的作用和功能。
大数据·flume·datax·dolphin·presto·findbi·大数据组件
程序员瓜叔1 年前
window10本地运行datax与datax-web
数据库·datax