Greenplum使用oralce_fdw連接oracle

1 下載oracle客戶端,放到/data目錄下(主節點)

instantclient-basic-linux.x64-12.2.0.1.0.zip、

instantclient-sdk-linux.x64-12.2.0.1.0.zip、

instantclient-sqlplus-linux.x64-12.2.0.1.0.zip三個文件包

#解壓縮,並修改目錄爲instantclient

mv instantclient_12_2 instantclient

 

2 在root和gpadmin用戶下配置環境變量(主節點)

export ORACLE_HOME=/data/instantclient

export OCI_LIB_DIR=$ORACLE_HOME

export OCI_INC_DIR=$ORACLE_HOME/sdk/include

export LD_LIBRARY_PATH=$ORACLE_HOME:$LD_LIBRARY_PATH

 

 

3 下載編譯oracle_fdw(主節點)

https://github.com/adam8157/oracle_fdw_greenplum

 

4 編譯(主節點)

#make

報錯如下:這裏的意思是沒有初始化事務隔離級別,那麼需要修改源碼

 [root@mdw oracle_fdw_greenplum-master]# vi oracle_utils.c

*oracleGetSession(const char *connectstring, oraIsoLevel isolation_level, char *user, char *password, const char *nls_lang, const char *tablename, int curlevel)

