1. 安装oracle_fdw
在编译安装前,需要设置postgres的环境变量,如在.bash_profile中增加:
export ORACLE_HOME=/u01/app/oracle
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH
export PATH=${PATH}:${ORACLE_HOME}/bin/

--下载 : http://pgxn.org/dist/oracle_fdw/

[root@sdserver40_222 contrib]# unzip oracle_fdw-1.5.0.zip
[root@sdserver40_222 contrib]# cd oracle_fdw-1.5.0
--查看pg_config是否在对应PGHOME/bin目录下。编译后会在对应的目录下面
[root@sdserver40_222 oracle_fdw-1.5.0]# which pg_config
/opt/pgsql/bin/pg_config
[root@sdserver40_222 oracle_fdw-1.5.0]# make
[root@sdserver40_222 oracle_fdw-1.5.0]# make install
[root@sdserver40_222 oracle_fdw-1.5.0]# cd /opt/pgsql/lib
[root@sdserver40_222 lib]# ll oracle_fdw.so
-rwxr-xr-x 1 root root 151893 Oct 18 14:11 oracle_fdw.so
编译成功会在PGHOME/lib目录下会生成 oracle_fdw.so。
2. 创建oracle_fdw外部表
创建oracle_fdw模块需要libclntsh.so.11.1加载库;在$ORACLE_HOME/lib目录下面;
[root@sdserver40_222 lib]# cd /u01/app/oracle/lib/
[root@sdserver40_222 lib]# ll libclntsh.so.11.1
-rwxr-xr-x 1 oracle oinstall 48725761 Jul 26 14:12 libclntsh.so.11.1
[root@sdserver40_222 lib]# cp libclntsh.so.11.1 /opt/pgsql/lib
[root@sdserver40_222 lib]# cd /opt/pgsql/lib
[root@sdserver40_222 lib]# ll libclntsh.so.11.1
-rwxr-xr-x 1 root root 48725761 Oct 18 14:50 libclntsh.so.11.1

在psql中,使用超级用户:

postgres=# create extension oracle_fdw;
CREATE EXTENSION
postgres=# \dx
List of installed extensions
Name | Version | Schema | Description
-------------+---------+------------+----------------------------------------
oracle_fdw | 1.1 | public | foreign data wrapper for Oracle access
pgstattuple | 1.3 | public | show tuple-level statistics
plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language
 -本次环境测试是;oracle和postgres在同一台服务器上;若不在同一台服务器;postgres服务器需要安装oracle客户端;并配置tnsnames.ora
--下面的 ora229 是来源于$ORACLE_HOME/networks/admin/tnsnames里面的。
--当然也可以使用//oracle-ip/oracle_sid来替换ora229。
postgres=# CREATE SERVER oradb FOREIGN DATA WRAPPER oracle_fdw OPTIONS (dbserver 'ora229');
CREATE SERVER
-- 将server oradb付给用户
postgres=# GRANT USAGE ON FOREIGN SERVER oradb TO lottu;
GRANT
--关联用户(oracle->postgres)
postgres=# CREATE USER MAPPING FOR postgres SERVER oradb OPTIONS (user 'lottu', password 'li0924');
CREATE USER MAPPING
--在oracle服务器创建测试验证表oratab;操作如下:
SQL> select * from oratab;
no rows selected
SQL> insert into oratab select level,'lottu'||level from dual connect by level <=5;
5 rows created.
SQL> commit;
Commit complete.
--这里主要的是oracle跟postgres数据类型不一样时;需要修改下。
--在postgres9.3版本 oracle_fdw支持对外部表的 Insert ,delete ,update ;增加表操作项 options(key 'true') (当值设置为 true|on|yes 表示不可以做增删改操作) 默认值false
postgres=# CREATE FOREIGN TABLE lottu(id int options(key 'true'), name varchar(20)) SERVER oradb OPTIONS (schema 'LOTTU', table 'ORATAB');
CREATE FOREIGN TABLE
postgres=# select * from lottu;
id | name
----+--------
1 | lottu1
2 | lottu2
3 | lottu3
4 | lottu4
5 | lottu5
若出现下面这种问题;原因是出现在OPTIONS (schema 'LOTTU', table 'ORATAB');里面的schema/table需要用大写标注;
借用官方一句话就是“(Remember that table and schema name -- the latter is optional -- must normally be in uppercase.)”
postgres=# select * from oratab;
ERROR: Oracle table "lottu"."oratab" for foreign table "oratab" does not exist or does not allow read access
DETAIL: ORA-00942: table or view does not exist
HINT: Oracle table names are case sensitive (normally all uppercase).
 
