oracle迁移postgres之-oracle_fdw

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=# 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;

时间: 2024-11-04 06:39:51

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

oracle迁移postgres之-Ora2Pg

描述 Ora2Pg:甲骨文PostgreSQL数据库模式转换器是一个免费的工具用于Oracle数据库迁移到PostgreSQL兼容模式.它连接Oracle数据库,扫描它自动提取其结构或数据,然后生成SQL脚本,您可以加载到PostgreSQL数据库. Ora2Pg从Oracle数据库逆向工程可以使用巨大的企业数据库迁移或者复制一些Oracle数据成一个PostgreSQL数据库.它很容易使用,不需要任何Oracle数据库知识比提供所需的参数连接Oracle数据库. 安装 首先要感谢Gilles

从Oracle迁移到SQL Server的陷阱

在把Oracle查询转换为SQL Server的时候要特别当心一些不容易注意到的问题.我们知道,T-SQL是SQL Server的语言引擎,而Oracle的语言引擎却是PLSQL.这两种查询语言都对ANSI SQL-92标准进行了扩展以提供额外的支持力度.你所创建的应用程序几乎都要用到这些补充特性.本文就对最常用的.非标准的Oracle扩展进行了说明,同时还要介绍下如何对这些扩展进行转化以用在SQL Server环境下. 列的选择 用PLSQL执行数据查询的时候,FROM子句是必须的,这同SQL

Oracle迁移到MySQL性能下降的注意点

背景:最近有较多的客户系统由原来由Oracle改造到MySQL后出现了性能问题CPU 100%,或是后台的CRM系统复杂SQL在业务高峰的时候出现堆积导致业务故障.在我的记忆里面淘宝最初从Oracle迁移到MySQL期间也遇到了很多SQL的性能问题,记忆最为深刻的子查询,当初的版本是MySQL5.1,这个版本对子查询的优化较差,导致了很多从Oracle迁移到MySQL的系统出现过性能问题,所以后面的开发规范中规定前台交易系统不要有复杂的表join.接下来我将列举一些常见从Oracle迁移到MyS

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

讲师介绍  冯帅 点融网高级DBA   获有Oracle OCM.MySQL OCP,目前从事MySQL相关的运维和架构工作,擅长异构数据库交互.   当企业内部使用的数据库种类繁杂时,或者有需求更换数据库种类时,都可能会做很多数据迁移的工作.有些迁移很简单,有些迁移可能就会很复杂,大家有没有考虑过为了顺利完成复杂的数据库迁移任务,都需要考虑并解决哪些问题呢?   在以前的工作中,我迁移过Oracle到Informix.Oracle和SQLServer.Oracle到MySQL. 在目前的公司又

Oracle迁移PPAS:中文表名的处理

Oracle迁移到RDS for PPAS(PostgreSQL)时我们会用到很多不同的工具,在中国有些用户会用 中文 作为表名,甚至字段名.迁移可能会出现ERROR: zero-length delimited identifier at or near """"的错误.针对于此,做了以下DEMO,以重现问题及提供解决方法. ------------------------建3个表,表名分别是:中文1."中文2".""&qu

oracle迁移数据库后启动报错ora-600[25025]解决办法

迁移脚本的日志中报错RMAN-06571: datafile 78 does not have recoverable copy,经查看发现78号文件曾经被offline drop掉.于是重建控制文件,在控制文件中把78号文件去掉,重建控制后,数据库能够mount,mount后数据文件是一致,但是open 时会报错ora-600,异常宕掉. SYS@mydbtst> alter database open; alter database open * ERROR at line 1: ORA-0

配置odbc透明网关实现oracle访问postgres DB

最近帮客户配置了一下通过odbc透明网关,实现在oracle内通过db link访问postgres DB. 简单记录一下: (1)listener.ora和tnsnames.ora的配置: [wsj81@localhost admin]$ cat listener.ora # listener.ora Network Configuration File: /wsj/oracle/app/product/11.2.0/dbhome_1/network/admin/listener.ora #

处理从Oracle迁移到DB2 for z/OS过程中的锁定问题策略

从 Oracle 数据库迁移到 IBM DB2 on z/OS 并非完全无缝,必须进行精心策划.由于两种数据库之间存在锁定差异,因此当从 Oracle 向 DB2 on z/OS 迁移时,管理员可能会面临各种问题(参见表 1).不过,这些问题在很大程度上是可以缓解的. Oracle 与 DB2 on z/OS 之间的主要锁定行为差异之一在于:Oracle 不会在阅读时对行进行任何锁定,而 DB2 却会.这种差异可能导致出现锁等待和相关问题(如从 Oracle 向 DB2 迁移的应用程序中出现死锁

深入ORACLE迁移到MYSQL的总结分析_oracle

这两个星期里一直都在忙于一件事儿,就是数据库的迁移问题.没有做的时候感觉这是一件十分轻松的事儿,可是等到实实在在去做去实现的时候,自己傻眼了.这种纠结啊, 在这里先说下遇到的问题:1.数据库的表结构问题:数据类型不同需要解决varchar2------varchar.number-----int.date----datetime,建表的sql语句字段默认值.注释怎么解决. 2. oracle中没有所谓的敏感字段,可是mysql表中的敏感字段有好多.当时出错的时候很奇怪不知道是哪里错了.原来有个d