{

        OCIEnv *envhp = NULL;

        OCIError *errhp = NULL;

        OCISvcCtx *svchp = NULL;

        OCIServer *srvhp = NULL;

        OCISession *userhp = NULL;

        OCITrans *txnhp = NULL;

        oracleSession *session;

        struct envEntry *envp;

        struct srvEntry *srvp;

        struct connEntry *connp;

        char pid[30], *nlscopy = NULL;

        ub4 is_connected;

        int retry = 1;

        ub4 isolevel = OCI_TRANS_NEW;//修改事務隔離級別,否則報錯未初始化

 

        /* convert isolation_level to Oracle OCI value */

        switch(isolation_level)

        {

                case ORA_TRANS_SERIALIZABLE:

                        isolevel = OCI_TRANS_SERIALIZABLE;

                        break;

                case ORA_TRANS_READ_COMMITTED:

                        isolevel = OCI_TRANS_NEW;

                        break;

                case ORA_TRANS_READ_ONLY:

                        isolevel = OCI_TRANS_READONLY;

                        break;

        }

 

[root@mdw oracle_fdw_greenplum-master]# make

gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -fno-aggressive-loop-optimizations -Wno-unused-but-set-variable -Wno-address -O3 -std=gnu99   -Werror=uninitialized -Werror=implicit-function-declaration -fPIC -shared -o oracle_fdw.so oracle_fdw.o oracle_utils.o oracle_gis.o -L/usr/local/greenplum-db-6.5.0/lib    -Wl,--as-needed -Wl,-rpath,'/usr/local/greenplum-db-6.5.0/lib',--enable-new-dtags  -L/data/instantclient -L/data/instantclient/bin -L/data/instantclient/lib -L/data/instantclient/lib/amd64 -lclntsh -L/usr/lib/oracle/19.6/client/lib -L/usr/lib/oracle/19.6/client64/lib -L/usr/lib/oracle/19.3/client/lib -L/usr/lib/oracle/19.3/client64/lib -L/usr/lib/oracle/18.5/client/lib -L/usr/lib/oracle/18.5/client64/lib -L/usr/lib/oracle/18.3/client/lib -L/usr/lib/oracle/18.3/client64/lib -L/usr/lib/oracle/12.2/client/lib -L/usr/lib/oracle/12.2/client64/lib -L/usr/lib/oracle/12.1/client/lib -L/usr/lib/oracle/12.1/client64/lib -L/usr/lib/oracle/11.2/client/lib -L/usr/lib/oracle/11.2/client64/lib -L/usr/lib/oracle/11.1/client/lib -L/usr/lib/oracle/11.1/client64/lib -L/usr/lib/oracle/10.2.0.5/client/lib -L/usr/lib/oracle/10.2.0.5/client64/lib -L/usr/lib/oracle/10.2.0.4/client/lib -L/usr/lib/oracle/10.2.0.4/client64/lib -L/usr/lib/oracle/10.2.0.3/client/lib -L/usr/lib/oracle/10.2.0.3/client64/lib

(python) [root@mdw oracle_fdw_greenplum-master]# make install

/usr/bin/mkdir -p '/usr/local/greenplum-db-6.5.0/lib/postgresql'

/usr/bin/mkdir -p '/usr/local/greenplum-db-6.5.0/share/postgresql/extension'

/usr/bin/mkdir -p '/usr/local/greenplum-db-6.5.0/share/postgresql/extension'

/usr/bin/mkdir -p '/usr/local/greenplum-db-6.5.0/share/doc/postgresql/extension'

/usr/bin/install -c -m 755  oracle_fdw.so '/usr/local/greenplum-db-6.5.0/lib/postgresql/oracle_fdw.so'

/usr/bin/install -c -m 644 oracle_fdw.control '/usr/local/greenplum-db-6.5.0/share/postgresql/extension/'

/usr/bin/install -c -m 644 oracle_fdw--1.2.sql oracle_fdw--1.0--1.1.sql oracle_fdw--1.1--1.2.sql '/usr/local/greenplum-db-6.5.0/share/postgresql/extension/'

/usr/bin/install -c -m 644 README.oracle_fdw '/usr/local/greenplum-db-6.5.0/share/doc/postgresql/extension/'

 

5 複製編譯文件到所有節點

將主節點/usr/local/greenplum-db-6.5.0/lib/postgresql/oracle_fdw.so放到所有節點相應目錄下

將主節點/usr/local/greenplum-db-6.5.0/share/postgresql/extension下的所有oracle_fdw相關的文件放到所有節點相應目錄下

 

6 分發oracle客戶端到所有節點

(1)將主節點目錄/data下的目錄instantclient分發到所有節點上

(2)在所有節點的root和gpadmin目錄下配置環境變量

export ORACLE_HOME=/data/instantclient

export OCI_LIB_DIR=$ORACLE_HOME

export OCI_INC_DIR=$ORACLE_HOME/sdk/include

export LD_LIBRARY_PATH=$ORACLE_HOME:$LD_LIBRARY_PATH

 

(3)所有節點(包含主節點)instantclient目錄下做軟連接

[root@mdw instantclient]# ln -s libclntsh.so.12.1 libclntsh.so

[root@mdw instantclient]# ll

total 219848

-rwxrwxr-x. 1 gpadmin gpadmin     44220 Jan 26  2017 adrci

-rw-rw-r--. 1 gpadmin gpadmin       363 Jan 26  2017 BASIC_README

-rwxrwxr-x. 1 gpadmin gpadmin     57272 Jan 26  2017 genezi

-r-xr-xr-x. 1 gpadmin gpadmin       342 Jan 26  2017 glogin.sql

-rwxrwxr-x. 1 gpadmin gpadmin   8033199 Jan 26  2017 libclntshcore.so.12.1

lrwxrwxrwx. 1 root    root           17 Jun 16 15:25 libclntsh.so -> libclntsh.so.12.1

.........................

7 動態連接庫增加oracle客戶端地址(所有節點執行)

所有節點執行下列操作:

# 每個節點加入oracle客戶端的庫路徑(root用戶),讓pg

# cd /etc/ld.so.conf.d/

# vi oracle-x86_64.conf

/data/instantclient

# ldconfig

 

注:如果不執行上述步驟,在create extension時會報錯:

8 創建oracl_fdw並測試結果(主節點)

postgres=# create extension oracle_fdw;

CREATE EXTENSION

 

#創建名稱爲oradb 的oracle_fdw

postgres=# CREATE SERVER oradb FOREIGN DATA WRAPPER oracle_fdw OPTIONS (dbserver '//172.30.78.2:1521/amrdb');

CREATE SERVER

 

#爲用戶gpadmin創建基於oradb的mapping

postgres=# CREATE USER MAPPING FOR gpadmin SERVER oradb  OPTIONS (user 'amr', password 'amr');

CREATE USER MAPPING

 

#創建外部表,其中schema 'AMR', table 'T_FDW'爲oracle的用戶名和表名

postgres=# CREATE FOREIGN TABLE t_fdw_ora(id int)SERVER oradb OPTIONS (schema 'AMR', table 'T_FDW');

CREATE FOREIGN TABLE

 

#測試連接成功

postgres=# select * from t_fdw_ora;

 id

----

  1

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章