拓展阅读
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天以内的数据
"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配置即可
"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不会变,可以认定为是已删除数据)
这样目前只能全量同步,需要增量的同步数据(含删除)还需要在进行改造,示例如下:
{
"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中,处理删除同步问题通常需要考虑源端和目标端数据的对比,以及如何在目标端删除不再存在于源端的数据。
以下是一些常见的方法:
- 全量同步:
- 通过定期进行全量同步,即将源端的所有数据重新复制到目标端。这确保了目标端的数据与源端完全一致,但在数据量较大时可能效率较低。
- 增量同步 + 删除标记:
- 在源端表中添加一个标记字段,用于标识数据是否被删除。
- 在数据同步过程中,首先将标记字段为删除状态的数据标记为已删除,并同步到目标端。
- 在目标端,检测到已删除标记的数据,进行相应的删除操作。
- 使用时间戳或版本号:
- 在源端表中添加时间戳或版本号字段,记录数据的变更时间或版本。
- 在数据同步过程中,仅同步源端时间戳或版本号大于目标端的数据,确保只同步更新的数据。
- 对于不再存在于源端的数据,在目标端进行删除操作。
- 使用第三方工具或脚本:
- 利用专门的数据同步工具或脚本,如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