Oracle_fdw是PG的一個(gè)外部數(shù)據(jù)接口团南,可以使PostgreSQL輕松跨庫操作Oracle。Oracle_fdw的作用有以下兩點(diǎn):
- PG可以跨庫增刪改查Oracle中的表拷橘,可以查詢Oracle的視圖,可以使PG中的表和Oracle中表/視圖作Join查詢赌厅,類似dblink的功能。
- 快速將Oralce表遷移進(jìn)入PostgreSQL。
本文簡(jiǎn)單介紹下Oracle_fdw的安裝和使用毒嫡。
一 Oracle_fdw安裝
官方地址:http://pgxn.org/dist/oracle_fdw/ ,選擇一個(gè)版本下載。
1.1 安裝Oracle Instant Client
從oralce官網(wǎng)下載 '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
#設(shè)置環(huán)境變量
vi /etc/profile
#邊界內(nèi)容如下:
#oracle_home一定要寫,否則編譯會(huì)報(bào)錯(cuò)
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用戶環(huán)境變量
[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
沒報(bào)錯(cuò)的話,代表安裝成功了局雄,有時(shí)候會(huì)報(bào)一找不到.h頭文件的錯(cuò)誤墩邀,比如:
fatal err:oci.h:No such file or directory
#或者
fatal err:stdio.h:No such file or directory
都證明ORACLE_HOME沒指定或沒有正確配置享完,需檢查環(huán)境變量及其文件對(duì)應(yīng)是否正確彼绷。
二 創(chuàng)建oracle_fdw擴(kuò)展
postgres=# create extension oracle_fdw;
CREATE EXTENSION
代表創(chuàng)建成功,如果遇到下面這個(gè)問題:
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文件了猜旬,有時(shí)候編譯成功了,還是會(huì)缺不少文件,用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)
對(duì)于這些not found的so文件,我們?cè)贠RACLE_HOME目錄中發(fā)現(xiàn)是存在的倦蚪,如下圖:
因此需要手動(dòng)建立一下軟連接:
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
再次創(chuàng)建oracle_fdw:
postgres=# create extension oracle_fdw;
CREATE EXTENSION
應(yīng)該就能創(chuàng)建成功了个束。
三 使用oracle_fdw
3.1 配置foreign server
foreign server其實(shí)就是在pg中配置跨庫操作的對(duì)端數(shù)據(jù)庫連接參數(shù)沪悲,這里示例,配置一個(gè)遠(yuǎn)程oracle數(shù)據(jù)庫連接參數(shù)涉馁。
postgres=# create server oradb_test foreign data wrapper oracle_fdw options(dbserver '192.168.0.215:1521/ora_db');
postgres=# grant usage on foreign server oradb_test to postgres;
postgres=# create user mapping for postgres server oradb_test options(user 'MG_APP',password 'QWERasdf');
有時(shí)候,我們配置的oracle連接參數(shù)發(fā)生變化,需要修改連接參數(shù)叶沛。
3.1.1 ip,端口溉箕,實(shí)例變化
postgres=# alter server oradb_test options(set dbserver '192.168.0.214:1521/ora_db');
3.1.2 user,password變化
postgres=# alter user mapping for postgres server oradb_test options (set user 'MG_APP1',set password 'QWERasdf');
3.2 配置foreign table
fdw對(duì)表和視圖,只能手動(dòng)單獨(dú)配置抗楔,配置完數(shù)據(jù)庫連接參數(shù)连躏,再配置下要訪問的oracle的表或視圖的數(shù)據(jù)結(jié)構(gòu)。注意,配置外表的schema與table 對(duì)于oralce郑气,都是要求大寫腰池,小寫不認(rèn)識(shí)尾组。
postgres=# create foreign table 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_test options(schema 'MG_APP',table 'GTSJHD');
postgres=# select * from GTSJHD123 limit 10;
這樣,將oracle中MG_APP.GTSJHD表“映射”到pg了示弓,可以查詢了讳侨。
3.3 跨庫增刪改
oracle_fdw不僅支持跨庫查詢,也支持跨庫增刪改跨跨。
首先在oracle創(chuàng)建一個(gè)測(cè)試表,并插入一個(gè)記錄:
create table test1(
id int,
name char(10)
);
insert into test1(id,name) values (1,'aa');
--提交下事務(wù)更新
其次囱皿,在pg中創(chuàng)建外部表:
create foreign table test1_1(
id int options(key 'true') not null,
name text
) server oradb_test options(schema 'MG_APP',table 'TEST1');
注意勇婴,update或delete一定要設(shè)置options(key 'true'),就是設(shè)置外部表的主鍵嘱腥,否則會(huì)報(bào)錯(cuò)耕渴。
no primary key column specified for foreign Oracle table
測(cè)試增刪改
insert into test1_1 values (2,'BB');
update test1_1 set name='123' where id=2;
select * from test1_1;
delete from test1_1 where id=2;
四 可能遇到的錯(cuò)誤
4.1 OCIEnvCreate錯(cuò)誤
解決方法:
1 檢查 /etc/profile中ORACLE_HOME配置及其
export LD_LIBRARY_PATH=$ORACLE_HOME:$LD_LIBRARY_PATH-
2 檢查home/postgres/.bashrc也有:
export LD_LIBRARY_PATH=$ORACLE_HOME:$LD_LIBRARY_PATH
環(huán)境變量.png -
3 postgres用戶下檢查oracle_fdw.so的執(zhí)行權(quán)限:
image.png
Xshell下是綠色的,要是灰色齿兔,就 chmod 777 $PGHOME/lib/oracle_fdw.so
4 全部檢查完畢后一定要重啟pg服務(wù)橱脸。
4.2 client host name is not set
有時(shí)候報(bào)錯(cuò):ORA-24454: client host name is not set,這屬于非主流錯(cuò)誤分苇,原因是本機(jī)的hosts設(shè)置問題添诉。編輯對(duì)應(yīng)服務(wù)器的hosts文件:
Root@后面的是服務(wù)器的名稱,所以如下配置:
保存退出即可解決問題医寿。
4.3 no primary key column specified for foreign Oracle table
外部表創(chuàng)建時(shí)栏赴,一定要綁定主鍵,如:
create foreign table test1_1(
id int options(key 'true') not null,
name text
) server oradb_test options(schema 'MG_APP',table 'TEST1');
技術(shù)上:oracle表主鍵建立與否無關(guān)靖秩,但是pg中的oracle foreign table一定要通過key參數(shù)须眷,申明主鍵乌叶,否則update,delete會(huì)報(bào)錯(cuò)。
工程上:oralce表一定要建立主鍵柒爸,pg中oracle foreign table的key就綁定到這個(gè)主鍵字段上。這樣會(huì)使數(shù)據(jù)更規(guī)范事扭。