一 前言 以往公司開發的地理信息系統數據都是存儲在oracle中,然而在地圖數據的分析和計算中一直存在不小的問題,所以今次我們嘗試使用PostgreSQL+PostGIS來解決這一問題。 本篇筆記的目的就是記錄在研究這一開發路徑期間的“學習的內容”、“遇到的問題和解決過程”以及“簡單的實踐內容”以備 ...
一 前言
以往公司開發的地理信息系統數據都是存儲在oracle中,然而在地圖數據的分析和計算中一直存在不小的問題,所以今次我們嘗試使用PostgreSQL+PostGIS來解決這一問題。
本篇筆記的目的就是記錄在研究這一開發路徑期間的“學習的內容”、“遇到的問題和解決過程”以及“簡單的實踐內容”以備忘。
筆記中可能會出現部分術語概念不准確,還請您能耐心指正或者忽略,反正這是為了我自己能看懂的筆記,你愛看不看。
二 安裝
1.環境
Windows7 64位操作系統(公司工作的台式機,探索階段暫時使用,以後可能會轉到Windows系統的伺服器上去)。
已安裝了Oracle 11g客戶端,這裡將不在介紹oracle的安裝。
2.步驟
基本還是準尋下一步原則,第二步註意一下語言的選擇。
SQL安裝完畢後自動彈出Stack Builder引導安裝PostGIS等其他擴展。
我這裡只選擇了自己需要的PostGIS版本進行了安裝。
詳細可以參考同事整理的安裝文檔:https://www.jianshu.com/p/3b1a4cd8e72e
三 遇到的第一個問題
前一天用著好好的資料庫,第二天服務就死活鏈接不上了,而且在pgAdime里沒有報任何錯誤,就很奇怪。
在嘗試了修改配置文件、分析服務管理器啟動產生的日誌等最終還是沒有奏效,索性卸載乾凈重新安裝,居然就好了。。。
現在仔細想想可能是頭一天嘗試各種配置文件,把整個配置搞毀了,還有就是真有一些奇怪的bug。不過這裡吸取了一個教訓就是,在還沒有做太多工作的前提下,百度多次都沒有明確解決辦法的時候,還不如從頭來過。
不過這裡還是有一些未解決的小問題,就是postgreSQL的日誌文件里的錯誤記錄時不時就有亂碼,而且不是所有中文都亂碼,而是部分報錯的記錄才亂碼,非常的詭異。這個以後要解決一下。
四 Oracle_fdw的安裝部署
4.1 下載地址
https://github.com/laurenz/oracle_fdw/releases/tag/ORACLE_FDW_1_1_0
4.2 部署
圖1
圖2
圖1是解壓後的文件,將文件夾內文件複製到postgresql安裝指定目錄中(圖2)。在postgresql控制臺中輸入
create extension oracle_fdw;
部署成功!
這裡我遇到過的問題是總提示oracle_fdw不是有效的win32程式,因為我的系統是64位系統,PostgreSQL選擇安裝的是64位,oracle_fdw自然選擇的也是64位,為什麼會提示不是有效的32位程式呢?
百度一圈也麽有找到和我相同的問題,只能自己解決,嘗試換32位oracle也未果。
不過後來發現我的oracle客戶端安裝的是32位,抱著試試看的態度,只能又卸載重安了一遍PostgreSQL,這次選擇的是32位,成功了!
五 使用oracle_fdw擴展連接oracle資料庫
5.1 創建server
oracle已經使用多年,在這裡就不總結oracle的配置方法了。
以下代碼可以直接在pgAdmin的SQL查詢工具里直接查詢。
create server oradb foreign data wrapper oracle_fdw options(dbserver 'orcl');
oradb是server的名稱,'orcl'指向tnsnames.ora中配置的實例名。
5.2 授予用戶許可權
grant usage on foreign server oradb to postgres;
將剛創建的服務oradb授予許可權於postgresql用戶postgres。
5.3 資料庫同步
create user mapping for postgres server oradb options(user 'nk_sygis',password 'nk_sygis');
postgres用戶下服務oradb連接oracle資料庫。
六 Oracle外部表應用
6.1建立外部表(foreign table)
選擇oracle中一個有數據的表,先查看結構和數據。
我習慣用Navicat Premium直接導出一個表的結構腳本。
根據oracle中的表,在postgresql中創建同結構的foreign table的sql語句如下:
CREATE FOREIGN TABLE AHW_MAPPOINT_TYPE ( ID integer NOT NULL , TYPENAME VARCHAR(50) NULL , TABLENAME VARCHAR(50) NULL , MAINICON VARCHAR(200) NULL , SUBICON VARCHAR(200) NULL , SPAREICON VARCHAR(200) NULL , ISDEFAULT integer NULL , USERNAME VARCHAR(50) NULL , PERMISSIONUSERS VARCHAR(1000) NULL , DISPLAYFIELD VARCHAR(1000) NULL , ALLFIELD VARCHAR(1000) NULL , SPARE1 VARCHAR(500) NULL , SPARE2 VARCHAR(500) NULL , REMARK VARCHAR(255) NULL )server oradb options(schema 'AHWD',table 'AHW_MAPPOINT_TYPE');
schema:寫oracle中的schema(模式名),table是同步的oracle中的表名稱。
不過這裡要註意pgAdmin資料庫的結構中看不到外部表,不用擔心,只要能正常查詢到就是建立成功了。這一點不太友好,以後要找個更好的工具用了。
6.2查詢
select * from AHW_MAPPOINT_TYPE;
結果如下圖
以上部分內容參考引用了他人的文檔,原地址為:http://blog.csdn.net/freeland1/article/details/42968763