描述
Ora2Pg:甲骨文PostgreSQL数据库模式转换器是一个免费的工具用于Oracle数据库迁移到PostgreSQL兼容模式。它连接Oracle数据库,扫描它自动提取其结构或数据,然后生成SQL脚本,您可以加载到PostgreSQL数据库。Ora2Pg从Oracle数据库逆向工程可以使用巨大的企业数据库迁移或者复制一些Oracle数据成一个PostgreSQL数据库。它很容易使用,不需要任何Oracle数据库知识比提供所需的参数连接Oracle数据库。
 
安装
首先要感谢Gilles Darold提供了Ora2Pg工具。目前最新的版本1.74
1. 安装依赖包
yum install perl-DBI perl-DBD-Pg perl-ExtUtils-MakeMaker gcc
wget http://search.cpan.org/CPAN/authors/id/P/PY/PYTHIAN/DBD-Oracle-1.74.tar.gz
tar -zxvf DBD-Oracle-1.74.tar.gz
cd DBD-Oracle-1.74
source /home/oracle/.bash_profile
perl Makefile.PL -l
make
make install

2.安装 ora2pg包

下载地址:https://github.com/darold/ora2pg/tree/v17.4
unzip ora2pg-17.4.zip
cd ora2pg-17.4
perl Makefile.PL
make
make install
/usr/local/bin/ora2pg -v --默认安装在/usr/local/bin/目录下;版本为v17.4。
Ora2Pg v17.4
 
配置
Ora2Pg配置文件默认位置:/etc/ora2pg/ora2pg.conf; 这个在安装Ora2Pg会有提示。
/usr/local/bin/ora2pg -c /etc/ora2pg/ora2pg.conf
下面针对配置做下简单讲解
1. Limiting object to export。
#允许或者(排除)某个对象或者某些对象导出;
/etc/ora2pg/ora2pg.conf
ORACLE_HOME /u01/app/oracle
#This directive is used to set the data source name in the form standard DBI DSN
ORACLE_DSN dbi:Oracle:ora229
ORACLE_USER lottu
ORACLE_PWD li0924
LOGFILE /tmp/Ora2Pg.log
SCHEMA LOTTU
TYPE TABLE INSERT
ALLOW ORATAB
OUTPUT lottu01.sql
[root@sdserver40_222 ~]# ora2pg -c /etc/ora2pg/ora2pg.conf
[========================>] 1/1 tables (100.0%) end of scanning.
[> ] 0/1 tables (0.0%) end of scanning.
[========================>] 1/1 tables (100.0%) end of table export.
[====> ] 1/6 rows (16.7%) Table ORATAB (1 recs/sec)
[========================>] 6/6 rows (100.0%) on total estimated data (1 sec., avg: 6 recs/sec)
[root@sdserver40_222 ~]# cat lottu01.sql
-- Generated by Ora2Pg, the Oracle database Schema converter, version 17.4
-- Copyright 2000-2016 Gilles DAROLD. All rights reserved.
-- DATASOURCE: dbi:Oracle:ora229
SET client_encoding TO 'UTF8';
\set ON_ERROR_STOP ON
CREATE TABLE oratab (
id bigint,
name varchar(20)
) ;
-- Generated by Ora2Pg, the Oracle database Schema converter, version 17.4
-- Copyright 2000-2016 Gilles DAROLD. All rights reserved.
-- DATASOURCE: dbi:Oracle:ora229
SET client_encoding TO 'UTF8';
\set ON_ERROR_STOP ON
BEGIN;
INSERT INTO oratab (id,name) VALUES (1001,E'li0924');
ALTER SEQUENCE IF EXISTS ggs_marker_seq RESTART WITH 7117;
ALTER SEQUENCE IF EXISTS ggs_ddl_seq RESTART WITH 7117;
COMMIT

解释:

#参数 ALLOW:指导出匹配的对象;例如:ALLOW EMPLOYEES SALE_.* COUNTRIES .*_GEOM_SEQ :导出的对象名称有 EMPLOYEES, COUNTRIES, 以 'SALE_'开头 以 '_GEOM_SEQ'结尾的。
#参数 EXCLUDE就是排除匹配的对象;与ALLOW相反。
#参数 WHERE:对象记录排除;这个只针对TYPE TABLE.
#上例还可以这样执行;配置文件注释ALLOW/EXCLUDE;在执行命令用-a : allow|-e : exclude来替代。
#执行命令 ora2pg -a "ORATAB" -c /etc/ora2pg/ora2pg.conf
 
