# 常见问题-任务类(FAQ)

📚 温馨提示: 据用户反馈统计,95% 的使用问题都能通过认真阅读文档得到解决。我们建议您在联系客服前,先查阅相关操作指南、配置说明或本 FAQ。这不仅能更快定位问题,还能帮助您更深入地掌握 DataMover 的强大能力。

阅读即赋能,理解即掌控。祝您使用愉快,数据流转如丝般顺滑!✨

  • 📞 客服电话:18032410846
  • 💬 微信客服:扫描官网二维码添加
  • 📧 邮箱:service@datamover.cm

恭喜你已经完成了DataMover的安装,管理界面和执行引擎都已正常启动,下面是常见的数据同步过程中的问题。

# 1. 实时任务启动失败:未开启CDC

DataMover 支持两类任务:

  • 普通任务

    • 全量同步:适用于数据量较小的表,可选择“清空目标表后同步”,通常用于每日一次初始化。
    • 增量同步:适用于大表,基于增量字段(如自增主键、create_timeupdate_time)周期性同步新增/变更数据。
  • 实时任务
    基于数据库的 CDC(Change Data Capture)机制,实时捕获源库的 INSERT / UPDATE / DELETE / TRUNCATE 操作,并在目标库重放对应 SQL。

# 🔍 排查步骤:

  1. 确认源数据库已正确开启 CDC 功能
    不同数据库要求如下:

    • MySQL:必须开启 binlog,且格式为 ROW,例如:

      [mysqld]
      log-bin=mysql-bin
      binlog-format=ROW
      server-id=1
      
    • PostgreSQL:需开启 WAL 并设置 wal_level = logical,同时创建具有 REPLICATION 权限的用户。

    • SQL Server:需启用数据库级 CDC 和具体表的 CDC。

    • Oracle:需配置并启动 LogMiner,并授予相应权限。

  2. 确认 JDBC 账号具备 CDC 订阅权限
    例如:

    • MySQL 用户需拥有 REPLICATION SLAVEREPLICATION CLIENT 权限;
    • PostgreSQL 用户需有 LOGIN + REPLICATION 属性;
  • 权限不足将导致任务启动即报错(常见错误如 CanalParseException)。
  1. 建议首次使用先验证基础连通性
    • 先选择一张小表,创建一个普通全量任务进行一次性同步。
    • 若成功,说明网络、账号、驱动等基础配置无误;
    • 再在此基础上配置实时任务或复杂增量任务,降低排查难度。

# 2. 任务运行失败:通用方案

任务运行失败不要慌,点击任务操作列点击更多操作中的日志按钮,下载任务日志。

压缩包中有三个文件reader.log(源端数据抽取日志)、writer.log(目的端写入日志)、worker.log(引擎调度日志)。

将日志中的***报错信息发给AI***,他会告诉你问题原因,能帮助你解决百分之九十的问题

image-20260107220544248

# 3. 任务运行失败001:目标字段非空约束冲突

现象 同步任务因目标表字段设置了 NOT NULL 约束而失败,但源数据中该字段存在空值。

示例日志

