文档章节

PostgreSQL跨库操作Oracle利器-Oracle_fdw

遥想公瑾当年
 遥想公瑾当年
发布于 2017/06/01 09:47
字数 796
阅读 111
收藏 0

Oracle_fdw是PG的一个外部数据接口,可以使PostgreSQL轻松跨库操作Oracle。Oracle_fdw的作用有以下两点:

  • PG可以跨库增删改查Oracle中的表,可以查询Oracle的视图,可以使PG中的表和Oracle中表/视图作Join查询,类似dblink的功能。
  • 快速将Oralce表迁移进入PostgreSQL。 本文简单介绍下Oracle_fdw的安装和使用。

一 Oracle_fdw安装

官方地址:http://pgxn.org/dist/oracle_fdw/ ,选择一个版本下载。

1.1 安装Oracle Instant Client

oralce官网下载 'Basic' and 'SDK',假如下载后文件所在位置在/opt/oracle中。

cd /opt/oracle
unzip instantclient-basic-linux.x64-12.2.0.1.0.zip
unzip instantclient-sdk-linux.x64-12.2.0.1.0.zip
mv instantclient_12_2 instantclient
cd instantclient
#建立一下软连接
ln -s libclntsh.so.12.1 libclntsh.so
#设置环境变量
vi /etc/profile
#边界内容如下:
#oracle_home一定要写,否则编译会报错
export ORACLE_HOME=/opt/oracle/instantclient
export OCI_LIB_DIR=$ORACLE_HOME
export OCI_INC_DIR=$ORACLE_HOME/sdk/include
#保存退出
#重启用profile文件
source /etc/profile

##1.2 编译oracle_fdw 启用postgres用户环境变量

[root@bogon opt]# source /home/postgres/.bashrc

解压oracle_fdw

[root@bogon opt]# unzip oracle_fdw-1.5.0.zip 

编译安装oracle_fdw

[root@bogon opt]# cd oracle_fdw-1.5.0
#编译
[root@bogon oracle_fdw-1.5.0]# make
#安装
[root@bogon oracle_fdw-1.5.0]# make install

没报错的话,代表安装成功了,有时候会报一找不到.h头文件的错误,比如:

fatal err:oci.h:No such file or directory
#或者
fatal err:stdio.h:No such file or directory

错误截图1.png 都证明ORACLE_HOME没指定或没有正确配置,需检查环境变量及其文件对应是否正确。

二 创建oracle_fdw扩展

postgres=# create extension oracle_fdw;
CREATE EXTENSION

代表创建成功,如果遇到下面这个问题:

postgres=# create extension oracle_fdw;
ERROR:  could not load library "/home/postgres/lib/oracle_fdw.so": libclntsh.so: cannot open shared object file: No such file or directory

是缺少so文件了,有时候编译成功了,还是会缺不少文件,用ldd查看下oracle_fdw.so的依赖:

[postgres@localhost lib]$ ldd oracle_fdw.so 
	linux-vdso.so.1 =>  (0x00007fff5973b000)
	libclntsh.so.12.1 => not found
	libc.so.6 => /lib64/libc.so.6 (0x00007fa9c8185000)
	libmql1.so => not found
	libipc1.so => not found
	libnnz12.so => not found
	libons.so => not found
	libdl.so.2 => /lib64/libdl.so.2 (0x00007fa9c7f6d000)
	libm.so.6 => /lib64/libm.so.6 (0x00007fa9c7c6b000)
	libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fa9c7a4f000)
	libnsl.so.1 => /lib64/libnsl.so.1 (0x00007fa9c7835000)
	librt.so.1 => /lib64/librt.so.1 (0x00007fa9c762d000)
	libaio.so.1 => /lib64/libaio.so.1 (0x00007fa9c742b000)
	libresolv.so.2 => /lib64/libresolv.so.2 (0x00007fa9c7210000)
	/lib64/ld-linux-x86-64.so.2 (0x00007fa9cc20e000)
	libclntshcore.so.12.1 => not found
	libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007fa9c6ffa000)

对于这些not found的so文件,我们在ORACLE_HOME目录中发现是存在的,如下图:

ORACLE_HOME.png 因此需要手动建立一下软连接:

ln -s /opt/oracle/instantclient/libclntsh.so.12.1  /home/postgres/lib/libclntsh.so.12.1
ln -s /opt/oracle/instantclient/libmql1.so  /home/postgres/lib/libmql1.so
ln -s /opt/oracle/instantclient/libipc1.so  /home/postgres/lib/libipc1.so
ln -s /opt/oracle/instantclient/libnnz12.so  /home/postgres/lib/libnnz12.so
ln -s /opt/oracle/instantclient/libons.so  /home/postgres/lib/libons.so
ln -s /opt/oracle/instantclient/libclntshcore.so.12.1  /home/postgres/lib/libclntshcore.so.12.1

