我需要使用Spring Batch作为ETL,以将数据从源数据库(MySQL)中的一组表迁移到目标数据库(MySQL)中的另一组表< / strong>。目标表中的模式与源表中的模式不同,因此我正在使用处理器转换数据以匹配目标模式。
我需要逐个迁移,即像按需一次记录集(并非一次全部)一样。
我没什么好担心的。
1)审核(确保所有数据都已迁移)
2)回滚并重试(如果发生错误)
3)错误处理
4)如何在迁移过程中保持源表新数据的更新(无停机时间)
以下是我的想法。
我将生成一个随机ID,该ID对于每个作业都是唯一的(可能是每个作业的 UUID ),然后在迁移时将其放在目标表(每行的列)中。< / p>
1)审核:我的想法是对迁移中的记录进行计数,然后在迁移完成后将其与目标表的行进行比较。
2)回滚并重试::如果审核检查中的记录计数不匹配,我将删除所有带有 batch UUID 的行,然后启动再次执行批处理作业。
3)错误处理::不确定我还需要注意哪些其他情况,所以我在考虑仅记录错误。
4)增量更改:我正在考虑一次又一次运行批处理作业以查找更改(具有created_at,updated_at列值),直到找到0条记录为止。
我想了解一下,是否可以采用更好的方式完成上述任何步骤?请提出建议。
答案 0 :(得分:2)
您可能需要花费更多时间来查看Spring Batch,因为它已经为您解决了大部分此类问题。
您已经可以运行单个Spring Batch作业并将其设置为按块进行处理,而块的大小则是在设置作业时配置的。
已经涵盖了审核。批处理表(和Spring Batch管理界面)将保留每个作业实例读取和写入的所有记录的计数以及失败计数(您将其配置为抑制异常)。
Spring批处理作业已经具有基于上述表的重试和自动恢复逻辑,这些表可跟踪已完成多少输入记录。但是,将数据库用作输入源时,这不是一个选项。您将需要在表设置中找到一个选项来标识已完成的记录,或者对目标数据库使用唯一性约束,以使其无法重写重复的记录。另一种选择是让您的工作的第一步是将记录读入平面文件,然后从该文件读取作为下一步处理。重新启动作业后,这应该可以使Spring Batch自动恢复逻辑起作用。
错误处理也已经涵盖。任何故障都会停止工作,因此不会丢失任何数据。它将回滚正在处理的当前块中的数据。如果您希望它继续运行,则可以将其设置为忽略(禁止)特定的异常。您还可以设置允许不同例外的特定编号。当然,您可以记录故障详细信息,以便以后查找。
如前所述,您将需要在源查询中使用一个值或触发器来标识已处理的记录。这将使您能够继续运行块查询以获取新记录。