#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. Если обновление каталога просто вернуло то, что вы делали раньше, вероятно, все в порядке. В следующий раз, пожалуйста, не связывайтесь с каталогами.