Skip to main content

整库同步&增量同步

整库同步

概述

整库同步是帮助提升用户效率、降低用户使用成本的一种快捷工具,本质上是一种批量配置同步任务的方式。假设数据库有100张表,原本可能需要配置100次数据同步任务,整库同步功能可以一次性完成100个同步任务的配置。

支持的数据源类型

目前可以支持的数据源类型如下:

作为源数据源作为目标数据源
MySQL支持支持
Polardb for MySQL 8支持
Oracle支持支持
SQLServer支持
PostgreSQL支持支持
DB2支持支持
达梦支持
Greenplum支持
TiDB支持支持
GBase 8a支持
ClickHouse支持
Hive支持
ADB支持
Doris支持
Hana支持

配置整库同步

配置整库同步的入口在「数据源」页面,在待同步的数据源点击「整库同步」按钮,进入整库同步页面。 整库同步的配置包括:

  • 待同步表:将数据源指定的数据库下的所有表,以表格的形式展现出来,可以根据实际需要批量选择;目标表表名后还可查看对应数据源的建表语句,如下图。

    image-20230114165548369

  • 高级设置

    • 表名转换:可填写表名中原有的字符,替换后的字符,例如将 ab 替换为 ods_ab 注意,表名替换中,目前会将表名所有匹配到的地方都做替换,例如表名为 abc_ab_table ,按以上规则,会被替换为 ods_abc_ods_ab_table

    • 字段名转换:原理与表名转换类似,依然会存在同个字符可能会被多次替换的情况,例如配置字段名转换规则为d->od,则MySQL中字段名address将会被转换为aododress

    • 字段类型转换:源表的字段类型转换为Hive表的字段类型

      image-20230114165644207

  • 数据同步目标:选择数据同步目标,目标数据源可选择的范围参考上文中的「支持的数据源类型」

  • 分区字段:当数据同步目标选择hive类的数据同步目标时,展示「分区字段」填写项,默认「分区字段」为pt,支持用户自定义。

  • 同步任务生成目录:支持选择默认目录或自定义目录,默认目录为clone_database/数据源名称

  • 生效日期:整库同步生成的每个任务的生效日期

  • 具体时间:整库同步生成的每个任务的具体时间

  • 同步方式

    • 增量(根据日期字段):使用同步任务的「[数据过滤]」功能,根据用户填写的增量日期字段自动拼接SQL,抽取前一天的数据。使用增量方式后,系统将对每张表使用同样的增量字段,配合离线开发调度参数(${bdp.system.bizdate})形成针对每天的数据抽取条件,例如MySQL的拼接(用户点击「发布任务」按钮后,会先对增量字段进行检查,若字段不存在,则此表会配置失败):

      -- MySQL STR_TO_DATE('${bdp.system.bizdate}', '%Y%m%d') <= id  AND id < DATE_ADD(STR_TO_DATE('${bdp.system.bizdate}', '%Y%m%d'), interval 1 day) SQLCopied!
caution

配置增量抽取时,源库每张表的增量字段名需保持一致,若无法保持一致,可分批次分别配置,否则会导致SQL拼接失败

  • 全量:不拼接增量抽取SQL,全量抽取各表的数据
    • 并发配置:为了对数据源进行保护,避免同一时间点启动大量数据同步作业带来数据库压力过大,可选择分批上传,例如:从每日0点开始,每1小时启动3个数据库表同步
  • 间隔时间:每隔xx小时同步多少张表
    • 是否保存配置:保存配置后,可在「数据源-操作-同步历史」按钮中找到历史上配置过的整库同步任务与配置结果,系统仅保留最近5次的历史记录
    • 发布任务进度:点击「发布任务」,系统将逐个生成同步任务,可在待同步表的「任务状态」一列查看每张表发布的结果,包括成功或失败信息
    • 同步历史:同步历史的入口在「数据源-操作-同步历史」按钮,系统仅记录勾选了保存同步配置,否则不会保留历史记录

任务生成的步骤

整库同步批量生成任务,按照如下步骤进行处理,每个任务单独检查,其中部分失败不会影响其他任务的生成

任务生成规则

用户完成配置,点击「发布任务」按钮时,会按照如下规则批量生成同步任务:

  • Hive表的表名、字段名和字段类型根据高级配置生成,如果没有填写高级配置,则与源表的结构完全相同。分区字段名为pt,格式为yyyyMMdd
  • 生成的同步任务,所在目录为:clonedatabase>数据源名称>数据源名称2hive表名中找到生成的任务,然后对其进行更加个性化的编辑操作
  • 生成的数据同步任务是按天调度的周期任务,会在第二天凌晨自动运行,传输速率为1M/s
  • 若目标表名、任务名已存在,则该任务生成失败
  • 若增量字段不存在,则该任务生成失败,并提示「日期分区字段在表中不存在」

字段类型转换