3.测试验证
在postgres9.3版本oracle_fdw支持对外部表的 Insert ,delete ,update;这意味着;oracle|postgres都可以对表进行dml操作。这对oracle迁移postgres将会很灵活。
--oracle
SQL> insert into oratab values (1001,'li0924');
1 row created.
SQL> commit;
Commit complete.
--postgres postgres=# delete from lottu where id = 1; DELETE 1 postgres=# select * from lottu; id | name ------+-------- 2 | lottu2 3 | lottu3 4 | lottu4 5 | lottu5 1001 | li0924
【总结】
1. 在postgres9.3版本oracle_fdw支持对外部表的 Insert ,delete ,update;建表添加options(key 'true')这意味着;
oracle|postgres都可以对表进行dml操作。这对oracle迁移postgres将会很灵活。
对postgres是否外部表的 Insert ,delete ,update。oracle_fdw有两个参数可以决定
1. Column options:options (true|on|yes, defaults to "false")
2. table options: readonly (true|on|yes, defaults to "false")
当确定postgres不支持外部表的 Insert ,delete ,update操作;建议使用readonly 'yes';出现的错误提示更亲民些。
例如
postgres=# CREATE FOREIGN TABLE lottu01(id int options(key 'true'), name varchar(20)) SERVER oradb OPTIONS (schema 'LOTTU', table 'ORATAB', readonly 'yes');
CREATE FOREIGN TABLE
postgres=# delete from lottu01 where id = 2;
ERROR: foreign table "lottu01" does not allow deletes
 