ERROR 2026-01-07 09:09:18.144 [exec-8] xxxxxxxx.x(154): 数据库批量Upsert出错,table=sync_target_table(0,1000)org.springframework.dao.DataIntegrityViolationException: PreparedStatementCallback; SQL [INSERT INTO `sync_target_table`(`id`, `result_id`, `metric_a`, `metric_b`, `wavelength`, `value`) VALUES (?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE `id` = VALUES(`id`), `result_id` = VALUES(`result_id`), `metric_a` = VALUES(`metric_a`), `metric_b` = VALUES(`metric_b`), `wavelength` = VALUES(`wavelength`), `value` = VALUES(`value`)]; Column 'wavelength' cannot be null; nested exception is java.sql.BatchUpdateException: Column 'wavelength' cannot be null

原因分析 目标表的 wavelength 字段不允许为空,但源表对应记录中该值为 NULL 或缺失,导致数据库拒绝写入。

解决方案 在 DataMover 的字段映射中,为该字段配置默认值,避免空值写入。例如:

default(wavelength, '0')

✅ 支持任意默认值,如 'N/A''未知'0 等,根据业务语义选择。


# 4. 任务运行失败002:主键自增与多源同步冲突

现象 目标表主键设置为自增(AUTO_INCREMENT),但在多源同步或保留源 ID 的场景下,容易引发主键重复或写入异常。

原因分析

  • 若多个源表同步到同一张目标表,源端 ID 可能重复;
  • 若目标表启用自增主键,又试图写入显式 ID 值,部分数据库(如 MySQL)会报错或产生意外行为。

推荐方案 不要依赖自增主键,而是新增一个全局唯一标识字段作为主键。 在 DataMover 映射配置中,为目标表的主键字段使用内置函数生成 UUID:

uuid()

✅ 该方式确保每条记录全局唯一,彻底规避主键冲突问题,适用于多源合并、跨库同步等复杂场景。


# 5. 任务运行失败003:数据类型转换失败

现象 源表以字符串(如 VARCHAR)存储数值或带单位的数据(如 "156CM"),但目标表字段为数值类型(如 DECIMAL),导致转换失败。

示例日志(脱敏)

ERROR 2026-01-07 11:54:59.699 [exec-16] 7ddd1167076944958678d209bb9e00c3.a(99): Data format conversion exception, field:wal_length, trying to convert 156CM to BigDecimal: java.lang.IllegalStateException: 转换出错,null

解决方案(二选一)

# 方案一:保留原始格式

将目标表字段类型改为 VARCHAR,直接存储原始字符串,避免清洗逻辑。

# 方案二:清洗为纯数值(推荐)

使用 DataMover 函数表达式提取有效数字。例如,将 "156CM""170 cm" 等清洗为 156170

int(trim(replace(replace(lower(val(height)), 'cm', ''), ' ', '')))

💡 不熟悉函数写法?只需将 函数使用指南链接发送给任意 AI 助手(如通义千问),它能根据你的需求自动生成可用表达式!

# 6. 任务运行失败004:外面约束失败

目标表有外键约束,主表中值不存在,导致子表入库失败。

ERROR 2026-01-07 14:48:36.365 [exec-16] xxxxxxxx.x(154): 数据库批量Upsert出错,table=detail_table(22000,22994):
org.springframework.dao.DataIntegrityViolationException: PreparedStatementCallback; SQL [INSERT INTO `detail_table`(`id`, `parent_id`, `wavelength`, `insertion_loss`, `return_loss`, `responsivity`, `directivity`, `sub_result`, `work_order`, `serial_no`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE `id` = VALUES(`id`), `parent_id` = VALUES(`parent_id`), `wavelength` = VALUES(`wavelength`), `insertion_loss` = VALUES(`insertion_loss`), `return_loss` = VALUES(`return_loss`), `responsivity` = VALUES(`responsivity`), `directivity` = VALUES(`directivity`), `sub_result` = VALUES(`sub_result`), `work_order` = VALUES(`work_order`), `serial_no` = VALUES(`serial_no`)]; Cannot add or update a child row: a foreign key constraint fails (`target_db`.`detail_table`, CONSTRAINT `detail_table_ibfk_1` FOREIGN KEY (`parent_id`) REFERENCES `main_table` (`id`) ON DELETE CASCADE); nested exception is java.sql.BatchUpdateException: Cannot add or update a child row: a foreign key constraint fails (`target_db`.`detail_table`, CONSTRAINT `detail_table_ibfk_1` FOREIGN KEY (`parent_id`) REFERENCES `main_table` (`id`) ON DELETE CASCADE)

错误原因: 程序尝试向子表(detail_table)插入数据时,其关联的主表外键字段(parent_id)在主表(main_table)中不存在对应记录,违反了数据库的外键约束

典型场景

  • 主表数据尚未同步完成,子表数据已开始写入;
  • 源数据中的 parent_id 值有误或已被删除;
  • 同步任务未按“先主表、后子表”的顺序执行。

解决建议

  1. 确保主表(main_table)中已存在对应的 id 记录;
  2. 检查源数据中 parent_id 字段的值是否有效且一致;
  3. 调整同步任务依赖关系,保证主表数据先于子表写入,使用CRON调度,精确空值主表和子表的同步时间。