行,但默认配置会失败——Kettle不校验字段类型兼容性,需手动配置表输出映射:bit→TINYINT(1)并设Integer类型,datetime2→DATETIME(6)且禁用批量更新,uniqueidentifier需去符号后写入VARCHAR(36),nvarchar需UTF-16LE源编码+MySQL端加utf8参数,MySQL 8.0还需调max_allowed_packet、sql_mode等服务端参数,并人工核对行数、bit值、微秒精度及重建外键与auto_increment。

直接用Kettle同步SQL Server到MySQL 8.0行不行?
行,但默认配置会失败——Kettle(Pentaho Data Integration)本身不校验目标库字段类型兼容性,也不自动处理SQL Server的datetime2、bit、uniqueidentifier等类型映射。你看到“成功执行”日志,很可能只是把数据塞进去了,而MySQL表里对应字段是0000-00-00 00:00:00、0或NULL,实际值全丢了。
必须改的Kettle字段映射和转换步骤
在「表输出」步骤中,不能直接拖拽字段连接。必须手动设置每列的「数据库字段名」和「字段类型」,尤其注意:
-
bit字段:SQL Server源字段类型为Boolean,但MySQL目标列必须建为TINYINT(1),Kettle中要显式设为Integer类型,并勾选「Set database field to NULL if value is null」避免空值写入失败 -
datetime2或datetime字段:源端选Date类型,目标列建为DATETIME(6)(MySQL 8.0+支持微秒),Kettle中「字段类型」选Date,且取消勾选「Use batch update」——否则批量插入时精度丢失或报Incorrect datetime value -
uniqueidentifier:源端是String,目标列应为VARCHAR(36),Kettle中需加「字符串操作」步骤,用Replace in string把{、}、-全去掉,再写入 - 含中文或特殊符号的
nvarchar字段:源端字符集必须设为UTF-16LE(SQL Server默认),Kettle「数据库连接」里「连接参数」追加characterEncoding=utf8&useUnicode=true,否则MySQL存成乱码
MySQL 8.0生产环境必须调的几个服务端参数
即使Kettle配置全对,MySQL默认设置也会导致同步中断或截断:
- 插入含长文本字段(如
NVARCHAR(MAX)转TEXT)时,报Packets larger than max_allowed_packet:在my.cnf里设max_allowed_packet = 512M,并重启mysqld - 大批量INSERT卡住或超时:关掉
innodb_lock_wait_timeout的默认50秒限制,设为innodb_lock_wait_timeout = 300 - 时间字段写入报
Invalid default value for 'xxx':MySQL 8.0严格模式默认开启,执行SET sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE';前先运行SET sql_mode = '';临时关闭(仅限迁移期),或建表时明确写DEFAULT CURRENT_TIMESTAMP而非DEFAULT '0000-00-00 00:00:00'
别跳过的验证环节:同步后立刻查这三处
同步任务显示「完成」不等于数据正确。必须人工核对:
- 用
SELECT COUNT(*)比对源表和目标表行数,但注意:SQL Server里SELECT COUNT(*) FROM table可能包含未提交事务的幻读,建议加WITH (NOLOCK);MySQL侧用SELECT TABLE_ROWS FROM INFORMATION_SCHEMA.TABLES只看统计值,不够准,得真COUNT - 抽样查
bit字段:SQL Server里值为1的记录,在MySQL里是否为1(不是-1或NULL);查datetime2字段:用SELECT MICROSECOND(col)确认微秒位是否保留 - 触发器/外键没同步过去——Kettle只做ETL,不迁移DDL。必须单独导出SQL Server的
sp_fkeys结果,手工在MySQL里重建FOREIGN KEY约束,并设ON UPDATE CASCADE等行为(SQL Server默认不级联,MySQL需显式声明)
最易被忽略的是:Kettle作业跑完后,MySQL的auto_increment值没重置。如果原表有自增主键,迁移后新插入数据可能冲突。得手动执行ALTER TABLE tbl AUTO_INCREMENT = (SELECT MAX(id)+1 FROM tbl);


















