Talend开源ETL锁等待超时求助:MSSQL同步MySQL失败
解决Talend同步MSSQL到MySQL时的锁等待超时问题
碰到MySQL的Lock wait timeout exceeded这种问题我太熟悉了,结合你用Talend同步8000条记录的场景,给你几个实战有效的解决方向:
调整MySQL锁超时参数
默认的innodb_lock_wait_timeout是50秒,你的日志里显示等待了约100秒才超时,说明当前事务等待锁的时间超过了系统设置。可以先临时调整全局参数应急:SET GLOBAL innodb_lock_wait_timeout = 120; -- 单位:秒如果要永久生效,修改MySQL配置文件(my.cnf或my.ini),添加或修改:
innodb_lock_wait_timeout = 120改完重启MySQL服务即可。不过这只是临时缓解,最好找到锁竞争的根源。
排查MySQL中的锁占用情况
用以下SQL找出阻塞事务的源头:-- 查看当前所有InnoDB事务 SELECT trx_id, trx_state, trx_started, trx_query FROM information_schema.innodb_trx; -- 查看当前锁信息 SELECT * FROM information_schema.innodb_locks; -- 查看锁等待关系 SELECT * FROM information_schema.innodb_lock_waits;重点看有没有长时间运行的事务,或者Talend之前的同步任务没正常结束导致锁未释放,找到后可以手动终止对应的事务(注意:终止前确认不会影响其他业务)。
优化Talend同步逻辑
- 调整批量提交频率:在Talend的
tMysqlOutput组件里,把「Commit every」参数从默认的1000调大(比如2000或5000),减少事务提交次数,降低锁竞争概率。 - 降低事务隔离级别:MySQL默认是
REPEATABLE READ,如果业务允许,改成READ COMMITTED可以缩小锁的范围。在Talend的MySQL连接配置里,添加自定义JDBC参数:transactionIsolation=READ_COMMITTED。 - 避免并发冲突:确认同步时MySQL集群没有其他写操作(比如备份、报表任务、其他更新脚本),尽量在业务低峰期执行同步。
- 调整批量提交频率:在Talend的
检查数据与约束问题
如果同步的8000条数据里存在重复的主键/唯一键,插入或更新时会触发锁等待。可以在Talend里添加去重逻辑(比如用tUniqRow组件),或者先在MSSQL端清理重复数据,避免因为数据冲突导致事务长时间等待锁。
要是以上方法都没解决,建议查看Talend任务的执行日志,看看是不是某条特定数据导致的慢操作,或者分析MySQL的慢查询日志,找出拖慢事务的语句进行优化。
内容的提问来源于stack exchange,提问作者Antony
相关产品推荐
相关产品推荐

