MySQL 数据源为您提供读取和写入 MySQL 的双向通道数据集成能力,实现不同数据源与 MySQL 之间进行数据传输。本文为您介绍 DataSail 的 MySQL 数据同步的能力支持情况。
:::tip
火山引擎 VeDB-MySQL 数据库与 MySQL 数据源配置基本一致,您可参考本文进行 VeDB 数据源任务的配置操作。
:::
已完成 MySQL 数据源配置操作,详见配置 MySQL 数据源。
DataSail 提供独立的解决方案入口,专门用于实时整库同步场景。该入口与第 3 章的单表任务配置流程完全不同,支持全增量一体化同步,适合将 MySQL 整库实时同步至 LAS、Doris、StarRocks、ByteHouse、Elasticsearch、Hudi、Paimon 等目标数据源。
进入 DataSail 控制台,在左侧导航栏选择 数据同步方案,单击 新建数据同步解决方案 > 实时整库同步,按以下步骤完成配置:
| | | | \
| 参数名 | 默认值 | 说明 |
|---|---|---|
| job.reader.poll_interval_ms | 500 | Binlog 刷新间隔(毫秒),调小可提高实时性 |
| job.reader.debezium | 无 | Debezium 配置,如忽略不可解析的 DDL |
| job.common.checkpoint_interval | 900000 | Checkpoint 刷新时间(毫秒) |
| job.common.is_use_batch_mode | true | true 为 Flink batch 模式(资源有限时推荐);false 为 pipeline 模式(大数据量时读写同时进行) |
| job.reader.reader_parallelism_num | 自动推算 | 读并发数,默认根据数据量大小自动推算 |
| job.writer.writer_parallelism_num | 自动推算 | 写并发数,默认根据数据量大小自动推算 |
方案提交执行后,可在方案列表中进行以下运维操作:
完整的解决方案配置指南请参见实时整库同步(新版)。
本章介绍通过数据集成入口创建的单表离线/流式同步任务的配置方式。
MySQL 数据源测试连通性成功后,进入到数据开发界面,开始新建 MySQL 相关通道任务。
新建任务方式详见离线数据同步、流式数据同步。
任务创建成功后,您可根据实际场景,配置MySQL 批式读、MySQL 批式写或 MySQL 流式写等通道任务。
数据来源选择 MySQL,并完成以下相关参数配置。其中参数名称前带 * 的为必填参数,名称前未带 * 的为可选填参数。
| | | \
参数 |
说明 |
|---|---|
| *数据源类型 | 下拉选择 MySQL 数据源类型。 |
| *数据源名称 | 已在数据源管理中注册成功的 MySQL 数据源,下拉可选。若还未建立相应数据源,可单击数据源管理按钮,前往创建 MySQL 数据源。 |
| *数据表 | 选择需要采集的数据表信息,您可同时选择多个 Schema 相同的表进行数据同步,支持区间表达式“table_[0-99]”和时间表达式“table_${date}”方式,来快速配置选择多个表。 |
| 分库分表 | MySQL 支持分库分表形式读取,单击添加分库分表按钮,进行分库分表添加,在下拉框中选择分库数据源与具体分表名称信息,支持添加多个分库分表。 |
| :::tip | |
| 配置分库分表,需要所有表的 Schema 信息必须保持一致,否则任务会执行异常。 | |
| ::: | |
| 数据过滤 | 支持您将需要同步的数据进行筛选条件设置,只同步符合过滤条件的数据,可直接填写关键词 where 后的过滤 SQL 语句,例如:create_time > '${date}',不需要填写 where 关键字。 |
| :::tip | |
| 该过滤语句通常用作增量同步,暂时不支持 limit 关键字过滤,其 SQL 语法需要和选择的数据源类型对应。 | |
| ::: | |
| 切分键 | 根据配置的字段进行数据分片,建议使用主键或有索引的列作为切分键: |
| * 如果表没有主键或者索引列,可以不配置该字段,同步任务不会进行分片,并以单并发的方式同步所有的数据; | |
| * 建议使用主键或有索引的列作为切分键,切分键配置没有索引的列同步任务会比较慢; | |
| :::tip | |
| 目前仅支持类型为整型或字符串的字段作为切分键。 | |
| ::: |

