DBA通常会碰到这样的情况:在两个不同的数据库间进行数据交互。就象我现在经常会把一个ORACLE库转成PG库。如果把数据先导出成文件,再导入目标库,当然也可以。但这样操作有个难点,就是文件格式!
PG有一个非常实用的功能可以实现不同数据库间的数据交互--外部表--我的O转P操作就是这么干的。
1,在同一台服务器上安装POSTGRES(9.1.3)和ORACLE(10.2.0.4),具体步骤相信大家都会。
2,更改postgres的环境变量,加入ORACLE的部分,如下:
export
PATH=$PATH:$HOME/bin
export PGPORT=1921
export PGDATA=/pgdata
export LANG=en_US.utf8
export PGHOME=/opt/pgsql
export
ORACLE_BASE=/opt/oracle
export
ORACLE_HOME=$ORACLE_BASE/product/10.2.0/db_1
export
LD_LIBRARY_PATH=$ORACLE_HOME/lib:$PGHOME/lib:/lib64:/usr/lib64:/usr/local/lib64:/lib:/usr/lib:/usr/local/lib
export
PATH=$PGHOME/bin:$PATH:.
export
MANPATH=$PGHOME/man:$MANPATH
export
PATH=$ORACLE_HOME/bin:$PGHOME/bin:$PATH:.
oracle@linux-> chown -R
postgres:postgres $ORACLE_BASE
4,安装oracle_fdw,可到pgfoundry上下载,这里的版本是0.9.3。
注:必须以root用户安装
su – root
.
/home/postgres/.bash_profile
cd oracle_fdw-0.9.3
make install
5,创建extension,要以superuser来操作
test# create extension
oracle_fdw;
6,创建server
test#
create server svr_test_ora foreign data wrapper oracle_fdw options
(dbserver '//172.16.1.1:1521/test_ora');
这里在server里指定要访问的oracle库的信息,ip+port+sid
7,创建user mapping
test# create user mapping
for user_pg server svr_test_ora options (user
'user_ora',password '*****');
这里指定要访问的oracle库的用户名(user_ora)和密码。user_pg是PG库里的用户名。
8,创建foreign
table
test# create FOREIGN table ft_tbl_t1
(c1 bigint ,
c2 numeric(10,0) ,
c3 character
varying(2) , c4 timestamp without time zone ,
c5 numeric(12,0))
server svr_test_ora options (table 'TBL_T1',schema
'USER_ORA',plan_costs
'true');
8,赋权及访问
test# grant select on ft_tbl_t1 to
test;
test# \c test
test
test=> select * from
public.ft_tbl_t1;
注:不能对外部表进行DML操作。