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

使用Pgloader迁移MySQL到PostgreSQL时解析加载文件报错求助

解决Pgloader配置文件解析错误的方案

问题根源

报错指向AFTER LOAD DO语句末尾,本质是配置文件存在两处语法/格式问题:

  1. $$标记后多余的分号干扰解析
  2. Windows换行符(CRLF)与Linux容器环境不兼容

修复步骤

1. 修正BEFORE/AFTER LOAD DO语法

Pgloader中,$$是SQL代码块的结束标记,无需在其后额外加分号。多余的分号会让解析器误认为还有后续命令,但文件已到结尾,触发解析错误。

修改配置文件对应部分:

-- 原错误写法
BEFORE LOAD DO
  $$ SET session_replication_role = 'replica'; $$;

AFTER LOAD DO
  $$ SET session_replication_role = 'origin'; $$;

-- 修改后正确写法
BEFORE LOAD DO
  $$ SET session_replication_role = 'replica'; $$

AFTER LOAD DO
  $$ SET session_replication_role = 'origin'; $$

2. 转换文件换行符为Unix格式

你用Windows路径挂载到Linux Docker容器,配置文件默认是CRLF换行,Pgloader在Linux环境下仅识别LF换行。转换方法:

  • 用Notepad++打开文件,点击「编辑」→「文档格式转换」→「转换为Unix(LF)」
  • 保存后重新执行迁移命令

修改后的完整配置文件

LOAD DATABASE
  FROM      mysql://xxx
  INTO postgresql://yyy

WITH data only,
  workers = 8, concurrency = 1,
  multiple readers per thread, rows per range = 50000

SET MySQL PARAMETERS
  net_read_timeout  = '120',
  net_write_timeout = '120'

CAST type bigint when (= precision 20) to bigserial drop typemod,
  type date drop not null drop default using zero-dates-to-null,
  type tinyint to boolean using tinyint-to-boolean,
  type year to integer;

BEFORE LOAD DO
  $$ SET session_replication_role = 'replica'; $$

AFTER LOAD DO
  $$ SET session_replication_role = 'origin'; $$

完成以上修改后,重新执行原Docker命令即可正常解析配置文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 17:42:29