拓展阅读

DataX集成可视化页面,选择数据源即可一键生成数据同步任务,支持RDBMS、Hive、HBase、ClickHouse、MongoDB等数据源,批量创建RDBMS数据同步任务,集成开源调度系统,支持分布式、增量同步数据、实时查看运行日志、监控执行器资源、KILL运行进程、数据源信息加密等。

DataX全量、增量、已删除数据同步方案与实际运用

DataX 是一款可以实现异构数据库间离线数据同步的工具,本文重点将使用DataX做一个oracle到mysql的数据同步,其中会借助datax-web进行可视化配置。

使用场景简单讲下:客户提供了oracle前置库,我们系统每天需要定时从前置库将数据同步到我们自己的mysql数据库。

本文不再细说如何使用datax和data-web,直接从问题的角度触发,主要记录下问题解决思路和办法,欢迎大家指正和探讨!!!

2.DataX部分

2.1同步数据乱码

jdbcUrl加上指定编码配置即可

2.2数据更新问题(主键冲突):writeMode

默认writeMode为insert,此情况下只能新增数据,有主键冲突就会报错,此时需要设置为写入模式为更新模式(replace)。源码mysqlwriter.md中有解释如下:

  • writeMode
  • 描述:控制写入数据到目标表采用 insert into 或者 replace into 或者 ON DUPLICATE KEY UPDATE 语句
  • 必选:是
  • 所有选项:insert/replace/update
  • 默认值:insert

mysql比较特殊的写入模式配置为”writeMode”: “update”,其他数据库需要酌情配置为”writeMode”: “replace”

2.3增量同步(根据日期)

按日期进行同步,在reader.parameter增加“where”参数,里面就是需要过滤的数据,例子是只同步30天以内的数据

  [sql]
1
"where": "CREATE_TIME > TO_CHAR(TO_DATE(SYSDATE - 30),'yyyy-MM-dd HH24:mi:ss')"

数据库是oracle,其他数据库可能需要定制。此处的是只同步创建时间在30天内的数据。

可以根据实际业务需要定制where参数来实现数据筛选

2.4删除数据同步

datax只有新增和更新两种数据会同步,当源数据库有数据删除时是无法同步的,就会造成源数据库已经删除了,但目标数据库还存在这些数据。

目前想到以下两种方案:

2.4.1清空表完全走新增逻辑

在前置sql中配置清空标的sql即可。

唯一的问题就是清空表到数据同步完成期间表是数据确实的,可能对业务影响比较大。

在writer.parameter参数中新增preSql配置即可

  [plaintext]
1
"preSql": ["truncate table 表名;"],

2.4.2利用已删除数据不会同步的逻辑

总体思路:

1、需要同步的目标数据库表增加一个SYNC_STATUS字段

2、每次同步时,用前置sql更新SYNC_STATUS=0

3、每次同步数据时将一个常量1同步到SYNC_STATUS,达到SYNC_STATUS=1的目的

4、后置sql执行删除操作,将SYNC_STATUS=0的数据全部删除(源表此数据已经物理删除,目标表此数据不会有更新,所以前置sql更新的SYNC_STATUS=0不会变,可以认定为是已删除数据)

这样目前只能全量同步,需要增量的同步数据(含删除)还需要在进行改造,示例如下:

  [json]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
{ "job": { "setting": { "speed": { "channel": 3, "byte": 1048576 }, "errorLimit": { "record": 0, "percentage": 0.02 } }, "content": [ { "reader": { "name": "oraclereader", "parameter": { "username": "xxx", "password": "xxx", "column": [ "\"ID\"", "1" ], "splitPk": "ID", "connection": [ { "table": [ "xxx" ], "jdbcUrl": [ "jdbc:oracle:thin:@//xxx:1521/orcl" ] } ] } }, "writer": { "name": "mysqlwriter", "parameter": { "writeMode": "update", "username": "xxx", "password": "xxx", "column": [ "`ID`", "`SYNC_STATUS`" ], "preSql": [ "UPDATE xxx SET SYNC_STATUS = '0';" ], "postSql": [ "DELETE FROM xxx WHERE SYNC_STATUS = '0';" ], "connection": [ { "table": [ "xxx" ], "jdbcUrl": "jdbc:mysql://xxx:3306/xxx?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowMultiQueries=true" } ] } } } ] } }

chat

datax 如何处理删除操作?

在DataX中,处理删除同步问题通常需要考虑源端和目标端数据的对比,以及如何在目标端删除不再存在于源端的数据。

以下是一些常见的方法:

  1. 全量同步:
    • 通过定期进行全量同步,即将源端的所有数据重新复制到目标端。这确保了目标端的数据与源端完全一致,但在数据量较大时可能效率较低。
  2. 增量同步 + 删除标记:
    • 在源端表中添加一个标记字段,用于标识数据是否被删除。
    • 在数据同步过程中,首先将标记字段为删除状态的数据标记为已删除,并同步到目标端。
    • 在目标端,检测到已删除标记的数据,进行相应的删除操作。
  3. 使用时间戳或版本号:
    • 在源端表中添加时间戳或版本号字段,记录数据的变更时间或版本。
    • 在数据同步过程中,仅同步源端时间戳或版本号大于目标端的数据,确保只同步更新的数据。
    • 对于不再存在于源端的数据,在目标端进行删除操作。
  4. 使用第三方工具或脚本:
    • 利用专门的数据同步工具或脚本,如Debezium、Maxwell等,这些工具能够监控数据库变更并以事件的方式将变更同步到目标端,包括删除操作。

选择哪种方法取决于你的具体场景和需求。在实际应用中,通常需要综合考虑数据量、性能要求、对实时性的需求等因素。

请注意,在删除数据时要小心,确保有合适的备份和恢复机制,以防止误删除。

参考资料

https://www.cnblogs.com/simple-young/p/16295488.html#242%E5%88%A9%E7%94%A8%E5%B7%B2%E5%88%A0%E9%99%A4%E6%95%B0%E6%8D%AE%E4%B8%8D%E4%BC%9A%E5%90%8C%E6%AD%A5%E7%9A%84%E9%80%BB%E8%BE%91

关于离线增量同步删除策略的一个问题