背景与选型
我们之前使用 Oracle GoldenGate (OGG) 进行数据库间的数据同步。虽然 OGG 基于变更日志(Redo/Binlog),速度快且对源库影响小,适合海量数据场景,但在实际运维中暴露了一些问题:
- 配置繁琐:表结构变更或新增表需要修改服务器端多个配置文件,在进程较多时容易误操作。
- 维护成本高:单表同步失败后重建配置复杂,且需要在每个数据库节点安装软件。
- 缺乏可视化:无图形界面,配置分散,排查问题不够直观。
为了解决上述痛点,我们引入了 Kettle 作为新的同步方案。它基于 SQL 逻辑,通过主键和时间戳实现增量同步,无需在数据库服务器端安装组件,只需在 Kettle 服务器上创建作业即可。对于日常业务表,Kettle 已能胜任;未来针对日同步百万级以上的超大表,仍会保留 OGG 方案。
环境准备
- 版本:PDI 8.3
- 操作系统:推荐 Windows。Linux 环境下 Spoon 启动耗时较长且界面适配存在失真问题,开发调试体验不佳。
- 依赖:
- 安装 JDK 1.8。
- 解压 PDI 安装包。
- 将数据库驱动放入
pdi\data-integration\lib目录:- Oracle:
ojdbc14.jar - MySQL:
mysql-connector-java-5.1.9.jar或6.0.6.jar
- Oracle:
核心逻辑设计
关键组件说明
- SQL 步骤:执行自定义 SQL,支持多条语句。
- 转换 (Transformation):包含表输入、变量设置、排序、合并、Switch、表输出、更新等,是处理数据的核心逻辑。
- 作业 (Job):编排整个同步流程,串联 SQL 和转换任务,配合调度器定时触发。
- 数据库连接:可在转换或作业内创建,支持全局共享,避免重复配置。
前置约束
为了保证同步稳定,目标表和源表需满足以下规范:
- 主键约束:必须存在唯一主键。
- 删除策略:应用层禁止物理删除,仅做逻辑删除(如
delete_flag字段)。需定期清理delete_flag=1的脏数据。 - 时间戳统一:所有变更(含逻辑删除)必须更新同一时间戳字段(Oracle 用
DATE,MySQL 用DATETIME)。 - 类型兼容:Oracle
NUMBER同步到 MySQLBIGINT时,最大长度限制为 18 位,避免默认 38 位溢出。 - 手动维护:若涉及
TRUNCATE或无时间戳的UPDATE,需确保源端和目标端同时处理。
同步原理
- 建立中间表
sync_timestamp,记录每张表的最后同步时间戳。首次运行前,手工填入源表最小update_time。 - 每次同步开始时,读取该表获取当前
TIME_STAMP环境变量。 - 查询源表中
update_time >= TIME_STAMP的数据,执行插入或更新操作至目标端。 - 同步完成后,获取目标表最新的
update_time,回写更新sync_timestamp表。


