2015-11-24 55 views
3

我需要將PostGIS安裝從數據庫A移動到新的數據庫B.我在A上有PostGIS 2.1.7,在B上有2.1.8。兩個數據庫都是相同的 - 版本PostgreSQL是9.4.4。上的一個延伸的PostGIS的PostGIS的pg_dump:模式爲空

配置是以下:

         List of installed extensions 
Name | Version | Schema |        Description 
------------+---------+------------+--------------------------------------------------------------------- 
btree_gist | 1.0  | edrive  | support for indexing common datatypes in GiST 
plpgsql | 1.0  | pg_catalog | PL/pgSQL procedural language 
postgis | 2.1.7 | postgis | PostGIS geometry, geography, and raster spatial types and functions 
(3 rows) 

同樣是在B(除了PostGIS的2.1.8)。

命令我使用的出口:

pg_dump -Fc -b A -p 5433 -U postgres > A.dmp 

的恢復:

pg_restore -Fc -d B -p 5432 A.dmp 

這裏是日誌的一部分:

pg_restore: [archiver (db)] could not execute query: ERROR: type "postgis.geometry" does not exist 
LINE 9:  location postgis.geometry(Point,4326), 
        ^

現在讓我們看看在A的內部.dmp - spatial_ref_sys表是空的,只是一個COPY命令,沒有數據:

COPY spatial_ref_sys (srid, auth_name, auth_srid, srtext, proj4text) FROM stdin; 
.....postgis..........postgres.....false.....347.............................0.....17220.....roles. 
...TABLE DATA................N...COPY roles (id, name, createdate, updatedate, description, value) FROM stdin; 
.....security..........services... 

問題是 - 爲什麼pg_dump沒有轉儲PostGIS模式的內容?

UPD1:普通文本格式轉儲

內容:

COPY spatial_ref_sys (srid, auth_name, auth_srid, srtext, proj4text) FROM stdin; 
\. 

但是我們可以看到3911個記錄有:

edrivep1=# select count(*) from postgis.spatial_ref_sys; 
count 
------- 
    3911 
(1 row) 

-bash-4.1$ pg_restore -l edrivep1.dmp | grep spatial 
4932; 0 79804 TABLE DATA postgis spatial_ref_sys postgres 
爲spatial_ref_sys數據
+0

這看起來像你沒有在新機器上安裝並啓用postgis。 – wildplasser

+0

源轉儲爲空 - 因此,問題不在新數據庫中。 – maksim2020

+0

'type「postgis.geometry」不存在'意味着該類型不存在。這些類型(點,多邊形,幾何,...)是通過安裝postgis創建的。在新機器上。在閱讀轉儲之前。 – wildplasser

回答

1

問題m已解決。第二個數據庫B的postgis模式有一個錯誤的search_path - 當我將postgis的模式更改爲public並將search_path設置爲兩個數據庫上的edrive,public,postgis時,那麼一切都很順利。