有没有办法让pg_dump不使用search_path作为模式

问题描述 投票:0回答:1

问题: 有没有办法让 pg_dump 命令不使用 search_path 设置模式,而是使用表名定义模式

我的一般情况是,我正在尝试转储和恢复包含许多架构的 postgis 数据库(这是为了将我的数据库迁移到 Amazon RDS)。在每个模式中,我都有包含地理列的表。从转储中生成的 SQL 类似于:

CREATE SCHEMA aaaa; 
SET search_path = aaaa, pg_catalog;

SET default_tablespace = '';
SET default_with_oids = false;
--
-- TOC entry 346 (class 1259 OID 1135099)
-- Name: main; Type: TABLE; Schema: aaaa; Owner: -
--
CREATE TABLE main (
    pk bigint NOT NULL,
    geometry public.geography(Geometry,4283),
    batch bigint NOT NULL,
    json jsonb NOT NULL,
    cache jsonb NOT NULL,
    active bigint DEFAULT date_part('epoch'::text, now()) NOT NULL,
    inactive bigint DEFAULT '8640000000000000'::bigint NOT NULL );

但是,恢复时出现以下错误:

pg_restore:[归档器(db)]来自 TOC 条目 346 的错误; 1259 1135099 表主mapworks pg_restore:[archiver(db)]无法执行 查询:错误:关系“spatial_ref_sys”不存在第3行:
几何公共.地理(几何,4283), ^ 查询:从spatial_ref_sys 中选择proj4text,其中srid = 4283 LIMIT 1 命令是:CREATE TABLE main ( pk bigint NOT NULL, 几何公共.地理(几何,4283), 批处理 bigint NOT NULL, jso...

然后事情就从那里开始变成梨形。

到目前为止我推断的是,由于“public”模式不包含在搜索路径中,因此该操作无法找到“spatial_ref_sys”表。 奇怪的是,如果 EPSG 代码是 4326,则效果很好。

那么……我能做什么呢?有没有办法告诉 pg_dump 不要使用 search_path?

我要从中转储的服务器

x86_64-pc-linux-gnu 上的 PostgreSQL 9.6.1,由 gcc (Debian 4.9.2-10) 4.9.2 编译,64 位

POSTGIS="2.3.1 r15264" GEOS="3.4.2-CAPI-1.8.2 r3921" PROJ="Rel. 4.8.0,2012 年 3 月 6 日" GDAL="GDAL 1.10.1,2013/08/26 发布" LIBXML="2.9.1" LIBJSON="0.11.99" (来自“2.3.0 r15146”的核心过程需要升级) TOPOLOGY(来自“2.3.0 r15146”的拓扑过程需要升级) RASTER(来自“2.3.0 r15146”的光栅过程) 0 r15146”需要升级)

我要恢复的服务器:

x86_64-pc-linux-gnu 上的 PostgreSQL 9.6.1,由 gcc (GCC) 4.8.2 20140120 (Red Hat 4.8.2-16) 编译,64 位

POSTGIS="2.3.0 r15146" GEOS="3.5.0-CAPI-1.9.0 r4084" PROJ="Rel. 4.9.2,2015 年 9 月 8 日" GDAL="GDAL 2.1.1,2016/07/07 发布“ LIBXML =“2.9.1”LIBJSON =“0.12”拓扑栅格

postgresql postgis pg-dump pg-restore postgresql-9.6
1个回答
0
投票

这个问题已在最新的 PostgreSQL 版本中得到修复。

pg_dump
现在将
search_path
设置为空,并包含所有对象的模式名称。

© www.soinside.com 2019 - 2024. All rights reserved.