ITPub博客

首页 > Linux操作系统 > Linux操作系统 > PG data wrapper 连接oracle 数据库oracle_fdw 安装

PG data wrapper 连接oracle 数据库oracle_fdw 安装

原创 Linux操作系统 作者:babyyellow 时间:2012-05-18 10:27:23 0 删除 编辑
pg社区从来就不缺乏,先进的技术体验,只有想不到,没有做不到。

pg 数据库如何从oracle 数据库同步数据,本次转pg涉及到部分关联系统还在oracle 上运行,

之前的同义词,db-link ,视图, 都已经不合适了,如何让pg能够连到oracle 数据库上,如何同步这些数据是需要考虑的。

pg 社区 发布了 oracle_fdw 。

目前已经发布到0.95版本,还是一个beta 版本。  支持oracle 10g 11g 数据库。

安装上还有有些不方便。 最主要的,我们追求更高的性能,迁到linux as 6 系统,多少带来一些阻碍,
最终我们还是测试安装成功。 记录如下:

下载 oracle_fdw 源代码。

http://pgfoundry.org/frs/?group_id=1000600

oracle_fdw 是以pg 的组件方式发布的,安装方式用到了pg 的组件的安装结构。

oracle_fdw 需要用到oracle 的客户端组件。

我们需要先安装oracle 的客户端

从oracle 网站上下载oracle 10.2.0.4 的客户端,解压安装,发现已经无法安装了。
oracle 10g 的只能装在as 3 ,as 4 上,as5 上需要修改redhat-releace 文件,as6上修改了这个文件也没有用了。


于是安装oracle 11gR2的客户端,结果安装过程中报错了,关于OCI的部分无法安装,oracle 的检测报告了一大堆的错误,

不过我们忽略了这些错误,然后安装了,由于oci 的包缺乏,所以oracle_fdw 无法编译。

需要从racle 的网站上下载已经编译好的oci表,和sdk  放到相应的目录:

下载 instantclient-basic-linux-x86-64-11.2.0.2.0.zip  解压后放到$ORACLE_HOME/oci/include 目录下面。
下载 instantclient-sdk-linux-x86-64-11.2.0.2.0.zip    解压后放到 $ORACLE_HOME/sdk 目录下面

如果没有oci/include  和 sdk 目录,就自己建一个啦。

设置环境变量:
vi   .bash_profile  :[code]


export PGDATA=/usr/local/pgsql/data

export ORACLE_HOME=/data/oracle/product/11.2.0


PATH=$PATH:$HOME/bin:/usr/local/pgsql/bin:$ORACLE_HOME/bin
export PATH


export PGPORT=5432
export LANG=en_US.utf8
export PGHOME=/usr/local/pgsql
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$ORACLE_HOME/lib32:$PGHOME/lib:/lib64:/usr/lib64:/usr/local/lib64:/lib:/usr/lib:/usr/local/lib
export DATE=`date +"%Y%m%d%H%M"`
[/code]主要是设置ORACLE_HOME 和LD_LIBRARY_PATH ,PATH 变量
包括oracle 的路径。


这些都搞定了,就可以编译 oracle_fdw 了。

cd /data/pg_pacakage/postgresql-9.1.3/contrib/oracle_fdw-0.9.5

su - root
souce   /home/postgres/.bash_profile  
这个是让root 取到pg的环境变量, 在编译的时候需要用$PGHOME/bin/pg_config 来读取pg的安装时的配置信息。

