使用Pgloader迁移MySQL到PostgreSQL时解析加载文件报错求助
解决Pgloader配置文件解析错误的方案
问题根源
报错指向AFTER LOAD DO语句末尾,本质是配置文件存在两处语法/格式问题:
$$标记后多余的分号干扰解析- 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
相关产品推荐
相关产品推荐