2.Export Oracle tables as foreign table for oracle_fdw
#做oracle迁移到postgres;其中oracle_fdw也是一个很好的方案. 那上例只需改下参数TYPE FDW;并把参数WHERE注释;这对oracle_fdw是一大助力。避免手写外部表脚本。
[root@sdserver40_222 ~]# ora2pg -c /etc/ora2pg/ora2pg.conf
[========================>] 1/1 tables (100.0%) end of scanning.
[========================>] 1/1 tables (100.0%) end of table export.
[root@sdserver40_222 ~]# cat lottu02.sql
-- Generated by Ora2Pg, the Oracle database Schema converter, version 17.4
-- Copyright 2000-2016 Gilles DAROLD. All rights reserved.
-- DATASOURCE: dbi:Oracle:ora229
SET client_encoding TO 'UTF8';
\set ON_ERROR_STOP ON
CREATE FOREIGN TABLE oratab (
id bigint,
name varchar(20)
) SERVER orcl OPTIONS(schema 'LOTTU', table 'ORATAB');

3. Modifying object structure

#由上面导出的oratab.id类型是bigint;可是我只需要int就行;不需要字段类型为长整型;name类型由varchar(20)改为text类型。
#同时导出表的名字我也想修改为:lottu
[root@sdserver40_222 ~]# cat /etc/ora2pg/ora2pg.conf
ORACLE_HOME /u01/app/oracle
#This directive is used to set the data source name in the form standard DBI DSN
ORACLE_DSN dbi:Oracle:ora229
ORACLE_USER lottu
ORACLE_PWD li0924
LOGFILE /tmp/Ora2Pg.log
SCHEMA LOTTU
TYPE TABLE
ALLOW ORATAB
REPLACE_TABLES ORATAB:LOTTU01
MODIFY_TYPE ORATAB:ID:INT,ORATAB:NAME:TEXT
OUTPUT lottu03.sql
[root@sdserver40_222 ~]# ora2pg -c /etc/ora2pg/ora2pg.conf
[========================>] 1/1 tables (100.0%) end of scanning.
[========================>] 1/1 tables (100.0%) end of table export.
[root@sdserver40_222 ~]# cat lottu03.sql
-- Generated by Ora2Pg, the Oracle database Schema converter, version 17.4
-- Copyright 2000-2016 Gilles DAROLD. All rights reserved.
-- DATASOURCE: dbi:Oracle:ora229

SET client_encoding TO 'UTF8';

\set ON_ERROR_STOP ON

CREATE TABLE lottu01 (
id int,
name text
) ;

解释:

#参数:REPLACE_TABLES 替换表名;格式REPLACE_TABLES ORIG_TBNAME1:DEST_TBNAME1 ORIG_TBNAME2:DEST_TBNAME2;这个很好理解
#参数:MODIFY_TYPE 指定表中字段类型。
4.Extract procedures/functions/packages
[root@sdserver40_222 ~]# ora2pg -c /etc/ora2pg/ora2pg.conf
[========================>] 2/2 functions (100.0%) end of output.
[root@sdserver40_222 ~]# cat lottu04.sql
-- Generated by Ora2Pg, the Oracle database Schema converter, version 17.4
-- Copyright 2000-2016 Gilles DAROLD. All rights reserved.
-- DATASOURCE: dbi:Oracle:ora229
SET client_encoding TO 'UTF8';
\set ON_ERROR_STOP ON
CREATE OR REPLACE FUNCTION ora2pg_16_to10 (v_16_data text) RETURNS bigint AS $body$
DECLARE
v_data bigint;
v_char varchar(18);
BEGIN
v_char:=substring(v_16_data from 2);
select sum(data) into v_data from
(
SELECT (
case substr(upper(v_char),rownum,1)
when 'A' then '10'
when 'B' then '11'
when 'C' then '12'
when 'D' then '13'
when 'E' then '14'
when 'F' then '15'
else substring(v_char from rownum for 1) end
)*power(16,length(v_char)-rownum) data

connect by rownum<=length(v_char)
);
return v_data;
exception
when others then
return null;
end;
$body$
LANGUAGE PLPGSQL
SECURITY DEFINER
;
-- REVOKE ALL ON FUNCTION ora2pg_16_to10 (v_16_data text) FROM PUBLIC;

CREATE OR REPLACE FUNCTION ora2pg_add_1 (v_in_1 bigint,v_in_2 bigint) RETURNS bigint AS $body$
DECLARE

v_data bigint;