make install[code]
[root@postgres-11-17 ~]# cd /data/pg_package/postgresql-9.1.3/contrib/oracle_fdw-0.9.5/
[root@postgres-11-17 oracle_fdw-0.9.5]# . /home/postgres/.bash_profile
[root@postgres-11-17 oracle_fdw-0.9.5]# make install
/bin/mkdir -p '/data/postgresql-9.1.3/lib'
/bin/mkdir -p '/data/postgresql-9.1.3/share/extension'
/bin/mkdir -p '/data/postgresql-9.1.3/share/doc/extension'
/bin/sh /data/postgresql-9.1.3/lib/pgxs/src/makefiles/../../config/install-sh -c -m 755  oracle_fdw.so '/data/postgresql-9.1.3/lib/oracle_fdw.so'
/bin/sh /data/postgresql-9.1.3/lib/pgxs/src/makefiles/../../config/install-sh -c -m 644 ./oracle_fdw.control '/data/postgresql-9.1.3/share/extension/'
/bin/sh /data/postgresql-9.1.3/lib/pgxs/src/makefiles/../../config/install-sh -c -m 644 ./oracle_fdw--1.0.sql  '/data/postgresql-9.1.3/share/extension/'
/bin/sh /data/postgresql-9.1.3/lib/pgxs/src/makefiles/../../config/install-sh -c -m 644 ./README.oracle_fdw '/data/postgresql-9.1.3/share/doc/extension/'
[root@postgres-11-17 oracle_fdw-0.9.5]#

[/code]到这里就安装完成了。

说点小插曲,我在编译的过程中,一台机器,我安装了oracle 客户端,然后我就把安装包copy到另一台机器上,结果就编译不了
报错:[code]
[postgres@postgres-11-17 oracle_fdw-0.9.5]$ make install
gcc -O2 -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -Wformat-security -fno-strict-aliasing -fwrapv -fpic -I/data/oracle/product/11.2.0/sdk/include -I/data/oracle/product/11.2.0/oci/include -I/data/oracle/product/11.2.0/rdbms/public -I. -I. -I/data/postgresql-9.1.3/include/server -I/data/postgresql-9.1.3/include/internal -D_GNU_SOURCE -I/usr/include/libxml2   -c -o oracle_fdw.o oracle_fdw.c
gcc -O2 -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -Wformat-security -fno-strict-aliasing -fwrapv -fpic -I/data/oracle/product/11.2.0/sdk/include -I/data/oracle/product/11.2.0/oci/include -I/data/oracle/product/11.2.0/rdbms/public -I. -I. -I/data/postgresql-9.1.3/include/server -I/data/postgresql-9.1.3/include/internal -D_GNU_SOURCE -I/usr/include/libxml2   -c -o oracle_utils.o oracle_utils.c
gcc -O2 -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -Wformat-security -fno-strict-aliasing -fwrapv -fpic -shared -o oracle_fdw.so oracle_fdw.o oracle_utils.o -L/data/postgresql-9.1.3/lib -Wl,--as-needed -Wl,-rpath,'/data/postgresql-9.1.3/lib',--enable-new-dtags  -L/data/oracle/product/11.2.0 -L/data/oracle/product/11.2.0/bin -L/data/oracle/product/11.2.0/lib -lclntsh
/usr/bin/ld: cannot find -lclntsh
collect2: ld returned 1 exit status
make: *** [oracle_fdw.so] Error 1

[/code]直接从安装好的那台上把编译好的包放到pg的目录下面[code]
[postgres@postgres-11-17 ~]$ psql
psql (9.1.3)
Type "help" for help.

postgres=# create EXTENSION  oracle_fdw ;
ERROR:  could not load library "/data/postgresql-9.1.3/lib/oracle_fdw.so": libnnz11.so: cannot open shared object file: No such file or directory
postgres=# \q

[/code]所以别省事,还是老老实实的安装oracle 的客户端。


安装完成后,就可以到pg 里看看:

psql[code]
[postgres@postgres-11-17 ~]$ psql
psql (9.1.3)
Type "help" for help.

postgres=# create EXTENSION  oracle_fdw ;
ERROR:  could not load library "/share/postgresql/lib/oracle_fdw.so":  cannot open shared object file: No such file or directory
postgres=# \q

[/code]奇怪的是我们的pg是安装在/usr/local/下面的,怎么会到/share/postgresql/下面去找so文件呢?

去到/share/postgresql下面一看,果然有这个目录,还是pg的一个完整的lib 目录呢。

