You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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。

具体修复步骤

  1. 检查Embulk核心版本
    运行以下命令查看当前Embulk版本:

    embulk --version
    
  2. 匹配核心与插件版本

    • 如果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
        
  3. 清理Embulk缓存
    清理旧插件缓存避免类冲突:

    embulk gem cleanup
    
  4. 验证配置
    重新运行迁移任务,确认错误是否消失。

内容的提问来源于stack exchange,提问作者Onur Kaya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 22:33:23