使用Embulk迁移SQL Server至PostgreSQL遇方法缺失错误求助
问题:Embulk迁移SQL Server到PostgreSQL时出现NoSuchMethodError错误
环境配置
- Java版本:1.8
- SQL Server驱动:sqljdbc42.jar
- PostgreSQL驱动:postgresql-42.7.0.jar
- PostgreSQL版本:15.4
- 已安装的Embulk插件:
- embulk-input-sqlserver (0.13.2 java)
- embulk-output-postgresql (0.8.7)
错误日志
初始运行日志
2023-12-04 18:49:04.164 +0300 [INFO] (0001:transaction): Loaded plugin embulk-input-sqlserver (0.13.2) 2023-12-04 18:49:04.221 +0300 [INFO] (0001:transaction): Loaded plugin embulk-output-postgresql (0.8.7) 2023-12-04 18:49:04.338 +0300 [WARN] (0001:transaction): "UTC" is recognized as "Z" to be compatible with the legacy style.
报错堆栈信息
org.embulk.exec.PartialExecutionException: java.lang.RuntimeException: java.lang.NoSuchMethodError: org.embulk.spi.time.Timestamp.ofInstant(Ljava/time/Instant;)Lorg/embulk/spi/time/Timestamp; at org.embulk.exec.BulkLoader$LoaderState.buildPartialExecuteException(BulkLoader.java:375) at org.embulk.exec.BulkLoader.doRun(BulkLoader.java:607) at org.embulk.exec.BulkLoader.access$000(BulkLoader.java:35) at org.embulk.exec.BulkLoader$1.run(BulkLoader.java:391) at org.embulk.exec.BulkLoader$1.run(BulkLoader.java:387) at org.embulk.spi.Exec.doWith(Exec.java:25) at org.embulk.exec.BulkLoader.run(BulkLoader.java:387) at org.embulk.EmbulkEmbed.run(EmbulkEmbed.java:180) at org.embulk.EmbulkRunner.runInternal(EmbulkRunner.java:331) at org.embulk.EmbulkRunner.run(EmbulkRunner.java:174) at org.embulk.cli.EmbulkRun.runSubcommand(EmbulkRun.java:468) at org.embulk.cli.EmbulkRun.run(EmbulkRun.java:100) at org.embulk.cli.Main.main(Main.java:28) Caused by: java.lang.RuntimeException: java.lang.NoSuchMethodError: org.embulk.spi.time.Timestamp.ofInstant(Ljava/time/Instant;)Lorg/embulk/spi/time/Timestamp; at org.embulk.exec.BulkLoader$LoaderState.getRepresentativeException(BulkLoader.java:315) at org.embulk.exec.BulkLoader.execute(BulkLoader.java:732) at org.embulk.exec.BulkLoader.access$300(BulkLoader.java:35) at org.embulk.exec.BulkLoader$4$1$1$1.run(BulkLoader.java:568) at org.embulk.output.jdbc.AbstractJdbcOutputPlugin.transaction(AbstractJdbcOutputPlugin.java:423) at org.embulk.exec.BulkLoader$4$1$1.transaction(BulkLoader.java:560) at org.embulk.exec.LocalExecutorPlugin.transaction(LocalExecutorPlugin.java:54) at org.embulk.exec.BulkLoader$4$1.run(BulkLoader.java:555) at org.embulk.spi.util.Filters$RecursiveControl.transaction(Filters.java:96) at org.embulk.spi.util.Filters.transaction(Filters.java:49) at org.embulk.exec.BulkLoader$4.run(BulkLoader.java:549) at org.embulk.input.jdbc.AbstractJdbcInputPlugin.transaction(AbstractJdbcInputPlugin.java:230) at org.embulk.exec.BulkLoader.doRun(BulkLoader.java:544)
已尝试操作
- 更换SQL Server、PostgreSQL驱动版本
- 更换Embulk输入/输出插件版本
上述操作均未解决问题。
解决建议
该错误由Embulk核心版本与插件版本不兼容导致:org.embulk.spi.time.Timestamp.ofInstant方法是在Embulk 0.10.19版本中引入的,若当前Embulk核心版本低于该版本,插件调用此方法时会抛出NoSuchMethodError。
具体修复步骤
检查Embulk核心版本
运行以下命令查看当前Embulk版本:embulk --version匹配核心与插件版本
- 如果Embulk核心版本 < 0.10.19:
- 降级
embulk-output-postgresql到0.7.x系列(该系列不依赖Timestamp.ofInstant方法),执行:embulk gem uninstall embulk-output-postgresql embulk gem install embulk-output-postgresql -v 0.7.12 - 或升级Embulk核心到0.10.19及以上版本(注意核心升级后需确保所有插件兼容新版本)。
- 降级
- 如果Embulk核心版本 >= 0.10.19:
- 确保插件版本与核心版本匹配,建议升级
embulk-input-sqlserver到最新兼容版本,执行:embulk gem update embulk-input-sqlserver
- 确保插件版本与核心版本匹配,建议升级
- 如果Embulk核心版本 < 0.10.19:
清理Embulk缓存
清理旧插件缓存避免类冲突:embulk gem cleanup验证配置
重新运行迁移任务,确认错误是否消失。
内容的提问来源于stack exchange,提问作者Onur Kaya
相关产品推荐
相关产品推荐

