1. 程式人生 > 程式設計 >PostgreSQL空間資料庫建立備份恢復(PostGIS vs ArcGIS)

PostgreSQL空間資料庫建立備份恢復(PostGIS vs ArcGIS)

PostGIS

建立

安裝就不必介紹了,windows下使用安裝工具Application Stack Builder,選擇空間擴充套件PostGIS即可自動安裝

然後新建庫後,在庫中執行以下語句建立控制元件擴充套件

CREATE EXTENSION postgis
複製程式碼

也可以建立資料庫時選擇postgis的模板庫建立

create database postgisdb template postgis_template;
複製程式碼

新建資料庫後新增postgis擴充套件後會發現庫內public模式下函式序列觸發器等都會增加一些postgis相關功能
然後就可以通過PostGIS Shapefile and DBF Loader

工具匯入shp資料

備份

postgersql的備份恢復主要有

  1. 增量備份和基於時間點恢復(RITR)
  2. pg_dump和pg_dumpall進行轉儲,從SQL轉儲檔案恢復
  3. 檔案系統級別備份

這裡我們使用簡單,容易掌握的pg_dump命令,一般在安裝目錄bin下
pg_dump備份單庫,不匯出角色和表空間相關資訊

pg_dump -h localhost -U postgres postgisdb > D:\backup\postgisdb.bak
複製程式碼

有一些引數選項可以參考(很多,具體不列了,執行help可以檢視到)

pg_dump --help
複製程式碼
恢復

恢復可以使用psql

psql -h localhost -U postgres -d postgisdb2 < D:\backup\postgisdb.bak
複製程式碼

恢復時可以指定不同的資料庫,如果pg_dump時-C建立資料庫,那也可以不用先新建資料庫

postgis庫的恢復備份還是挺簡單的,所有的東西都在public下

ArcGIS

建立

ArcGIS要連線到postgresql,需要將postgresql安裝目錄lib下的libeay32.dll、libiconv-2.dll、libintl-8.dll、libpq.dll 和 ssleay32.dll拷貝到ArcGIS Desktop的安裝目錄bin下
將ArcGIS Desktop目錄DatabaseSupport\PostgreSQL下的st_geometry.dll

拷貝到postgresql的lib下

使用ArcGIS工具箱中Create Enterprise Geodatabase工具建立SDE,完事後會在建立一個sde登陸角色並在庫中建立一個sde模式,包含諸多函式序列管理表等。(注意:ArcGIS雖然可以在系統庫postgres中建立SDE擴充套件,然並連不上,ArcGIS不允許連線訪問系統資料庫

然後ArcGIS可以連線該資料庫,並且進行空間資料管理操作。(注意:預設ArcGIS建立空間資料,只能建立在和登陸使用者同名的模式下

備份

我們可以向上面PostGIS備份恢復一樣,直接備份整個庫

恢復

如果恢復至同名資料庫,像上面恢復是沒有問題的
但如果資料庫改名了,則會有驚喜發生,ArcGIS管理空間報底層gdb_release之類的錯誤,同樣的問題不止恢復庫時,修改資料庫名稱也不像其他庫那麼隨心所欲,以含SDE擴充套件的庫為模板建立新庫也會有問題

ArcGIS SDE未見檔案介紹內部結構邏輯,只能猜測大概,或不準確,願聞其詳

ArcSDE空間資料建立時會在SDE管理表裡註冊相關資訊,比如空間參考,列啊,表的唯一標識等,便於它做資料管理、版本控制

修改庫名後,ArcSDE管理就出問題,主要是一些註冊項,安裝SDE時也會把該庫的資訊註冊到SDE管理表中去,所以新庫名,它就不認識了

如果修改了庫名,我們找到以下表

select * from sde.gdb_items
you need modify : name physicalname path etc...

update sde.sde_table_registry set database_name='testdb';
update sde.sde_column_registry set database_name='testdb';
update sde.sde_geometry_columns set f_table_catalog='testdb';
update sde.sde_raster_columns set database_name='testdb';
update sde.sde_layers set database_name='testdb';
複製程式碼

然後就一切正常

當然我們建議不輕易改庫名

這就是商業軟體,足夠強大不夠靈活,封裝和靈活總會互相博弈