创建目标表会根据源库的字段类型,自动转换为目标字段的类型,字段转换规则可以在“高级设置”中配置。

提交任务

  • 除了创建同步任务,系统还会自动创建一个虚节点,并将其他同步任务作为本任务的下游任务,方便用户执行补数据操作
  • 完成以上操作后,将虚节点和其他同步任务执行一次提交操作
  • 若用户对同一数据源多次操作补数据,则系统仅会创建一个虚节点,新创建的同步任务都会被置为此虚节点的子任务

其他说明

由于数据库的表设计规范性的问题,整库上传具有一定的约束性,具体如下: 仅提供每日增量、每日全量的上传方式

如果您需要一次性同步历史数据,则此功能无法满足您的需求,故给出以下建议:

  • 建议您配置为每日任务,而非一次性同步历史数据。您可以通过调度提供的补数据来对历史数据进行追溯(从虚节点及其下游开始补数据),这样可避免全量同步历史数据后,还需要做临时的SQL任务来拆分数据。
  • 如果您需要一次性同步历史数据,可以在任务开发页面进行任务的配置,然后单击运行,完成后通过SQL语句进行数据的转换,因为这两个操作均为一次性行为。
  • 如果您每日增量上传有特殊业务逻辑,而非一个单纯的日期字段可以标识增量,则此功能无法满足您的需求,为了更方便地增量上传,建议您在创建所有数据库表的时候都有:gmt_create或gmt_modify的字段,同时为了效率更高,建议增加id为主键。

整库上传提供分批和整批上传的方式

  • 为了保障对数据库的压力负载,整库上传提供了分批上传的方式,您可以按照时间间隔把表拆分为几批运行,避免对数据库的负载过大,影响正常的业务能力。以下有两点建议:
    • 如果您有主、备库,建议同步任务全部同步备库数据。
    • 批量任务中每张表都会有1个数据库连接,上限速度为1M/s。如果您同时运行100张表的同步任务,就会有100个数据库进行连接,建议您根据自己的业务情况谨慎选择并发数。
  • 如果您对任务传输效率有自己特定的要求,此功能无法实现您的需求。所有生成任务的上限速度均为 1M/s。

增量同步

概述

表中的数据基本只有插入操作,随着业务的运行,表中的数据会越来越大。如果每次都整表同步的话,消耗的时间及资源也会越来越多,因此需要一个增量同步的功能,每次只同步增加部分的数据,对于已经同步过的数据则不再进行重复的同步工作。

本节使用MySQL作为示例,演示了如何利用本平台对MySQL的某张表进行增量同步:进行增量同步的步骤,除了基础的字段映射之外,关键是在同步任务的第一步数据来源数据过滤表单中填写过滤条件,下面分几种情况举例如何填写过滤条件:

MySQL建表语句如下:

create table if not EXISTS filterData(
id int auto_increment,
mod_time datetime
)
SQLCopied!

且存储的数据为: image::filterMysql.png[]

  • 天增量抽取
-- 抽取昨天数据
date(modtime)=DATE_FORMAT('${bdp.system.bizdate}','%Y-%m-%d');
SQLCopied!
  • 小时增量抽取
-- 抽取设定的时间,前3小时至前1小时的数据,例如任务定时时间是19:00运行,则会抽取:[16:00~18:00)的数据
SELECT
id,
modtime
FROM
filterdata
WHERE
modtime >= DATE_ADD( DATE_FORMAT( '${bdp.system.cyctime}', '%Y-%m-%d %H' ), INTERVAL - 3 HOUR )
AND modtime < DATE_ADD( DATE_FORMAT( '${bdp.system.cyctime}', '%Y-%m-%d %H' ), INTERVAL - 1 HOUR );
SQLCopied!
  • 半小时增量抽取
-- 抽取设定的时间,前半小时的数据,例如任务定时时间是19:00运行,则会抽取:[18:30~19:00)的数据
SELECT
id,
modtime
FROM
filterdata
WHERE
modtime >= DATE_ADD( DATE_FORMAT( '${bdp.system.cyctime}', '%Y-%m-%d %H:%i' ), INTERVAL -30 MINUTE )
AND modtime < DATE_FORMAT( '${bdp.system.cyctime}', '%Y-%m-%d %H:%i' );
SQLCopied!
  • 月增量抽取
-- 抽取上个月,整月的数据,例如任务定时时间是2018-01-01 12:12:12运行,则会抽取:[2017-12-01 00:00:00 2018-01-01 00:00:00)的数据
SELECT
id,
modtime
FROM
filterdata
WHERE
modtime >= DATE_ADD( DATE_FORMAT( '${bdp.system.bizdate}', '%Y-%m-%d' ), INTERVAL -1 MONTH )
AND modtime < DATE_FORMAT( '${bdp.system.bizdate}', '%Y-%m-%d' );
SQLCopied!