数据目标端选择 MySQL,并完成以下相关参数配置。其中参数名称前带 * 的为必填参数,名称前未带 * 的为可选填参数。
| | | \
参数 |
说明 |
|---|---|
| *目标类型 | 数据去向目标类型选择 MySQL。 |
| *数据源名称 | 已在数据源管理界面注册的 MySQL 数据源,下拉可选。若还未建立相应数据源,可单击数据源管理按钮,前往创建 MySQL 数据源。 |
| *数据表 | 数据源下所属需数据写入的表名,下拉可选。 |
| 写入前准备语句 | 在执行该数据集成任务前,需要率先执行的 SQL 语句,通常是为了使任务重跑时支持幂等。 |
例如您可以通过填写语句,清空表中的某些旧数据,清空完成后,再执行集成任务写入新的数据。如删除 date='${date}' 的数据:delete from table_name where date='${date}' |
|
| 支持配置多条写入前准备语句,用英文分号 “;” 分隔即可。语句填写完成后,您可单击右侧的校验按钮,进行语句校验是否符合逻辑。 | |
| 写入后准备语句 | 执行数据同步任务之后执行的 SQL 语句。例如写入完成后插入某条特殊的数据,标志导入任务执行结束。 |
| 支持配置多条写入后准备语句,用英文分号 “;” 分隔即可。语句填写完成后,您可单击右侧的校验按钮,进行语句校验是否符合逻辑。 | |
| *数据写入方式 | 下拉选择数据写入 MySQL 的方式: |
| * insert into: 当主键/唯一性索引冲突时会无法写入冲突的行,任务会运行失败。 | |
| :::tip | |
如果希望主键/唯一索引冲突时任务正常执行可以添加高级参数: job.writer.is_insert_ignore 为 true |
|
| ::: | |
| * on duplicate key update: | |
* 当主键/唯一键索引没有冲突时,与insert into行为一致。 |
|
| * 在发生冲突时,将使用新行数据 update 表中原有的数据。 | |
| * replace into: | |
* 当主键/唯一键索引没有冲突时,与insert into行为一致。 |
|
| * 当主键/唯一键冲突时先 delete 原有行,再 insert 新行数据,即新行数据会替换原有行的所有字段数据,不建议使用,可能出现数据写入识别和产生脏数据。 | |
| *更新列设置 | 当数据写入方式选择为 on duplicate key update 方式,且出现主键/唯一键冲突时,可按需选择全部列更新或者仅部分列更新: |
| * 全部列更新:在发生冲突时,会 update 当前行中所有的列; | |
| * 部分列更新:需选择列字段信息,仅被选中的列会在主键/唯一键冲突时进行更新;未选中的列,将保持表中的原始数据,不进行更新。 |
支持可视化方式配置流式写入 MySQL 单表。MySQL Writer 通过 JDBC 远程连接 MySQL 数据库,并执行相应的 SQL 语句,将数据写入 MySQL。流式写入 MySQL 配置方式如下:

