一 前言
以往公司开发的地理信息系统数据都是存储在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 下载地址
4.2 部署
图1
图2
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