Skip to content
运维指南/数据一致性与正确性

数据一致性与正确性问题 - 排查与解决手册


1. 数据不一致(不同引擎结果不同)

现象:同一个表,用数据加工(DI)抽数报错,但用数据同步(SeaTunnel)正常;或目标表数据与源表不符。

解决步骤

  1. 对比字段长度
    检查源表和目标表字段长度,尤其注意中文字节数差异(如 DM 中 VARCHAR(6) 可存 6 个中文,StarRocks 只能存 2 个)。放大目标表字段长度。

  2. 检查空值处理
    SeaTunnel 可能自动将空值转为空字符串,DI 可能报错。在作业中添加“空值替换”组件,将 null 转为默认值。

  3. 核对字段映射
    在字段选择组件中,手动指定目标字段类型,避免依赖默认映射。

  4. 检查权限一致性
    确保 DI 和 SeaTunnel 使用的数据库账号对源和目标表权限一致。


2. 精度丢失(数字多了 .0 / 小数位错误)

现象:Excel 导入后整数变浮点数(123 → 123.0),或小数位数被截断。

解决步骤

  1. Excel 输入组件中指定字段类型为 String,然后通过字段选择转为整数。

  2. 使用 JavaScript 组件转换

    javascript
    var intVal = parseInt(row.getString("field"), 10);
    row.setValue("field", intVal);
  3. MySQL TINYINT(1) 误转布尔
    在 JDBC URL 中添加 tinyInt1isBit=false

  4. 若为 SQL Server 数字精度问题,申请补丁 DWS7.0.2_SERVER_20250529_P1


3. 中文乱码(日志乱码 / 数据库乱码)

现象:IDE 试运行日志中文乱码;CSV 导入后中文变问号;数据库存储乱码。

Snipaste_2024-10-28_17-17-50

解决步骤

  1. 检查操作系统编码
    echo $LANG,确保为 zh_CN.UTF-8,若不是则修改 /etc/locale.conf

  2. JDBC URL 添加编码参数
    MySQL:useUnicode=true&characterEncoding=UTF-8
    Oracle:?useUnicode=true&characterEncoding=UTF-8

  3. 检查数据库字符集
    MySQL:SHOW CREATE TABLE 表名,确认表字符集为 UTF-8,若不是则修改。

  4. 文件输入组件指定编码
    在 CSV/Excel 输入组件中,明确选择“UTF-8”或源文件实际编码。

  5. 若 IDE 日志乱码,请参考排查。

    此问题一般与dolphin数据库配置或所连接数据库有关,请参考如下排查:

    • dolphin数据库新建时的编码格式是utf8

    • 检查dolphin数据库配置/dolphin/bin/env/dolphinscheduler_env.sh,确保数据库url参数已使用utf-8编码参数 ?useUnicode=true&characterEncoding=UTF-8

    • 使用命令查看dolphin数据库各部分编码格式。SHOW VARIABLES LIKE 'CHARACTER%'; Snipaste_2024-10-28_17-28-46

    • 找到mysql配置文件,此处以windows系统为例,D:/MySql/my.ini,修改character-set-server为uft8,重启mysql数据库。 Snipaste_2024-10-28_17-30-44

    • 使用命令重新查看数据库各部分编码格式,SHOW VARIABLES LIKE 'CHARACTER%'; 正确如下。注:重启dolphin,新建作业执行 Snipaste_2024-10-28_17-37-58


4. 字段类型转换异常:NumberFormatException

现象:执行作业时报 java.lang.NumberFormatException,或 LocalDate cannot be cast to java.util.Date

解决步骤

  1. 检查源数据中的非数字字符
    使用“数据过滤”组件排除包含非数字的行,或在 JavaScript 中处理:

    javascript
    if (row.getString("field").matches("\\d+")) {
      // 转换
    } else {
      // 置空或处理
    }
  2. 日期类型转换
    在字段选择组件中,将源日期类型显式转为 String,再按目标格式解析。

  3. 设置空值处理
    若为 null 导致异常,在表输出组件中勾选“忽略空值”或“使用默认值”。

  4. 针对达梦数据库的补丁:申请 DWS7.1.0_SERVER_20250703_P1


5. 主键冲突 / 重复数据

现象:同步时报 Duplicate entry 主键冲突;目标表出现重复记录。

解决步骤

  1. 源表去重
    在源表输入后添加“排序记录”和“去除重复记录”组件,按主键字段排序去重。

  2. 使用“插入/更新”组件
    配置“用于查询的关键字”(主键),并勾选“更新”和“插入”选项。

  3. 检查作业是否重复触发
    查看调度历史,确认同一作业未被多次并行执行。可在作业流配置中设置“串行等待”。

  4. 若为 CDC 增量同步重复,调整 checkpoint 配置,确保 Exactly-Once 语义。


6. 特殊字符导致建表失败

现象:达梦数据库中字段含特殊字符(如括号、空格)时,建表语句执行失败。

解决步骤

  1. 手动建表
    在目标库中提前建好表,字段名加双引号,作业只负责写入。

  2. 若为 CSV 导入特殊字符,在文本文件输出组件中配置转义字符和包围符。


7. 数据同步后时间字段偏差(时区问题)

现象:源表和目标表时间字段相差几个小时(如 +8 小时或 -8 小时)。

解决步骤

  1. JDBC URL 添加时区参数
    MySQL:serverTimezone=Asia/Shanghai
    Oracle:?serverTimezone=Asia/Shanghai(需驱动支持)

  2. 统一服务器时区
    所有相关服务器(DWS、Dolphin、DI)执行 timedatectl set-timezone Asia/Shanghai

  3. 检查数据库时区设置
    MySQL:SELECT @@global.time_zone, @@session.time_zone;,若为 SYSTEM 则需修改配置文件。

  4. 在字段选择组件中显式转换
    使用 DATE_FORMATCAST 函数指定时区。


8. 空值写入报错(字段非空约束)

现象:目标表字段有 NOT NULL 约束,但源数据有空值,导致作业报错。

解决步骤

  1. 在作业中添加“空值替换”组件,将空值替换为默认值(如 0、空字符串、当前时间)。

  2. 使用 JavaScript 组件判断

    javascript
    if (row.getString("field") == null) {
      row.setValue("field", "默认值");
    }
  3. 修改目标表约束(如允许为空),或提前处理源数据。


快速定位表

异常现象章节
不同引擎结果不一致1
数字多了 .02
中文乱码3
NumberFormatException4
主键冲突 / 重复数据5
特殊字符建表失败6
时间字段偏差7
空值写入报错8

预防与最佳实践

  1. 开发阶段充分测试:用小批量数据验证,对比源和目标的关键字段。
  2. 明确字段映射:在字段选择组件中手动指定类型,避免依赖默认。
  3. 统一编码和时区:数据库、操作系统、应用配置保持一致。
  4. 处理空值和异常数据:提前清洗或使用组件处理。
  5. 使用事务:关键作业可配置事务,保证数据一致性。

:所有数据库操作前请备份数据。补丁请从 AME+ 平台申请。