mysql归档表结构不一致时kettle抽取报column count doesn't match,需显式写select字段并按目标顺序排列、手动绑定列、禁用自动建表;对text/blob加jdbc参数;分批次滚动抽取避免oom;禁用bulk loader改用批量insert;时间字段非法值需date_format或zerodatetimebehavior=converttonull处理。

MySQL 归档表结构不一致时,Kettle 抽取直接报错 Column count doesn't match value count
归档表常因历史原因字段增减、类型变更或缺失主键,Kettle 的 Table Input 步骤默认按 SELECT * 推断元数据,一旦源表列数/顺序与目标表不匹配,写入时就会崩在 JDBC 层。别指望“自动映射”能兜底。
实操建议:
- 在
Table Input中**显式写出 SELECT 字段列表**,按目标表字段顺序排列,NULL 值用NULL AS field_name补位 - 目标
Table Output步骤勾选Specify database fields,手动绑定每列,禁用Auto-create target table - 若归档表存在 TEXT/BLOB 类型,确认 MySQL 连接 URL 加了
useServerPrepStmts=false&rewriteBatchedStatements=true,否则批量插入可能触发Data truncation
用 Get Rows from Result + Copy rows to result 实现分批次滚动抽取
单次拉取千万级归档数据容易 OOM 或拖垮 MySQL 从库。Kettle 原生不支持 LIMIT/OFFSET 分页(尤其跨版本 MySQL 的 OFFSET 性能极差),得靠结果集流转模拟“游标”。
实操建议:
- 首层作业用
SQL步骤查出所有归档表名,写入结果集;再用For Each遍历每个表名,传参给子转换 - 子转换内:先用
Table Input查SELECT MIN(id), MAX(id) FROM ${table}获取主键范围;再用JavaScript步骤按步长(如 50000)生成起止 ID 数组,写入结果集 - 嵌套一层
For Each,每次传start_id和end_id给Table Input:SELECT * FROM ${table} WHERE id BETWEEN ? AND ?
MySQL Bulk Loader 步骤在归档场景下基本不可用
这个步骤依赖 LOAD DATA INFILE,要求 Kettle 进程能直连 MySQL 服务端且有文件系统写入权限——但归档库往往部署在隔离网络、禁用 LOCAL INFILE,或表引擎是 Archive(不支持 LOAD DATA)。
实操建议:
- 优先用
Table Output+Insert / Update模式,开启Commit size(如 10000)和Use batch update - 若目标库支持,改用
MySQL Bulk Loader的替代方案:在目标端预置空表,用 Kettle 导出 CSV 到中间目录,再由 DBA 手动执行mysqlimport或LOAD DATA - 注意字符集:导出 CSV 前在
Text file output设置Encoding为UTF-8,并在 MySQL 连接 URL 加characterEncoding=utf8mb4
时间字段迁移后值全变成 0000-00-00 00:00:00
MySQL 5.6+ 默认 sql_mode 包含 NO_ZERO_DATE,而老归档表里大量存着非法日期(如 0000-00-00、2020-00-00)。Kettle 读出来是字符串,但写入时 JDBC 驱动会尝试转成 java.sql.Timestamp,失败就塞零值。
实操建议:
- 在
Table Input的 SQL 中,把时间字段包装成字符串:DATE_FORMAT(create_time, '%Y-%m-%d %H:%i:%s') AS create_time - 目标
Table Output对应字段类型设为String,写入后再用 MySQL 的STR_TO_DATE()在库内清洗 - 更彻底的解法:连接 URL 加参数
zeroDateTimeBehavior=convertToNull,让驱动把非法时间转成 NULL,再在 Kettle 里用Set value field步骤统一处理
实际跑起来你会发现,最难的不是抽数据,而是搞清每张归档表当年建表时到底开了哪些 sql_mode、用了什么 client 端时区、有没有被 mysqldump -T 二次加工过——这些细节不核对,光调 Kettle 参数没用。











