postgresql - 当 pg_dump 将数据库复制到服务器时,PostGIS 类型 "geometry"不存在

标签 postgresql postgis pg-dump

许多人已经问过类似的问题,但我还没有找到解决方案。

我正在使用以下方法将 Postgres 数据库从我的本地计算机复制到服务器:

pg_dump -C -h localhost -U localuser dbname | psql -h remotehost -U remoteuser dbname

但是,每当我尝试执行此操作时,任何包含 PostGIS geography 列的表都会被跳过并且不会被复制,并且我会遇到以下错误:

ERROR:  type "<mydb>.geography" does not exist 

尝试的解决方案:

在此服务器上,我已成功安装 PostGIS 并创建了相关扩展:

mydb=# select postgis_version();
            postgis_version            
---------------------------------------
 2.4 USE_GEOS=1 USE_PROJ=1 USE_STATS=1
(1 row)

此外,geometry 是公认的数据类型:

mydb=# \dT *.geometry
                     List of data types
 Schema |   Name   |               Description               
--------+----------+-----------------------------------------
 public | geometry | postgis type: Planar spatial data type.
(1 row)

我的 search_path 包括所有相关内容:

mydb=# show search_path;
      search_path       
------------------------
 mydb, public, postgis

mydb=# SELECT r.rolname, d.datname, rs.setconfig
FROM   pg_db_role_setting rs
LEFT   JOIN pg_roles      r ON r.oid = rs.setrole
LEFT   JOIN pg_database   d ON d.oid = rs.setdatabase
WHERE  r.rolname = 'mydb' OR d.datname = 'mydb';

 rolname | datname |      setconfig       
---------+---------+----------------------
         | mydb    | {search_path=public}
(1 row)

关于可能导致这种头痛的原因,我唯一的猜测是我本地计算机上的 super 用户与远程 super 用户的名称不同。即,localuserremoteuser 不匹配。

最佳答案

答案的其余部分假定您引用的错误是恢复转储时的第一个 错误。如果不是,则可能是早期错误的结果(例如,未能 CREATE EXTENSION postgis)。

如果 PostGIS 安装在两台服务器上,该消息表明它安装在两个数据库的不同模式中。

检查结果

\dx postgis

在两个数据库上进行检查。

由于 PostGIS 不是可重定位的扩展,您必须删除并重新创建它以将其移动到不同的模式。

关于postgresql - 当 pg_dump 将数据库复制到服务器时,PostGIS 类型 "geometry"不存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55155157/

相关文章:

geospatial - 将 MapInfo 数据导入 PostGIS 时如何避免几何问题?

sql - 在 Postgres 中,截断或删除行后,在 pg_dump 优化 pg_restore 之前执行重新索引吗?

postgresql - 更改 LC_CTYPE 以供 PostgreSQL 和 PostGIS 使用

postgresql - Laravel 5.3 Schema::create ENUM 字段是 VARCHAR

postgresql - 在 Postgres 中重命名 nextval ('...' )

sql - 在另一个表中的一行的 UPDATE 中使用同一个表中的多行

postgresql - 如何使用 Homebrew 将 Postgis 安装到 Postgres@9.6 的 Keg 安装中?

postgresql - 在仍有许多事件事务的同时执行 pg_dump

postgresql - pg_dump windows命令提示无效命令

sql - 按相同值对分区进行排序