ODC插入测试数据,插入失败

【 使用环境 】测试环境
【 ODC 】4.3
【 使用版本 】4.3
【问题描述】模拟数据插入10万条数据,插入失败。
【复现路径】依据OBCA_v4认证的实验6,插入测试数据,插入失败。
【附件及日志】
odc_task_37.log (19.7 KB)
@论坛小助手

1 个赞

根据您提供的日志信息和问题描述,ODC 在插入测试数据时失败的原因是由于主键冲突导致的。以下是详细的分析和解决方案:

问题分析

从日志中可以看到以下关键信息:

  • SQL 语句INSERT INTO school_db.students (S_ID, CS_ID, S_Name, Age, Sex) VALUES (?, ?, ?, ?, ?)
  • 错误信息Duplicate entry 'XXX' for key 'PRIMARY'

这表明在插入数据时,某些记录的 S_ID 值已经存在于表 school_db.students 的主键列中,导致主键冲突。

解决方案

1. 检查主键冲突

  • 确认表 school_db.students 的主键列 S_ID 是否存在重复值。
  • 使用以下 SQL 查询来检查是否存在重复的 S_ID 值:
    SELECT S_ID, COUNT(*) AS count
    FROM school_db.students
    GROUP BY S_ID
    HAVING COUNT(*) > 1;
    
    如果查询结果不为空,则说明表中已经存在重复的主键值。

2. 调整插入逻辑

  • 确保生成的 S_ID 唯一性:如果模拟数据生成器生成的 S_ID 值可能重复,可以调整生成逻辑,例如使用自增序列或 UUID。
  • 批量插入前去重:在插入数据之前,先检查目标表中是否已存在相同的 S_ID 值。可以通过以下 SQL 实现:
    INSERT INTO school_db.students (S_ID, CS_ID, S_Name, Age, Sex)
    SELECT t.S_ID, t.CS_ID, t.S_Name, t.Age, t.Sex
    FROM (VALUES (?, ?, ?, ?, ?), (?, ?, ?, ?, ?)) AS t(S_ID, CS_ID, S_Name, Age, Sex)
    WHERE NOT EXISTS (
        SELECT 1
        FROM school_db.students s
        WHERE s.S_ID = t.S_ID
    );
    

3. 修改主键策略

  • 如果允许 S_ID 重复,但需要区分不同的记录,可以考虑将主键改为复合主键(例如 S_ID 和其他列组合)。
  • 或者移除主键约束,改为唯一索引或其他约束方式。

4. 捕获并忽略重复插入

  • 如果允许重复插入失败的情况,可以在插入时捕获异常并忽略重复记录。例如,在 ODC 的任务配置中启用“忽略插入失败”的选项(如果支持)。

5. 清空目标表

  • 如果目标表中的数据可以被清空,可以在插入前执行以下操作:
    TRUNCATE TABLE school_db.students;
    
    这样可以确保表中没有历史数据干扰。

总结

根据文档库中的信息,主键冲突是导致插入失败的主要原因。建议按照上述步骤逐一排查并解决问题。如果仍有疑问,请提供更多上下文信息(如表结构、模拟数据生成逻辑等),以便进一步分析。

如果您需要更具体的帮助,也可以联系 OceanBase 的人工答疑团队获取支持。

详情请参考:

  1. ODC V3.3.0
  2. OBCDC 支持增量旁路导入
  3. 5000 ~ 5999
  4. ODC V4.3.0
  5. ODC V3.2.0
  6. 数据归档
  7. Web 版 ODC 部署及启动问题
2 个赞

学到了

1 个赞