PG data wrapper 連線oracle 資料庫oracle_fdw 安裝

babyyellow發表於2012-05-18
pg社群從來就不缺乏,先進的技術體驗,只有想不到,沒有做不到。

pg 資料庫如何從oracle 資料庫同步資料,本次轉pg涉及到部分關聯絡統還在oracle 上執行,

之前的同義詞,db-link ,檢視, 都已經不合適了,如何讓pg能夠連到oracle 資料庫上,如何同步這些資料是需要考慮的。

pg 社群 釋出了 oracle_fdw 。

目前已經發布到0.95版本,還是一個beta 版本。  支援oracle 10g 11g 資料庫。

安裝上還有有些不方便。 最主要的,我們追求更高的效能,遷到linux as 6 系統,多少帶來一些阻礙,
最終我們還是測試安裝成功。 記錄如下:

下載 oracle_fdw 原始碼。



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
--&gt Running transaction check
---&gt Package postgresql-libs.x86_64 0:8.4.9-1.el6_1.1 will be erased
--&gt 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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章