2. 外部表支持逻辑备份pg_dump
[postgres@sdserver40_222 ~]$ pg_dump -F p -C -d postgres -f lottu.sql
[postgres@sdserver40_222 ~]$ grep "FOREIGN TABLE" lottu
grep: lottu: No such file or directory
[postgres@sdserver40_222 ~]$ grep "FOREIGN TABLE" lottu.sql
-- Name: lottu; Type: FOREIGN TABLE; Schema: public; Owner: postgres
CREATE FOREIGN TABLE lottu (
ALTER FOREIGN TABLE lottu ALTER COLUMN id OPTIONS (
ALTER FOREIGN TABLE lottu OWNER TO postgres;
-- Name: tab01; Type: FOREIGN TABLE; Schema: public; Owner: postgres
CREATE FOREIGN TABLE tab01 (
ALTER FOREIGN TABLE tab01 ALTER COLUMN id OPTIONS (
ALTER FOREIGN TABLE tab01 OWNER TO postgres;
 

oracle迁移postgres之-oracle_fdw的更多相关文章

  1. oracle迁移postgres之-Ora2Pg

    描述 Ora2Pg:甲骨文PostgreSQL数据库模式转换器是一个免费的工具用于Oracle数据库迁移到PostgreSQL兼容模式.它连接Oracle数据库,扫描它自动提取其结构或数据,然后生成S ...

  2. 阿里云如何打破Oracle迁移上云的壁垒

    2018第九届中国数据库技术大会,阿里云数据库产品专家萧少聪带来以阿里云如何打破Oracle迁移上云的壁垒为题的演讲.Oracle是指“数据库管理系统”,面对Oracle迁移上云的壁垒,阿里云如何能够 ...

  3. 适用MySQL Migration Toolkit 1.0 将oracle迁移到mysql中遇到的问题

    这里主要说一下我在适用中碰到的问题,主要过程参考 http://www.cnblogs.com/duwenlei/p/3520759.html. 首先启动MySQLMigrationTool.exe ...

  4. 使用Microsoft SQL Server Migration Assistant for Oracle迁移数据库

    前言:使用Microsoft SQL Server Migration Assistant for Oracle迁移Oracle数据库到SqlServer数据库. 准备:Oracle11g.SqlSe ...

  5. 使用navicat premium将数据库从Oracle迁移到SQL Server,或从Oracle迁移到MySQL

    有时候我们有迁移数据库的需求,例如从Oracle迁移到SQL Server,或者从MySQL迁移到Oracle. 很多江湖好汉一时不知如何手工操作,所幸的是Navicat提供了迁移的自动化操作界面. ...

  6. Oracle迁移到MySQL性能下降的注意点(转)

    背景:最近有较多的客户系统由原来由Oracle改造到MySQL后出现了性能问题CPU 100%,或是后台的CRM系统复杂SQL在业务高峰的时候出现堆积导致业务故障.在我的记忆里面淘宝最初从Oracle ...

  7. 从Oracle迁移到MySQL的各种坑及自救方案

    当企业内部使用的数据库种类繁杂时,或者有需求更换数据库种类时,都可能会做很多数据迁移的工作.有些迁移很简单,有些迁移可能就会很复杂,大家有没有考虑过为了顺利完成复杂的数据库迁移任务,都需要考虑并解决哪 ...

  8. 怎么将数据库从Oracle迁移到SQL Server,或从Oracle迁移到MySQL

    有时候我们有迁移数据库的需求,例如从Oracle迁移到SQL Server,或者从MySQL迁移到Oracle. 很多江湖好汉一时不知如何手工操作,所幸的是Navicat提供了迁移的自动化操作界面. ...

  9. oracle、postgres、mysql数据库的建库、创建用户、导人导出备份总结

    本文包含的内容:使用命令操作oracle.postgres.mysql的导入导出,登录到数据,创建用户 注:我在公司使用的是Center OS操作系统,所以oracle和postgres均是在Linu ...

随机推荐

  1. github搭建静态博客

    p { margin-bottom: 0.1in; line-height: 120% } 1. 创建Repository 创建一个与自己github用户名对应的Repository,例如:abc.g ...

  2. 阿里云服务器Linux CentOS安装配置(零)目录

    阿里云服务器Linux CentOS安装配置(零)目录 阿里云服务器Linux CentOS安装配置(一)购买阿里云服务器 阿里云服务器Linux CentOS安装配置(二)yum安装svn 阿里云服 ...

  3. Windows Locale Codes - Sortable list(具体一个语言里还可具体细分,中国是2052,法国是1036)

    Windows Locale Codes - Sortable list NOTE: Code page is an outdated method for character encoding, y ...

  4. [软件测试基础3]基于Jemter的压力测试

    一.整体目标 安装LAMP待测系统,推荐ECShop,基于此进行Jmeter压力测试,并在测试后得出Jmeter测试报告,并根据sysstat得出Linux服务器的CIMN(CPU,IO,Memory ...

  5. CodeIgniter 下引入ORM Doctrine

    做了两年的CI开发,一直使用activeRecord来操作数据库.简单,轻巧加方便.最近一个项目交给手下去做,也是采用从数据库设计入手的开发流程,现在已经上线运行.经历了理清需求,设计数据库,在CI中 ...

  6. [功能改进]Live Writer发博支持“建分类、加标签、写摘要”

    以前您在园子里用Windows Live Wirter发布博文是不是有以下三个不爽: 不爽1:如果想在发布随笔时新建分类并将随笔添加至该分类,需要先在博客后台添加分类,然后在Live Writer中刷 ...

  7. PostgreSQL ROW_NUMBER() OVER()

    转自:http://blog.csdn.net/luojinbai/article/details/45078809 语法:  ROW_NUMBER() OVER( [ PRITITION BY co ...

  8. shell面试题目总结

    1.如何理解shell脚本中第一行#!/bin/sh #!为特殊的表示符,其后是解释此脚本的shell的路径.此脚本使用/bin/sh进行解释执行. 2.如何向脚本传递参数. 脚本名字 参数1 参数2 ...

  9. 利用pip安装模块(以安装pyperclip为例)

    >任务:利用pip安装pyperclip模块 >前提:你已经在你的电脑里面安装啦Python2.7的Windows版本,并且已经配置了环境变量 >实现步骤 >>打开你的P ...

  10. Docker的镜像

    镜像是容器的运行基础,容器是镜像运行后台的形态 镜像的概念 镜像是一个包含程序运行必要依赖环境和代码的只读文件,它采用分层的文件系统,将每一次改变以读写层的形式增加到原来的只读文件上 镜像的系统结构 ...