rpm -qa  | grep  postgresql  果然是linux 自带的pg 在里面。[code]
[root@postgres-11-17 ~]#   rpm -qa |grep post
postgresql-libs-8.4.9-1.el6_1.1.x86_64
postfix-2.6.6-2.2.el6_1.x86_64
[root@postgres-11-17 ~]# yum remove postgresql-libs-8.4.9-1.el6_1.1.x86_64
Loaded plugins: product-id, security, subscription-manager
Updating certificate-based repositories.
Setting up Remove Process
Resolving Dependencies
--> Running transaction check
---> Package postgresql-libs.x86_64 0:8.4.9-1.el6_1.1 will be erased
--> Finished Dependency Resolution
http://192.168.10.150/rehas6u2X64/img/Packages/repodata/repomd.xml: [Errno 14] PYCURL ERROR 22 - "The requested URL returned error: 404"
Trying other mirror.

Dependencies Resolved

====================================================================================================================================
Package                Arch          Version                  Repository                                                      Size
====================================================================================================================================
Removing:
postgresql-libs        x86_64        8.4.9-1.el6_1.1          @anaconda-RedHatEnterpriseLinux-201111171049.x86_64/6.2        607 k

Transaction Summary
====================================================================================================================================
Remove        1 Package(s)

Installed size: 607 k
Is this ok [y/N]: y
Downloading Packages:
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
  Erasing    : postgresql-libs-8.4.9-1.el6_1.1.x86_64                                                                           1/1
Installed products updated.

Removed:
  postgresql-libs.x86_64 0:8.4.9-1.el6_1.1                                                                                          

Complete!
[root@postgres-11-17 ~]#

[/code]删掉这个然后清空/share/postgresql 目录,然后就ok啦。[code]
[postgres@postgres-11-17 ~]$ psql
psql (9.1.3)
Type "help" for help.

postgres=# create EXTENSION  oracle_fdw ;
CREATE EXTENSION
postgres=#

[/code]下面就来演示一下吧:[code]
[postgres@postgres-11-17 ~]$ psql -d cyp_app
psql (9.1.3)
Type "help" for help.

cyp_app=# create EXTENSION oracle_fdw ;      
CREATE EXTENSION

cyp_app=# grant all on foreign data wrapper oracle_fdw to cyp_app;
GRANT

cyp_app=# \c cyp_app cyp_app
You are now connected to database "cyp_app" as user "cyp_app".
cyp_app=>


cyp_app=> CREATE SERVER ora_cyp FOREIGN DATA WRAPPER oracle_fdw
        OPTIONS (dbserver '//192.168.x.x:1521/tesxx');
CREATE SERVER

cyp_app=> CREATE USER MAPPING FOR cyp_app SERVER ora_cyp
        OPTIONS (user 'cyxxxxxp', password 'xxxxx');
CREATE USER MAPPING


cyp_app=> CREATE  FOREIGN TABLE "ora_pp_ad" (
        "id" bigint NOT NULL,
        "area_id" bigint NOT NULL,
        "brand_id" bigint NOT NULL,
        "type" bigint,
        "display" varchar(200),
        "link" varchar(200),
        "pos" bigint,
        "color" varchar(200),
        "product_id" bigint,
        "company_id" bigint,
        "company_name" varchar(100),
        "company_phone" varchar(100),
        "company_logo" varchar(1000),
        "company_link" varchar(1000),
        "company_pos" bigint,
        "company_color" varchar(20),
        "company_message" varchar(500),
        "create_date" timestamp,
        "contract_id" varchar(100),
        "amount" double precision,
        "cancel_date" timestamp,
        "logo_cancel_date" timestamp,
        "relation_start_date" timestamp,
        "cyp_id" bigint,
        "company_logo_link" varchar(1000),
        "company_address" varchar(2000)
) SERVER ora_cyp OPTIONS (table 'pp_ad'); 

CREATE FOREIGN TABLE



cyp_app=> select  count(*)  from ora_pp_ad where relation_start_date > now() - interval '30days';
 count
-------
   309
(1 row)

cyp_app=> select oracle_close_connections();                                                    
 oracle_close_connections
--------------------------
 
(1 row)



[/code]

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/133735/viewspace-730107/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
oracle MySQL Postgresql 专职数据库dba。 系统架构师。 mysql 官方认知dba 。 15年专职dba 经验。

注册时间:2010-12-02

  • 博文量
    232
  • 访问量
    1418889