注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

PostgreSQL 中文网

 
 
 

日志

 
 

PostgreSQL 新特性之七 : oracle_fdw 实践  

2012-03-03 17:45:57|  分类: Postgres基础 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

 

      之前测试过 PostgreSQL 的 mysql_fdw, file_fdw ,今天有空,测试了 oracle_fdw,
什么是 oracle_fdw 呢?简单的说, 通过安装 oracle_fdw, 在 PostgreSQL 中可以访问
Oracle 库中的表,类似 dblink,下面是 oracle_fdw 的安装过程。


一 环境信息
--1.1 Installation Requirements
PostgreSQL:  PostgreSQL 9.1 或更高版本
Oracle:      Oracle 10 或者更高版本
操作系统:   Linux / windows


--1.2 环境信息
Oracle     10.2.0.1
PostgreSQL PostgreSQL 9.1
系统:虚拟机 ( Red Hat Enterprise Linux AS release 4 )

备注:  Oracle ,PostgreSQL 安装部分略。


--1.3 postgres 编译
./configure --prefix=/opt/pgsql --with-pgport=1921 --with-segsize=8 --with-wal-segsize=64 --with-wal-blocksize=64 --with-perl  --without-openssl --without-pam --without-ldap  --enable-thread-safety

  备注:这里使用了 --without-ldap
 
 
--1.4 postgres 环境变量
  修改 .bash_profile ,内容如下

export PGPORT=1921
export PGDATA=/opt/pgdata/pg_root
export LANG=en_US.utf8

export PGHOME=/opt/pgsql
export ORACLE_BASE=/app/oracle
export ORACLE_HOME=/app/oracle/product/10g
export LD_LIBRARY_PATH=$PGHOME/lib:$ORACLE_HOME/lib:/lib64:/usr/lib64:/usr/local/lib64:/lib:/usr/lib:/usr/local/lib
export DATE=`date +"%Y%m%d%H%M"`
export PATH=$PGHOME/bin:$ORACLE_HOME/bin:$PATH:.
export MANPATH=$PGHOME/share/man:$MANPATH

alias rm='rm -i'
alias ll='ls -lh'

  备注:环境变量 里加入了 ORACLE_BASE, ORACLE_HOME ,以及环境变量 LD_LIBRARY_PATH 增加了
           $PGHOME/lib。


二 安装 oracle_fdw
--2.1 下载 oracle_fdw
http://pgxn.org/dist/oracle_fdw/

 备注:下载并解压到 /opt/soft_bak 目录。


--2.2 install oraclel_fdw
[root@primary-01 oracle_fdw-0.9.3]# cd /opt/soft_bak/oracle_fdw-0.9.3
[root@primary-01 oracle_fdw-0.9.3]# source /home/postgres/.bash_profile
[root@primary-01 oracle_fdw-0.9.3]# source /home/oracle/.bash_profile

   备注:在安装 oracle_fdw 前需要先载入 PostgreSQL 和 Oracle 用户环境变量。

[root@primary-01 oracle_fdw-0.9.3]# make
gcc -O2 -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wformat-security -fno-strict-aliasing -fpic -I/app/oracle/product/10g/sdk/include -I/app/oracle/product/10g/oci/include -I/app/oracle/product/10g/rdbms/public -I. -I. -I/opt/pgsql/include/server -I/opt/pgsql/include/internal -D_GNU_SOURCE   -c -o oracle_fdw.o oracle_fdw.c
gcc -O2 -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wformat-security -fno-strict-aliasing -fpic -I/app/oracle/product/10g/sdk/include -I/app/oracle/product/10g/oci/include -I/app/oracle/product/10g/rdbms/public -I. -I. -I/opt/pgsql/include/server -I/opt/pgsql/include/internal -D_GNU_SOURCE   -c -o oracle_utils.o oracle_utils.c
gcc -O2 -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wformat-security -fno-strict-aliasing -fpic -shared -o oracle_fdw.so oracle_fdw.o oracle_utils.o -L/opt/pgsql/lib  -Wl,-rpath,'/opt/pgsql/lib',--enable-new-dtags  -L/app/oracle/product/10g -L/app/oracle/product/10g/bin -L/app/oracle/product/10g/lib -lclntsh

[root@primary-01 oracle_fdw-0.9.3]# make install
/bin/mkdir -p '/opt/pgsql/lib'
/bin/mkdir -p '/opt/pgsql/share/extension'
/bin/mkdir -p '/opt/pgsql/share/doc/extension'
/bin/sh /opt/pgsql/lib/pgxs/src/makefiles/../../config/install-sh -c -m 755  oracle_fdw.so '/opt/pgsql/lib/oracle_fdw.so'
/bin/sh /opt/pgsql/lib/pgxs/src/makefiles/../../config/install-sh -c -m 644 ./oracle_fdw.control '/opt/pgsql/share/extension/'
/bin/sh /opt/pgsql/lib/pgxs/src/makefiles/../../config/install-sh -c -m 644 ./oracle_fdw--1.0.sql  '/opt/pgsql/share/extension/'
/bin/sh /opt/pgsql/lib/pgxs/src/makefiles/../../config/install-sh -c -m 644 ./README.oracle_fdw '/opt/pgsql/share/doc/extension/'

  备注:如果出现上面信息,说明 oracle_fdw 编译安装成功。
 

--2.3 test creating extension
postgres=# create extension oracle_fdw;
ERROR:  could not load library "/opt/pgsql/lib/oracle_fdw.so": libclntsh.so.10.1: cannot open shared object file: No such file or directory

  备注:一开始创建 oraclre_fdw 时,提示少了 so 文件,这个比较好解决,只要将对应的 so 文件 copy
              到 $PGHOME/lib 下就行
 

