Oracle_fdw是PG的一个外部数据接口,可以使PostgreSQL轻松跨库操作Oracle。Oracle_fdw的作用有以下两点:
PG可以跨库增删改查Oracle中的表,可以查询Oracle的视图,可以使PG中的表和Oracle中表/视图作Join查询,类似dblink的功能。
快速将Oralce表迁移进入PostgreSQL。
oracle_fdw-ORACLE_FDW_2_3_0.zip
Oracle_fdw的编译依赖系统中需要有pg_config和Oracle的环境,需要部署以下三个oracle包,必须同平台同版本。
https://www.oracle.com/database/technologies/instant-client/linux-x86-64-downloads.html
instantclient-basic-linux.x64-11.2.0.4.0.zip
instantclient-sdk-linux.x64-11.2.0.4.0.zip
instantclient-sqlplus-linux.x64-11.2.0.4.0.zip
PostgreSQL:RHEL6.6+PG10.15
Oracle:RHEL6.6+Oracle11.2.0.4
步骤一:创建oracle环境目录
mkdir /opt/oracle
chown postgres:postgres /opt/oracle
chmod 775 /opt/oracle
步骤二:解压三个oracle包
su - postgres
cd opt/oracle
unzip instantclient-basic-linux.x64-11.2.0.4.0.zip
unzip instantclient-sdk-linux.x64-11.2.0.4.0.zip
unzip instantclient-sqlplus-linux.x64-11.2.0.4.0.zip
步骤三:配置环境变量,添加如下内容
vi .bash_profile
export ORACLE_HOME=/opt/oracle/instantclient_11_2
export OCI_LIB_DIR=$ORACLE_HOME
export OCI_INC_DIR=$ORACLE_HOME/sdk/include
export LD_LIBRARY_PATH=$ORACLE_HOME:$LD_LIBRARY_PATH
步骤四:安装ORACLE_FDW插件
unzip oracle_fdw-ORACLE_FDW_2_3_0.zip
cd oracle_fdw-ORACLE_FDW_2_3_0
make && make install
步骤五:创建外部数据封装器
postgres=# create extension oracle_fdw ;
postgres=# \des
步骤六:外部表使用
1)创建外部服务器
create server ora_test foreign data wrapper oracle_fdw options(dbserver '172.XX.XX.100:1521/ORCL');
修改IP及端口:
alter server ora_test options(set dbserver '172.XX.XX.100:1521/ORCL');
2)授权使用的用户
grant usage on foreign server ora_test to postgres;
3)创建用户映射,连接oracle的凭证
create user mapping for postgres server ora_test options (user 'query', password 'query123');
修改连接用户密码:
alter user mapping for postgres server ora_test options (set user 'query',set password 'query123');
4)创建外部表,注意类型的转换,SCOTT.EMP要求必须大写
create foreign table fdw_emp(
EMPNO integer options(key 'true') not null,
ENAME varchar(10),
JOB varchar(10),
MGR integer,
HIREDATE date,
SAL numeric(7,2),
COMM numeric(7,2),
DEPTNO integer
) server ora_test options (schema 'SCOTT',table 'EMP');
5)查看外部表信息
postgres=# select oracle_diag();
oracle_diag
---------------------------------------------------------------------------
oracle_fdw 2.3.0, PostgreSQL 10.15, Oracle client 11.2.0.4.0, ORACLE_HOME=/opt/oracle/instantclient_11_2
postgres=# select * from fdw_emp;
empno | ename | job | mgr | hiredate | sal | comm | deptno
-------+--------+-----------+------+------------+---------+---------+--------
7369 | SMITH | CLERK | 7902 | 1980-12-17 | 800.00 | | 20
7499 | ALLEN | SALESMAN | 7698 | 1981-02-20 | 1600.00 | 300.00 | 30
7521 | WARD | SALESMAN | 7698 | 1981-02-22 | 1250.00 | 500.00 | 30
7566 | JONES | MANAGER | 7839 | 1981-04-02 | 2975.00 | | 20
7654 | MARTIN | SALESMAN | 7698 | 1981-09-28 | 1250.00 | 1400.00 | 30
7698 | BLAKE | MANAGER | 7839 | 1981-05-01 | 2850.00 | | 30
7782 | CLARK | MANAGER | 7839 | 1981-06-09 | 2450.00 | | 10
7788 | SCOTT | ANALYST | 7566 | 1987-04-19 | 3000.00 | | 20
7839 | KING | PRESIDENT | | 1981-11-17 | 5000.00 | | 10
7844 | TURNER | SALESMAN | 7698 | 1981-09-08 | 1500.00 | 0.00 | 30
7876 | ADAMS | CLERK | 7788 | 1987-05-23 | 1100.00 | | 20
7900 | JAMES | CLERK | 7698 | 1981-12-03 | 950.00 | | 30
7902 | FORD | ANALYST | 7566 | 1981-12-03 | 3000.00 | | 20
7934 | MILLER | CLERK | 7782 | 1982-01-23 | 1300.00 | | 10
(14 rows)
6)增删改外部表,要求一定有主键,外部表主键设置options(key 'true'),注意PG数据库事务提交机制
postgres=# insert into fdw_emp (empno,ename,job,sal,deptno) values(8888,'WANGYAQI','DBA',1000,10);
INSERT 0 1
postgres=# delete from fdw_emp where empno=8888;
DELETE 1
postgres=# update fdw_emp set comm=10000 where empno=7934;
UPDATE 1
推荐阅读:
《利用FDW进行ORACLE到Postgresql的数据迁移》

本文作者:王亚奇(上海新炬中北团队)
本文来源:“IT那活儿”公众号





