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

使用pgloader从MySQL迁移至PostgreSQL遇目标schema未找到错误

问题场景

在同一台Linux机器上部署MySQL和PostgreSQL,使用pgloader迁移MySQL数据库naqaba_portal到PostgreSQL数据库pg_gsc_v2,迁移脚本如下:

LOAD DATABASE
    FROM mysql://master:password@127.0.0.1:3306/naqaba_portal
    INTO postgresql://postgres:password@127.0.0.1:5432/pg_gsc_v2

WITH include no drop, create tables, create indexes, reset sequences, data only;

运行脚本后触发错误:

root@WOQOOF:~# pgloader migrate.load
2024-07-06T08:07:50.008000+08:00 LOG pgloader version "3.6.2"
2024-07-06T08:07:50.100003+08:00 LOG Migrating from #<MYSQL-CONNECTION mysql://move@127.0.0.1:3306/naqaba_portal {1007FAB923}>
2024-07-06T08:07:50.100003+08:00 LOG Migrating into #<PGSQL-CONNECTION pgsql://postgres@127.0.0.1:5432/pg_gsc_v2 {1007FAC643}>
KABOOM!
FATAL error: pgloader failed to find anything in schema "naqaba_portal" in target catalog.
An unhandled error condition has been signalled:
   pgloader failed to find anything in schema "naqaba_portal" in target catalog.

已确认PostgreSQL中已创建目标数据库pg_gsc_v2和schemanaqaba_portal,服务正常且权限配置完整,但问题仍存在。

解决方案

1. 显式指定目标schema的搜索路径

pgloader默认会将MySQL数据库名映射为PostgreSQL的schema名,但如果目标连接未指定搜索路径,可能无法找到该schema。修改迁移脚本的INTO连接串,添加搜索路径参数:

LOAD DATABASE
    FROM mysql://master:password@127.0.0.1:3306/naqaba_portal
    INTO postgresql://postgres:password@127.0.0.1:5432/pg_gsc_v2?options=-csearch_path%3Dnaqaba_portal

WITH include no drop, create tables, create indexes, reset sequences;

注意:移除了data only参数,该参数会跳过表创建步骤,与create tables冲突,导致pgloader找不到预创建的表(若未手动建表)。

2. 检查schema名称的大小写一致性

PostgreSQL对标识符大小写敏感(未加引号时自动转为小写),确认创建schema的语句是:

CREATE SCHEMA naqaba_portal;

如果创建时使用了引号包裹的大小写混合名称(比如CREATE SCHEMA "Naqaba_Portal";),需要在pgloader脚本中用引号指定schema,或调整schema名称与MySQL数据库名大小写完全一致。

3. 手动验证PostgreSQL的schema可用性

登录PostgreSQL命令行,执行以下命令确认schema存在且当前用户有权限访问:

psql -U postgres -d pg_gsc_v2

然后执行:

-- 查看所有schema
SELECT schema_name FROM information_schema.schemata;
-- 确认当前用户对naqaba_portal的权限
SELECT * FROM information_schema.table_privileges WHERE grantee = 'postgres' AND table_schema = 'naqaba_portal';
-- 查看当前搜索路径
SHOW search_path;

如果search_path中没有naqaba_portal,可临时设置:

SET search_path TO naqaba_portal, public;

或永久修改用户的搜索路径:

ALTER ROLE postgres SET search_path TO naqaba_portal, public;

4. 拆分建表与数据加载步骤

如果必须保留data only参数,需先单独执行建表步骤,再加载数据:

  1. 建表脚本:
LOAD DATABASE
    FROM mysql://master:password@127.0.0.1:3306/naqaba_portal
    INTO postgresql://postgres:password@127.0.0.1:5432/pg_gsc_v2?options=-csearch_path%3Dnaqaba_portal

WITH include no drop, create tables, create indexes, reset sequences, schema only;
  1. 数据加载脚本:
LOAD DATABASE
    FROM mysql://master:password@127.0.0.1:3306/naqaba_portal
    INTO postgresql://postgres:password@127.0.0.1:5432/pg_gsc_v2?options=-csearch_path%3Dnaqaba_portal

WITH include no drop, data only;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 10:11:22