BEGIN
v_data := v_in_1+v_in_2;
return v_data;
exception
when others then
return null;
end;
$body$
LANGUAGE PLPGSQL
SECURITY DEFINER
;
-- REVOKE ALL ON FUNCTION ora2pg_add_1 (v_in_1 bigint,v_in_2 bigint) FROM PUBLIC;

[root@sdserver40_222 ~]# cat /etc/ora2pg/ora2pg.conf
ORACLE_HOME /u01/app/oracle
#This directive is used to set the data source name in the form standard DBI DSN
ORACLE_DSN dbi:Oracle:ora229
ORACLE_USER lottu
ORACLE_PWD li0924
LOGFILE /tmp/Ora2Pg.log
SCHEMA LOTTU
TYPE FUNCTION
ALLOW ORA2PG_.*
OUTPUT lottu04.sql

备注:

上面提供了两个函数;ora2pg_16_to10函数有postgres不支持的语法;ora2pg_add_1函数是简单的函数。意思是说ora2pg支持简单的函数导出;
其中connect by语法是postgres不支持的语法;导出并不会做修改;这样的代码在postgres执行之前需要修改。这个修改代码需要各位的开发技能。
未完待续.....
若更了解Ora2Pg;可以去看官方文档。
 
【FAQ】
[root@sdserver40_222 ~]# ora2pg -c /etc/ora2pg/ora2pg.conf
install_driver(Oracle) failed: Can't load '/usr/local/lib64/perl5/auto/DBD/Oracle/Oracle.so' for module DBD::Oracle: libclntsh.so.11.1: cannot open shared object file: No such file or directory at /usr/lib64/perl5/DynaLoader.pm line 200.
at (eval 13) line 3
Compilation failed in require at (eval 13) line 3.
Perhaps a required shared library or dll isn't installed where expected
at /usr/local/share/perl5/Ora2Pg.pm line 1323
[root@sdserver40_222 ~]# source /home/oracle/.bash_profile
[root@sdserver40_222 ~]# echo $ORACLE_HOME/lib >> /etc/ld.so.conf
 

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

  1. oracle迁移postgres之-oracle_fdw

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

  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. 微信小程序wafer

    1.Centos 重启nginx systemctl restart|stop|start|status nginx.service status是状态,可以看出nginx是否正在运行! system ...

  2. 基于spring 的单元测试

    需要引用的依赖: import org.junit.runner.RunWith;import org.springframework.test.context.ContextConfiguratio ...

  3. MyBatis学习总结(三)——优化MyBatis配置文件中的配置(转载)

    本文转载自:http://www.cnblogs.com/jpf-java/p/6013548.html 一.连接数据库的配置单独放在一个properties文件中 之前,我们是直接将数据库的连接配置 ...

  4. IntelliJ IDEA中如何显示和关闭----工具栏,目录栏,(转)

    工具栏:就是上面有个好多的快捷按钮的那个栏,比如撤销,上传,下载设置,扳手按钮,等等. 目录栏,就是刚刚装的时候,这个会显示,但是不知道怎么关闭,但是这个又没什么用. 如图: 就是对应的几个按钮,自己 ...

  5. ansible 安装

    1.简介 ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet.cfengine.chef.func.fabric)的优点,实现了批量系统配置.批量程序部署. ...

  6. 取到 tableview 自定义section header 上的button

    在自定义的组头上,添加了一个button,在点击cell是想取到相应的组头上的button来进行操作时(比如说隐藏.是否响应点击事件等)时,我遇到了取不到所有button的问题,试过了常规的通过vie ...

  7. RunLoop相关知识的总结

    RunLoop 即运行循环,也叫事件循环,本质为一个死循环.iOS一个程序运行起来之后,默认会开启一个运行循环,有需要处理的操作时,比如用户的输入事件时,RunLoop会自己跑起来运行,没有需要处理的 ...

  8. SQL CURSOR

    SET NOCOUNT ON; DECLARE @vendor_id int, @vendor_name nvarchar(50),     @message varchar(80), @produc ...

  9. jar包目录下MANIFEST.MF标准格式

    jar包目录格式: |-- com | |-- test.class |-- META-INF | |-- MAINFEST.MF 一个正常的jar包下必有META-INF/MANIFEST.MF清单 ...

  10. Python开发程序:RPC异步执行命令(RabbitMQ双向通信)

    RPC异步执行命令 需求: 利用RibbitMQ进行数据交互 可以对多台服务器进行操作 执行命令后不等待命令的执行结果,而是直接让输入下一条命令,结果出来后自动打印 实现异步操作 不懂rpc的请移步h ...