[root@primary-01 oracle_fdw-0.9.3]# cd /app/oracle/product/10g/lib
[root@primary-01 lib]# ll libclntsh.so.10.1
-rwxr-xr-x  1 oracle oinstall 18M Jan 10  2010 libclntsh.so.10.1

[root@primary-01 lib]# cp libclntsh.so.10.1 /opt/pgsql/lib/
[root@primary-01 lib]# chown postgres:postgres /opt/pgsql/lib/libclntsh.so.10.1

[root@primary-01 lib]# ll /opt/pgsql/lib/libclntsh.so.10.1
-rwxr-xr-x  1 postgres postgres 18M Mar  3 14:29 /opt/pgsql/lib/libclntsh.so.10.1


--2.4 再次创建 oracle_fdw
skytf=#  create extension oracle_fdw;
CREATE EXTENSION
skytf=# \dx
                        List of installed extensions
    Name    | Version |   Schema   |              Description              
------------+---------+------------+----------------------------------------
 oracle_fdw | 1.0     | public     | foreign data wrapper for Oracle access
 plpgsql    | 1.0     | pg_catalog | PL/pgSQL procedural language
(2 rows)

  备注:再次测试 oracle_fdw,终于成功了。

 

三 创建 Oracle 只读用户
--3.1 oracle 创建只读用户并赋只读权限  ( On Oracle)
SQL> CREATE USER read_only  IDENTIFIED BY "read_only"
  2    DEFAULT TABLESPACE TB_skytf
  3    TEMPORARY TABLESPACE TEMP
  4    PROFILE DEFAULT
  5    ACCOUNT UNLOCK;

User created.

SQL> GRANT CONNECT TO read_only;

Grant succeeded.

SQL> grant select on skytf.test_1 to read_Only;

Grant succeeded.

SQL> conn read_only/read_only;
Connected.


--3.2 测试 read_only 用户
SQL> select * from skytf.test_1;

        ID R
---------- -
         1 a
         2 b
  备注: oracle 库中的 read_only 等下用于在 PG 中连接 Oracle 的只读用户。


四 在目标库 skytf 中创建  oracle_srv
--4.1 create foreign server
skytf=#   CREATE SERVER oracle_srv
skytf-#   FOREIGN DATA WRAPPER oracle_fdw
skytf-#   OPTIONS (dbserver 'primary_1');
CREATE SERVER

--4.2 tnsping test
[postgres@primary-01 ~]$ tnsping primary_1

TNS Ping Utility for Linux: Version 10.2.0.1.0 - Production on 03-MAR-2012 15:55:15

Copyright (c) 1997, 2005, Oracle.  All rights reserved.

Used parameter files:


Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION= (ADDRESS= (PROTOCOL=TCP) (HOST=192.168.1.30) (PORT=1521)) (CONNECT_DATA= (SERVICE_NAME=MANUA)))
OK (10 msec)
[postgres@primary-01 ~]$

  备注: 以 postgres 用户 tnsping 测试下,并且也可以 sqlplus 测试下,看看是否能连 oracle 库。


--4.3 create mapping users
skytf=> CREATE USER MAPPING FOR skytf
skytf-> SERVER oracle_srv
skytf-> OPTIONS (user 'read_only', password 'read_only');
CREATE USER MAPPING

skytf=# grant usage on foreign server oracle_srv to skytf;
GRANT


--4.4 create foreign table
skytf=# \c skytf skytf
You are now connected to database "skytf" as user "skytf".

skytf=> CREATE FOREIGN TABLE ft_test_1 (
skytf(>  id       integer,
skytf(>  name     character varying(20)
skytf(>  ) SERVER oracle_srv
skytf-> OPTIONS (schema 'skytf', table 'test_1');
CREATE FOREIGN TABLE


--4.5 查询测试
skytf=> select * from ft_test_1;
 id | name
----+------
  1 | a
  2 | b
(2 rows)

   备注:终于可以查询到对端 Oracle 库了,到了这步,说明 oracle_fdw 配置成功!


五 常见问题
5.1 问题一
skytf=> select * from ft_test_1;
ERROR:  error connecting to Oracle: OCIEnvCreate failed to create environment handle
DETAIL: 

  备注: 在成功安装 orcle_fdw 后,查询外部表时老遇到上面 ERROR, 后来网上查了下,可能是在
              PostgreSQL  的环境变量中没有下正确设置 Oracle 的环境变量 ,但检查了下,环境变量
              设置没问题,为了操作方便,后来将 PostgreSQL 的 group 设置成 oinstall ,这样 Oracle
              用户和 postgres 用户属于同一组了,之后再重启 PostgreSQL 就正常了。

5.2 解决方法
[root@primary-01 bin]# usermod -g oinstall postgres
[postgres@primary-01 ~]$ id
uid=501(postgres) gid=500(oinstall) groups=500(oinstall) context=user_u:system_r:unconfined_t


5.3 缺少 so 文件
postgres=# create extension oracle_fdw;
ERROR:  could not load library "/opt/pgsql/lib/oracle_fdw.so": libclntsh.so.10.1:
 
    备注: 一开始创建 oraclre_fdw 时,提示少了 so 文件。


5.4 解决方法

     只要将对应的 so 文件 copy    到 $PGHOME/lib 下就行,详见 2.3 步骤。  
  

六 总结  
  
   oracle_fdw 的出现为 Oracle 转 PostgreSQL 项目提供了又一种方法,至于迁数据的效率
   今天没有环境具体测试。
   
       
七 参考
http://pgxn.org/dist/oracle_fdw/
http://www.postgresql.org/docs/9.1/static/sql-createserver.html
       

  评论这张
 
阅读(34235)| 评论(8)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016