1. 概述
定时任务运行时若遇到脏数据,任务会报错并终止。本文说明如何查看脏数据产生的原因及如何处理脏数据。
注:实时管道任务的脏数据说明请参见:实时管道任务处理脏数据
2. 脏数据产生常见原因
| 原因 | 说明 |
|---|---|
| 主键冲突 | 当写入方式-主键冲突策略为「主键相同,记录为脏数据」时,主键冲突的数据将被视为脏数据 |
| 字段长度超出限制 | 需注意,字段长度还与编码有关 PostgreSQL 数据库的 varchar(60) 和 SQLServer 的 varchar(60) 长度定义是不一样的,SQLServer表示最多存储 60 字节,PostgreSQL 是标识,最多存储 60 个字符 根据编码的不同,字符占的字节也不一致,60 个字符计算后肯呢个超过 60 个字节 |
| 字段类型不匹配 | - |
| 目标字段缺失 | 字段映射中的目标表字段被删除,所以来源表的该字段无法同步,变为脏数据 |
| 违反目标字段非空约束 | 来源表某个字段值为空,插入到不能为空的目标表字段中 |
| 目标表的表空间不足 | - |
| 暂时性原因 | 网络不稳定,重新运行定时任务即可 |
3. 查看脏数据条数及原因
1)定时任务运行时,若存在脏数据,日志中将会报错。如下图所示:
注:建议将 日志等级 设置为 INFO,日志信息会更加详细。

「统计」Tab页下,可看到脏数据具体条数,点击条数,可看到错误类型和错误原因。如下图所示:

2)用户若想查看到所有脏数据的所有信息,可到%FDL_HOME%\logs\fanruan.log文件中进行查看。
3)用户若想遇到脏数据就通知给指定用户,可在结果通知中勾选「脏数据通知」按钮。如下图所示:
详情请参见:任务控制-结果通知

4. 处理脏数据
4.1 忽略脏数据
若用户希望任务具有一定容错性,即遇到脏数据任务继续运行,不进行报错,运行状态为成功,且脏数据不写入到目标表中(正常的数据会顺利写入到目标表中),可设置脏数据阈值(输入范围为1~1万)。如下图所示:
详情请参见:任务控制-容错机制
注:若不配置「脏数据容忍」,只要遇到脏数据就会导致任务失败。

若脏数据条数未超过阈值(最大可设置为10000),日志信息如下:

脏数据条数超出脏数据阈值后,任务会报错。
4.2 脏数据处理后写入到目标表
用户若希望脏数据写入到目标表,需要根据日志排查脏数据出现原因,修正后重新运行任务或者 重试任务
产生脏数据后,重试任务的处理场景:
| 场景 | 增量同步的方式 | 重试后是否会存在数据问题 | 建议处理措施 |
|---|---|---|---|
| 全量同步 | - | 否 | - |
| 增量同步-使用时间戳 | 动态参数:如:配置 now-1 作为数据范围,每次更新前一天数据 | 是 | 在重试时,用户可以指定本次运行的临时任务参数值 且用户的任务设计需要支持幂等,即同一数据范围的定时任务需要支持多次运行 |
| 获取目标表的最新数据时间戳 如:每次任务先从目标表获取最大的时间戳,作为本次同步的起始时间 | 是 | 用户需要手动删除目标表大于本批次的数据,以进行重试 且用户的任务设计需要支持幂等,即同一数据范围的定时任务需要支持多次运行 | |
自定义配置表存储断点 如:每次任务最后一步存储本次同步的最大时间至一张表存储 | 是 | 用户需要手工修改断点值,以进行重试 且用户的任务设计需要支持幂等、即同一数据范围的定时任务需要支持多次运行 | |
| 全表比对 | - | 否 | - |