数据目标端选择 MySQL,并完成以下相关参数配置。其中参数名称前带 * 的为必填参数,名称前未带 * 的为可选填参数。
:::tip
流式写入 MySQL,默认写入方式以 Upsert 方式写入。
:::
| | | \
| 参数 | 说明 |
|---|---|
| *目标类型 | 数据去向目标类型选择 MySQL。 |
| *数据源名称 | 已在数据源管理界面注册的 MySQL 数据源,下拉可选。若还未建立相应数据源,可单击数据源管理按钮,前往创建 MySQL 数据源。 |
| *数据表 | 数据源下所属需数据写入的表名,下拉可选。 |
数据来源和目标端配置完成后,需要指定来源和目标端的字段映射关系,根据字段映射关系,数据集成任务将源端字段中的数据,写入到目标端对应字段中。
字段映射支持选择基础模式和转换模式配置映射:
:::warning
基础模式和转换模式不支持互相切换,模式切换后,将清空现有字段映射中所有配置信息,一旦切换无法撤销,需谨慎操作。
:::
转换模式:
字段映射支持数据转换,您可根据实际业务需求进行配置,将源端采集的数据,事先通过数据转换后,以指定格式输入到目标端数据库中。
转换模式详细操作说明详见4.1 转换模式
在转换模式中,你可依次配置:来源节点、数据转换、目标节点信息:
| | | \
| 配置节点 | 说明 |
|---|---|
| 来源节点 | 配置数据来源 Source 节点信息: |
| * 节点名称:自定义输入来源节点名称信息,只允许由数字、字母、下划线、-和.组成;且长度不能超过10。 | |
| * 数据字段:通过自动添加、手动添加等方式添加数据来源字段信息。 | |
| 配置完成后,单击确认按钮,完成来源节点配置。 | |
| 数据转换 | 单击数据转换右侧添加按钮,选择 SQL 转换方式,配置转换信息和规则: |
| * 节点名称:自定义输入来源节点名称信息,只允许由数字、字母、下划线、-和.组成;且长度不能超过10。 | |
| * SQL 脚本:输入 SQL 脚本转换规则,目前仅支持添加一个转换的 SQL 语句,且不能包括 “;”。 | |
| 配置完成后,单击确认按钮,完成数据转换节点配置。SQL 脚本示例详见4.1.2 添加转换节点。 | |
| 目标节点 | 配置目标节点 Sink 信息: |
| * 节点名称:自定义输入来源节点名称信息,只允许由数字、字母、下划线、-和.组成;且长度不能超过10。 | |
| * 数据字段:通过自动添加、手动添加等方式添加数据目标字段信息。 | |
| 配置完成后,单击确认按钮,完成目标节点配置。 |
基础模式:
您可通过以下三种方式操作字段映射关系:
自动添加:单击自动添加按钮,根据两端数据表信息,可以自动填充来源和目标的字段信息。
手动添加:单击手动添加按钮,可以手动编辑来源和目标的字段信息,可以逐个添加。
:::tip
来源端字段信息支持输入数据库函数和常量配置,单击手动添加按钮,在源表字段中输入需添加的值,并选择函数或常量类型,例如:
移动\删除字段:您也可以根据需要移动字段映射顺序或删除字段。
:::tip
对于来源是分库分表形式时,会拉取配置的第一张表的元数据信息。
:::
MySQL 数据源支持使用脚本模式(DSL)的方式进行配置。
在某些复杂场景下,您可通过任务脚本的方式,按照统一的 Json 格式,编写 MySQL Reader 和 MySQL Writer 参数脚本代码,来运行数据集成任务。
以下为完整可运行的 MySQL 批式读脚本示例:
{
"version": "0.2",
"type": "batch",
"reader": {
"type": "mysql",
"datasource_id": 12345,
"parameter": {
"columns": [
{ "name": "id", "type": "BIGINT" },
{ "name": "user_name", "type": "VARCHAR" },
{ "name": "create_time", "type": "DATETIME" }
],
"filter": "create_time > '${date}'",
"split_pk": "id",
"table_name": "your_table_name"
}
},
"writer": {
"type": "hdfs",
"datasource_id": 67890,
"parameter": {
"columns": [
{ "name": "id", "type": "BIGINT" },
{ "name": "user_name", "type": "STRING" },
{ "name": "create_time", "type": "STRING" }
],
"path": "/your/hdfs/path/${date}",
"file_type": "orc",
"write_mode": "overwrite"
}
},
"common": {
"parameter": {}
}
}
Reader 参数说明,其中参数名称前带 * 的为必填参数,名称前未带 * 的为可选填参数:
| | | | \
参数名 |
描述 | 默认值 |
|---|---|---|
| *type | 数据源类型,对于 MySQL 类型,填写:MySQL | 无 |
| *datasource_id | 注册的 MySQL 数据源 ID。可以在项目控制台 > 数据源管理界面中查找。 | 无 |
| *table_name | 需要同步的数据表名称,一个数据集成任务只能同步数据到一张目标表。来源 MySQL 支持配置多表或者配置区间读取。 | \ |
| \ | ||
* 配置多表,多表间通过 , 分隔,如 table0,table1 |
\ | |
| * 区间读取配置说明: | \ | |
| * table_[0-99] 代表将 table_0、table_1、直到 table_99 共 100 张表的数据导出; | \ | |
| * table_[00-99] 代表将 table_00、table_01、直到 table_99 共 100 张表的数据导出。 | 无 | |
| filter | 同步数据的筛选条件,同步数据时只会同步符合过滤条件的数据,直接填写关键词 where 后的过滤 SQL 语句。 | \ |
| \ | ||
* 如将过滤条件指定为:date>=${date} ,表示只同步 date 大于等于 ${date}。 |
\ | |
| * 过滤条件可以有效地进行业务增量同步。如果不配置,默认会同步全量数据。 | 无 | |
| split_pk | 根据配置的字段进行数据分片,建议使用主键或有索引的列作为切分键,同步任务会启动并发任务进行数据同步,提高同步速率: | \ |
| \ | ||
| * 如果表没有主键或者索引列,可以不配置该字段,同步任务不会进行分片,并以单并发的方式同步所有的数据; | \ | |
| * 建议使用主键或有索引的列作为切分键,切分键配置没有索引的列同步任务会比较慢; | \ | |
| \ | ||
| :::tip | \ | |
| 目前仅支持类型为整型或字符串的字段作为切分键。 | \ | |
| ::: | 无 | |
| *columns | 所配置的表中,需要同步的列名集合,使用 JSON 的数组描述字段信息。 | \ |
| \ | ||
| * 支持列裁剪:列可以挑选部分列进行导出。 | \ | |
| * 支持列换序:列可以不按照表 Schema 信息顺序进行导出。 | \ | |
| * column 必须显示指定同步的列集合,不允许为空。 | \ | |
| * 支持函数、常量形式添加列: | \ | |
| * 函数:MySQL Reader 支持您输入 now()、current_timestamp()、unix_timestamp() 等 MySQL 数据库支持的函数。 | \ | |
| * 常量:MySQL Reader 支持您自定义输入常量值,如 '123'、'${DATE}'、'${hour}' 等,输入值两侧需要加上英文单引号,支持结合时间变量参数使用。 | 无 |
以下为完整可运行的 MySQL 批式写脚本示例:
{
"version": "0.2",
"type": "batch",
"reader": {
"type": "hdfs",
"datasource_id": 67890,
"parameter": {
"columns": [
{ "name": "id", "type": "BIGINT" },
{ "name": "user_name", "type": "STRING" },
{ "name": "amount", "type": "DOUBLE" }
],
"path": "/your/hdfs/source/path/${date}",
"file_type": "orc"
}
},
"writer": {
"type": "mysql",
"datasource_id": 12345,
"parameter": {
"table_name": "your_target_table",
"pre_sql_list": ["delete from your_target_table where date='${date}'"],
"post_sql_list": [],
"write_mode": "overwrite",
"columns": [
{ "name": "id", "type": "BIGINT" },
{ "name": "user_name", "type": "VARCHAR" },
{ "name": "amount", "type": "DOUBLE" }
]
}
},
"common": {
"parameter": {}
}
}
Writer 参数说明,其中参数名称前带 * 的为必填参数,名称前未带 * 的为可选填参数:
| | | | \
参数名 |
描述 | 默认值 |
|---|---|---|
| *type | 数据源类型,对于 MySQL 类型,填写:MySQL | 无 |
| *datasource_id | 注册的 MySQL 数据源 ID。可以在项目控制台 > 数据源管理界面中查找。 | 无 |
| *table_name | 填写数据源下所属需数据写入的表名。 | 无 |
| pre_sql_list | 写入前准备语句:在执行数据集成任务前,率先执行的 SQL 语句。此语句通常是为了使任务重跑时支持幂等,支持配置多条写入前准备语句,用英文分号 “;” 分隔即可。 | \ |
例如执行前清空表中的某些旧数据,清空完成后,在执行集成任务写入新的数据,例如删除 date='${date}' 的数据:["delete from table_name where date='${date}'";"xxx"] |
无 | |
| post_sql_list | 写入后准备语句:执行数据同步任务后执行的 SQL 语句。例如数据写入完成后,插入某条特殊的数据,标志导入任务执行结束,支持配置多条写入后准备语句,用英文分号 “;” 分隔即可。 | \ |
示例:["insert into table_name (col1,col2..) values(values1,values2)";"xxx"] |
无 | |
| *write_mode | 数据导入模式,可以支持 insert into/on duplicate key update/replace into 三种模式: | \ |
| \ | ||
| * insert into:当主键/唯一性索引冲突时会写不进去冲突的行,任务会运行失败。 | \ | |
* 使用该模式时,请将 write_mode 设置为 directlyInsert |
\ | |
* 如果希望主键/唯一索引冲突时任务正常执行,可以在 writer.parameter 参数下添加高级参数 job.writer.is_insert_ignore:true |
\ | |
* on duplicate key update:没有遇到主键/唯一性索引冲突时,与insert into行为一致。冲突时会用新行替换已经指定的字段的语句,写入数据至MySQL。 |
\ | |
* 使用该模式时,请将 write_mode 设置为 overwrite |
\ | |
* replace into:没有遇到主键/唯一性索引冲突时,与insert into行为一致。冲突时会先删除原有行,再插入新行。即新行会替换原有行的所有字段。 |
\ | |
* 使用该模式时,请将 writer_mode 设置为 replace |
无 | |
| *columns | 所配置的表中需要同步的列名集合,使用 JSON 的数组描述字段信息。 | \ |
| \ | ||
| * 支持列裁剪:列可以挑选部分列进行导出。 | \ | |
| * 支持列换序:列可以不按照表 Schema 信息顺序进行导出。 | \ | |
| \ | ||
| :::warning | \ | |
| * column 必须显示指定同步的列集合,不允许为空。 | \ | |
| * column 必须与导入的源端列集合对齐,不允许多列或少列。 | \ | |
| ::: | 无 |
job.reader. 前缀,写参数需要加上 job.writer. 前缀,如下图所示:reader.parameter 下,写参数请配置到 writer.parameter 下,直接输入参数名称和参数值。如下图所示:
批式读支持以下高级参数,您可根据实际情况进行配置:
| | | | \
| 参数名 | 描述 | 默认值 |
|---|---|---|
| job.reader.init_sql | 读取数据前执行的 SQL 语句。对于视图的查询可能需要使用 init SQL 语句初始化环境。 | 无 |
| job.reader.reader_fetch_size | 每次拉取的数据条数,只在准确分片中有效。 | 10000 |
| job.reader.query_timeout_seconds | Jdbc 方式读取数据,设定读取超时时间,单位秒。 | 300 |
| job.reader.shard_split_mode | Jdbc 连接分片模式,支持准确分片、并发分片、不分片三种模式: | \ |
| \ | ||
| * 准确分片(默认):根据配置的分片键将数据拆分为不同的区间,除下最后一个区间外,每个区间精准的有 reader_fetch_size 条数,此模式速度较慢,但可以保证下游文件大小基本一致。 | \ | |
| * 拉取数据量很大的表或者分片键不是主键或者索引键时,该分片模式分片时间会比较长; | \ | |
| * 该分片模式支持分片键为整型数据类型和字符串数据类型; | \ | |
* 配置方式:将该参数配置为 accurate。 |
\ | |
| * 非精确分片:此模式速度较快,但无法保障下游文件大小一致。 | \ | |
| * 该分片模式仅支持分片键为整型数据类型; | \ | |
* 参数配置为 parallelism时:根据表的最大最小值,将所有的数据按照执行并发数进行区间分片; |
\ | |
* 参数配置为quick时:根据 reader_fetch_size 进行模糊分片。 |
\ | |
| * 不分片:不进行分片,适用于表数据量较小,或没有主键、索引键的表。 | \ | |
* 配置方式:将该参数配置为 nosplit 或者不配置 split_pk 。 |
准确分片 | |
| job.reader.customized_sql | 自定义查询读取 SQL 语句。filter 过滤配置项不足以描述所筛选的条件,可通过该配置项来自定义执行较复杂的查询 SQL。 | \ |
例如:需要进行多表 join 后同步数据,使用select a,b from table_a join table_b on table_a.id = table_b.id。 |
\ | |
| :::tip | \ | |
| 配置该高级参数项后,数据同步任务仍需配置 table_name、column 、split_pk 、shard_split_mode 等必填配置项。然而,在执行同步时,系统将忽略这些配置项信息,直接使用该高级参数项中配置的内容进行数据查询和筛选。 | \ | |
| ::: | 无 | |
| job.reader.session_properties | 通过设定该高级参数,可自定义作用于 MySQL 中会话级的系统变量,格式为 Map<String, String>,如 job.reader.session_properties={ "wait_timeout": "3600" } ,设定超时参数为 3600 秒。 | 无 |
批式写支持以下高级参数,您可根据实际情况进行配置:
| | | | \
| 参数名 | 描述 | 默认值 |
|---|---|---|
| job.writer.is_insert_ignore | insert into 模式时,主键或者唯一键冲突时任务失败还是忽略冲突,false 为任务执行失败;true 为忽略冲突,任务正常执行。 | false |
| job.writer.write_batch_interval | 一次性批量提交的数据条数,该值可以减少与 MySQL 网络的交互次数并提升整体吞吐量。如果该值设置过大可能会导致数据同步进程 OOM。 | 100 |
| job.writer.write_retry_times | MySQL 写入失败时重试次数。 | 3 |
| job.writer.retry_interval_seconds | 写入失败后两次重试的时间间隔,单位秒。 | write_batch_interval / 10 |
| job.writer.connection_parameters | Jdbc 连接的全部参数,可在默认值后追加补充: | \ |
| \ | ||
| * tcpRcvBuf 读单行数据量大时使用: | \ | |
| tcpRcvBuf=1024000 (1MB) | \ | |
| * allowMultiQueries 允许支持使用多条 sql,用分号隔开: | \ | |
| allowMultiQueries=true | \ | |
| * connectTimeout 连接超时时间,毫秒: | \ | |
| connectTimeout=60000 | autoReconnect=true&useUnicode=true&characterEncoding=utf-8&useSSL=false&zeroDateTimeBehavior=convertToNull | |
| job.writer.session_properties | 通过设定该高级参数,可自定义作用于 MySQL 中会话级的系统变量,格式为 Map<String, String>,如 job.writer.session_properties={ "wait_timeout": "3600" } ,设定超时参数为 3600 秒。 | 无 |
离线任务写入 MySQL 方式,MySQL 数据表中只保存最近一天的数据:
delete from table_name wheredate<= "${date-1}"insert into。
对于 MySQL 离线写,使用 insert into 写入方式时,重跑任务可能产生两种结果:
因此为了任务重跑时可实现幂等,可以有以下几种解决方案:
on duplicate key update 或者 replace into 。insert into ,并配置高级参数 job.writer.is_insert_ignore 为 true。
源端中一个数据表或一个文件数据,可通过配置相关高级参数,将数据写入 MySQL 多张分表中。
前置注意事项:
执行任务前,需要依据源端表、文件等数据,来创建一个与源表/文件数据结构相同的 Schema 表,在可视化配置的目标端中,将其选做目标表,且字段映射时,需要包含完整的源表字段映射。
需要注意:可视化配置选中的目标表仅是形式上的目标表,实际不会向该表中写入数据,真实写入数据的目标表名称,需通过下方高级参数 job.writer.table_pattern进行定义。
高级参数配置:
| | | | \
| 参数名 | 描述 | 默认值 |
|---|---|---|
| job.writer.table_pattern | 必填。 | \ |
| 该参数表示可以引用源表中的某个字段名来作为目标表名的一部分,例如源表或源 TOS 文件中有 table_name 字段名,则 ${table_name} 表示运行时自动取每条数据中该字段的值来拼接目标表名字符串。 | \ | |
| 配置示例:job.writer.table_pattern=${table_name}_copy | 无 | |
| job.writer.internal_columns | 可选。 | \ |
| 该参数可指定源表中的某些字段数据不写入目标表中。比如已经选做目标表名的 table_name 字段,可不在实际写入目标表的数据字段里出现。您可配置该参数为:job.writer.internal_columns=[ "table_name" ] | 无 |