Тип PostGIS «геометрия» не существует при копировании базы данных pg_dump на сервер

#postgresql #postgis #pg-dump

#postgresql #postgis #pg-дамп

Вопрос:

Аналогичный вопрос многим, которые уже задавались, но мне еще предстоит найти решение.

Я копирую базу данных 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)
  

Мое единственное предположение относительно того, что может быть причиной этой головной боли, заключается в том, что имя суперпользователя на моем локальном компьютере не совпадает с именем удаленного суперпользователя. Т.е., localuser и remoteuser не совпадают.

Ответ №1:

Остальная часть ответа предполагает, что ошибка, которую вы цитируете, является первой ошибкой при восстановлении дампа. Если нет, это может быть следствием более ранней ошибки (например, сбой CREATE EXTENSION postgis ).

Если PostGIS установлен на обоих серверах, сообщение предполагает, что он установлен в разных схемах в обеих базах данных.

Изучите результат

 dx postgis
  

для проверки в обеих базах данных.

Поскольку PostGIS не является перемещаемым расширением, вы должны удалить и заново создать его, чтобы переместить в другую схему.

Комментарии:

1. Спасибо, Laurenz. Для будущих посетителей: PostGIS был установлен в <mydb> схеме, а не public на моем локальном компьютере, в то время как установлен в public на моем удаленном компьютере. Чтобы решить эту проблему, я переместил PostGIS в public на моем локальном: UPDATE pg_extension SET extrelocatable = TRUE WHERE extname = 'postgis'; ALTER EXTENSION postgis SET SCHEMA public;

2. Это, вероятно, приведет к сбою вашей установки PostGIS. По всей вероятности, есть причина, по которой расширение невозможно переместить.

3. К счастью, пока все работает так, как ожидалось. Когда я некоторое время назад впервые создал базу данных, я изначально перенес установку с public на mydb (по какой-то причине, которую я не могу вспомнить). Итак, по сути, я переношу ее обратно туда, откуда она была взята … в любом случае, я доволен, пока мои таблицы удалены с моего локального — мой компьютер на последнем издыхании, и я не хочу потерять свои данные! Это моя основная мотивация для переноса всего.

4. Если обновление каталога просто вернуло то, что вы делали раньше, вероятно, все в порядке. В следующий раз, пожалуйста, не связывайтесь с каталогами.