如何使用Kettle工具批量抽取迁移历史MySQL归档数据?

轻涛大大_3889

轻涛大大_3889

2026-10-02

592人浏览

原创

MySQL归档表结构不一致时Kettle抽取报Column count doesn't match,需显式写SELECT字段并按目标顺序排列、手动绑定列、禁用自动建表;对TEXT/BLOB加JDBC参数;分批次滚动抽取避免OOM;禁用Bulk Loader改用批量Insert;时间字段非法值需DATE_FORMAT或zeroDateTimeBehavior=convertToNull处理。

如何使用kettle工具批量抽取迁移历史mysql归档数据?

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)。

MySQL8 CRM Schema Design Expert
MySQL8 CRM Schema Design Expert

面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。

下载

实操建议:

  • 优先用 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 参数没用。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

2453

6

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.21

1479

5

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

875

5

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.19

3492

5

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.25

6028

4

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.08

1279

3

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.11

6271

4

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

2023.08.14

5402

7

mysql事务隔离级别
mysql事务隔离级别

mysql规范中定义了四种事务隔离级别,不同的隔离级别对事务的处理有所不同。本专题为大家提供mysql事务隔离级别相关的文章内容,大家可以免费体验。

2023.08.16

7314

11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 193人学习