再次创建oracle_fdw:

postgres=# create extension oracle_fdw;
CREATE EXTENSION

应该就能创建成功了。

三 使用oracle_fdw

postgres=# create server oradb_215 foreign data wrapper oracle_fdw options(dbserver '10.144.15.215:1521/mcsas');
postgres=# grant usage on foreign server oradb_215 to postgres;
postgres=# create user mapping for postgres server oradb_215 options(user 'MG_APP',password 'QWERasdf');
postgres=# create foreign table ZWGK_SJJC_FBYJ_GTSJHD123
(
  OBJ_ID  VARCHAR(42) not null,
  XLMC    VARCHAR(50),
  DYDJ    VARCHAR(50),
  GTXH    VARCHAR(50),
  SJFBHD  VARCHAR(50),
  SSBQ    VARCHAR(50),
  BNHD    VARCHAR(50),
  SSWS    VARCHAR(50),
  PMSGTID VARCHAR(150),
  PMSGTBH VARCHAR(150),
  SFCL    VARCHAR(150)
) server oradb_215 options(schema 'MG_APP',table 'ZWGK_SJJC_FBYJ_GTSJHD');
postgres=# select * from ZWGK_SJJC_FBYJ_GTSJHD123 limit 10;

  这样,将oracle中MG_APP.ZWGK_SJJC_FBYJ_GTSJHD表“映射”到pg了,可以查询了。

© 著作权归作者所有

共有 人打赏支持
遥想公瑾当年
粉丝 6
博文 11
码字总数 17519
作品 0
南京
高级程序员
私信 提问
PostgreSQL的postgres_fdw跨库使用

PostgreSQL的数据库逻辑上是相互独立的,和Oracle类似,如果要访问其他数据库,需要做跨库操作,Postgres本身提供了一些扩展,比如dblink,pgsqlfdw等,高版本的建议使用postgresfdw,也就是p...

kenyon_君羊
2014/04/01
0
4
PostgreSQL之Foreign Data Wrappers使用指南

PostgreSQL的fdw实现的功能是各个postgresql数据库及远程数据库之间的跨库操作,功能和oracle的dblink一样。 本文中的环境如下图所示: 1.1、目标端安装软件包 1.2、目标端创建用户 这里的源...

candon123
11/28
0
0
一些非常有用的 PostgreSQL 扩展

我亲爱的朋友们,今天让我们来讨论下 PostgreSQL 以及该数据库最有用的一些扩展。 PostgreSQL 是一个关系型数据库管理系统,主要特点: 数据库支持几乎无限的大小; 强大而且可靠的事务复制机...

红薯
2012/04/23
6.6K
2
企业级PostgreSQL扩展

我们一直在讨论构建企业级 PostgreSQL的相关设置,例如安全、备份策略、高可用,以及不同规模 PostgreSQL。在本文中,我们将回顾一些最流行的开源 PostgreSQL扩展,这些扩展的一些功能用于满...

飞象数据
前天
0
0
postgresql9.5 物化视图测试

copyright http://cupegraf.com/ 视图是指数据库只存储定义该视图的查询语句(内容是查询时产生),而物化视图是一个其查询语句查询后的内容并存储的视图(内容是创建物化视图刷新视图时产生,...

廖君
2015/07/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Android 通过DrawableInflater加载自定义Drawable

一、Drawable 在Android系统张,图形图像的绘制需要在画布上进行操作和处理,但是绘制需要了解很多细节以及可能要进行一些复杂的处理,因此系统提供了一个被称之为Drawable的类来进行绘制处理...

IamOkay
9分钟前
1
0
灵活无处安放,所以选择流浪....《漆黑的空间》& 《灰色轨迹》

灵活无处安放,所以选择流浪....《漆黑的空间》& 《灰色轨迹》

yizhichao
16分钟前
1
0
Kafka+Flink 实现准实时异常检测系统

1.背景介绍 异常检测可以定义为“基于行动者(人或机器)的行为是否正常作出决策”,这项技术可以应用于非常多的行业中,比如金融场景中做交易检测、贷款检测;工业场景中做生产线预警;安防...

架构师springboot
58分钟前
6
0
DecimalFormat 类基本使用

/* * DecimalFormat 类主要靠 # 和 0 两种占位符号来指定数字长度 * 0 表示如果位数不足则以 0 填充 * # 表示只要有可能就把数字拉上这个位置 * */ public static void main(String[] args){...

嘴角轻扬30
今天
4
0
This APT has Super Cow Powers.

在Debian/Ubuntu上,apt包管理器内嵌着一个彩蛋. 如果你在命令行界面输入 apt help 在最后一行能找到This APT has Super Cow Powers. 说明该apt具有超级牛力 牛力是个什么梗? 则说明你的系统...

taadis
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部