ora2pg简单使用

ora2pg是一款免费迁移工具,能将oracle迁移到pg,简单使用并记录过程如下

官方文档:http://ora2pg.darold.net/


环境:

虚拟机 oracle linux 7.7

oracle 11GR2  11.2.0.4

pg 13.1

Ora2Pg v21.0

1.安装ora2pg

1.1 安装perl依赖

ora2pg是Perl语言编写的,所以需要先安装相关环境依赖

[root@localhost ~]$ yum install -y perl perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker
Loaded plugins: langpacks, ulninfo
Resolving Dependencies
--> Running transaction check
---> Package perl.x86_64 4:5.16.3-294.el7_6 will be updated
---> Package perl.x86_64 4:5.16.3-297.el7 will be an update

(省略中间...)                                                

Dependency Installed:
  gdbm-devel.x86_64 0:1.10-8.el7                     libdb-devel.x86_64 0:5.3.21-25.el7         perl-ExtUtils-Install.noarch 0:1.58-297.el7           perl-ExtUtils-Manifest.noarch 0:1.61-244.el7          
  perl-ExtUtils-ParseXS.noarch 1:3.18-3.el7          perl-IPC-Cmd.noarch 1:0.80-4.el7           perl-Locale-Maketext.noarch 0:1.23-3.el7              perl-Locale-Maketext-Simple.noarch 1:0.21-297.el7     
  perl-Module-CoreList.noarch 1:2.76.02-297.el7      perl-Module-Load.noarch 1:0.24-3.el7       perl-Module-Load-Conditional.noarch 0:0.54-3.el7      perl-Module-Metadata.noarch 0:1.000018-2.el7          
  perl-Params-Check.noarch 1:0.38-2.el7              perl-Perl-OSType.noarch 0:1.003-3.el7      perl-Test-Harness.noarch 0:3.28-3.el7                 perl-devel.x86_64 4:5.16.3-297.el7                    
  perl-version.x86_64 3:0.99.07-6.el7                pyparsing.noarch 0:1.5.6-9.el7             systemtap-sdt-devel.x86_64 0:4.0-13.0.1.el7          

Updated:
  perl.x86_64 4:5.16.3-297.el7                                                                                                                                                                               

Dependency Updated:
  perl-libs.x86_64 4:5.16.3-297.el7                                                                                                                                                                          

Complete!
[root@localhost ~]$ 

1.2 安装DBI模块

DBI,Database Independent Interface,是Perl语言连接数据库的接口

下载地址https://metacpan.org/release/DBI  下载出DBI-1.643.tar.gz

然后解压安装

[root@localhost /usr/local]$ tar -xzvf DBI-1.643.tar.gz
[root@localhost /usr/local/DBI-1.643]$ cd DBI-1.643/
[root@localhost /usr/local/DBI-1.643]$ perl Makefile.PL
[root@localhost /usr/local/DBI-1.643]$ make
[root@localhost /usr/local/DBI-1.643]$ make install

1.3 安装DBD::Oracle模块

添加环境变量

export ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1
export PATH=$PATH:$ORACLE_HOME/bin
export LD_LIBRARY_PATH=/u01/app/oracle/product/11.2.0/dbhome_1/lib

安装DBD-Oracle驱动,下载地址https://metacpan.org/pod/release/PYTHIAN/DBD-Oracle-1.74/lib/DBD/Oracle.pm,下载出DBD-Oracle-1.74.tar.gz

[root@localhost /usr/local/DBD-Oracle-1.74]$ tar -zxvf DBD-Oracle-1.74.tar.gz 
[root@localhost /usr/local/DBD-Oracle-1.74]$ cd DBD-Oracle-1.74/
[root@localhost /usr/local/DBD-Oracle-1.74]$ perl Makefile.PL 
[root@localhost /usr/local/DBD-Oracle-1.74]$ make
[root@localhost /usr/local/DBD-Oracle-1.74]$ make install

1.4 安装DBD::Pg模块

安装DBD-Pg驱动,下载地址https://metacpan.org/release/DBD-Pg,下载出DBD-Pg-3.14.2.tar.gz

[root@localhost /usr/local]$ cd DBD-Pg-3.14.2/
[root@localhost /usr/local]$ perl Makefile.PL 
[root@localhost /usr/local]$ make
[root@localhost /usr/local]$ make install

1.5 安装ORA2PG

下载地址https://sourceforge.net/projects/ora2pg/

[root@localhost /usr/local]$ cd ora2pg-21.0/
[root@localhost /usr/local/ora2pg-21.0]$ ls
changelog  doc  INSTALL  lib  LICENSE  Makefile.PL  MANIFEST  packaging  README  scripts
[root@localhost /usr/local/ora2pg-21.0]$ perl Makefile.PL 
Checking if your kit is complete...
Looks good
Writing Makefile for Ora2Pg

Done...
------------------------------------------------------------------------------
Please read documentation at http://ora2pg.darold.net/ before asking for help
------------------------------------------------------------------------------
Now type: make && make install
[root@localhost /usr/local/ora2pg-21.0]$ make
cp lib/Ora2Pg.pm blib/lib/Ora2Pg.pm
cp lib/Ora2Pg/GEOM.pm blib/lib/Ora2Pg/GEOM.pm
cp lib/Ora2Pg/PLSQL.pm blib/lib/Ora2Pg/PLSQL.pm
cp lib/Ora2Pg/MySQL.pm blib/lib/Ora2Pg/MySQL.pm
cp scripts/ora2pg blib/script/ora2pg
/usr/bin/perl -MExtUtils::MY -e 'MY->fixin(shift)' -- blib/script/ora2pg
cp scripts/ora2pg_scanner blib/script/ora2pg_scanner
/usr/bin/perl -MExtUtils::MY -e 'MY->fixin(shift)' -- blib/script/ora2pg_scanner
Manifying blib/man3/ora2pg.3
[root@localhost /usr/local/ora2pg-21.0]$ make install
Installing /usr/local/share/perl5/Ora2Pg.pm
Installing /usr/local/share/perl5/Ora2Pg/GEOM.pm
Installing /usr/local/share/perl5/Ora2Pg/PLSQL.pm
Installing /usr/local/share/perl5/Ora2Pg/MySQL.pm
Installing /usr/local/share/man/man3/ora2pg.3
Installing /usr/local/bin/ora2pg
Installing /usr/local/bin/ora2pg_scanner
Installing default configuration file (ora2pg.conf.dist) to /etc/ora2pg
Appending installation info to /usr/lib64/perl5/perllocal.pod
[root@localhost /usr/local/ora2pg-21.0]$ 

1.6 查看软件是否安装成功

[root@localhost ~]$ cat check.pl 
#!/usr/bin/perl
use strict;
use ExtUtils::Installed;
my $inst=ExtUtils::Installed->new();
my @modules = $inst->modules();
foreach(@modules){
       my $ver = $inst->version($_) || "???";
       printf("%-12s -- %s\n",$_,$ver);
       }
exit;[root@localhost ~]$ perl check.pl 
DBD::Oracle  -- 1.74
DBD::Pg      -- 3.14.2
DBI          -- 1.643
Ora2Pg       -- 21.0
Perl         -- 5.16.3 

测试一下

[root@localhost ~]$ cat ora2pg_table.conf 
ORACLE_HOME /u01/app/oracle/product/11.2.0/dbhome_1
ORACLE_DSN  dbi:Oracle:host=192.168.168.3;sid=orcl
ORACLE_USER sys
ORACLE_PWD  oracle
SCHEMA  scott
TYPE TABLE
PG_NUMERIC_TYPE    0
PG_INTEGER_TYPE    1
DEFAULT_NUMERIC float
SKIP    fkeys pkeys ukeys indexes checks
NLS_LANG    AMERICAN_AMERICA.UTF8
OUTPUT     /root/ora2pg/table.sql
[root@localhost ~]$ ora2pg -t SHOW_VERSION -c ora2pg_table.conf
WARNING: target PostgreSQL version must be set in PG_VERSION configuration directive. Using default: 11
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0
[root@localhost ~]$

2. 简单使用 

oracle以scott这个schema为例,做迁移

2.1 迁移表

2.1.1 编写配置文件

创建ora2pg_table.conf,导出表结构的配置文件,内容见测试部分

创建ora2pg_data.conf,导出数据,内容如下

[root@localhost ~]$ cat ora2pg_data.conf 
ORACLE_HOME /u01/app/oracle/product/11.2.0/dbhome_1
ORACLE_DSN  dbi:Oracle:host=192.168.168.3;sid=orcl
ORACLE_USER system
ORACLE_PWD  oracle
SCHEMA  scott
TYPE COPY
PG_NUMERIC_TYPE    0
PG_INTEGER_TYPE    1
DEFAULT_NUMERIC float
SKIP    fkeys pkeys ukeys indexes checks
NLS_LANG    AMERICAN_AMERICA.UTF8
OUTPUT     /root/ora2pg/data.sql
[root@localhost ~]$ 

2.1.2 导出数据

执行导出命令,导出表结构和数据

[root@localhost ~]$ ora2pg -c ora2pg_table.conf 
WARNING: target PostgreSQL version must be set in PG_VERSION configuration directive. Using default: 11
[========================>] 4/4 tables (100.0%) end of scanning.       
[========================>] 4/4 tables (100.0%) end of table export.
Fixing function calls in output files...
[root@localhost ~]$ ora2pg -c ora2pg_data.conf      
WARNING: target PostgreSQL version must be set in PG_VERSION configuration directive. Using default: 11
[========================>] 4/4 tables (100.0%) end of scanning.       
[========================>] 0/0 rows (100.0%) Table BONUS (0 recs/sec)
[>                        ]  0/23 total rows (0.0%) - (0 sec., avg: 0 recs/sec).
[========================>] 4/4 rows (100.0%) Table DEPT (4 recs/sec)                          
[====>                    ]  4/23 total rows (17.4%) - (0 sec., avg: 4 recs/sec).
[========================>] 14/14 rows (100.0%) Table EMP (14 recs/sec)                         
[==================>      ] 18/23 total rows (78.3%) - (0 sec., avg: 18 recs/sec).
[========================>] 5/5 rows (100.0%) Table SALGRADE (5 recs/sec)                        
[========================>] 23/23 total rows (100.0%) - (0 sec., avg: 23 recs/sec).
[========================>] 23/23 rows (100.0%) on total estimated data (1 sec., avg: 23 recs/sec)
Fixing function calls in output files...

查看导出的sql

[root@localhost ~]$ cd ora2pg/
[root@localhost ~/ora2pg]$ ls
data.sql  table.sql
[root@localhost ~/ora2pg]$ cat table.sql 
-- Generated by Ora2Pg, the Oracle database Schema converter, version 21.0
-- Copyright 2000-2020 Gilles DAROLD. All rights reserved.
-- DATASOURCE: dbi:Oracle:host=192.168.168.3;sid=orcl

SET client_encoding TO 'UTF8';

\set ON_ERROR_STOP ON

SET check_function_bodies = false;


CREATE TABLE bonus (
        ename varchar(10),
        job varchar(9),
        sal float,
        comm float
) ;

CREATE TABLE dept (
        deptno smallint NOT NULL,
        dname varchar(14),
        loc varchar(13)
) ;

CREATE TABLE emp (
        empno smallint NOT NULL,
        ename varchar(10),
        job varchar(9),
        mgr smallint,
        hiredate timestamp,
        sal decimal(7,2),
        comm decimal(7,2),
        deptno smallint
) ;

CREATE TABLE salgrade (
        grade float,
        losal float,
        hisal float
) ;
[root@localhost ~/ora2pg]$ cat data.sql 

BEGIN;

COPY bonus (ename,job,sal,comm) FROM STDIN;
\.

COPY dept (deptno,dname,loc) FROM STDIN;
10      ACCOUNTING      NEW YORK
20      RESEARCH        DALLAS
30      SALES   CHICAGO
40      OPERATIONS      BOSTON
\.

COPY emp (empno,ename,job,mgr,hiredate,sal,comm,deptno) FROM STDIN;
7369    SMITH   CLERK   7902    1980-12-17 00:00:00     800     \N      20
7499    ALLEN   SALESMAN        7698    1981-02-20 00:00:00     1600    300     30
7521    WARD    SALESMAN        7698    1981-02-22 00:00:00     1250    500     30
7566    JONES   MANAGER 7839    1981-04-02 00:00:00     2975    \N      20
7654    MARTIN  SALESMAN        7698    1981-09-28 00:00:00     1250    1400    30
7698    BLAKE   MANAGER 7839    1981-05-01 00:00:00     2850    \N      30
7782    CLARK   MANAGER 7839    1981-06-09 00:00:00     2450    \N      10
7788    SCOTT   ANALYST 7566    1987-04-19 00:00:00     3000    \N      20
7839    KING    PRESIDENT       \N      1981-11-17 00:00:00     5000    \N      10
7844    TURNER  SALESMAN        7698    1981-09-08 00:00:00     1500    0       30
7876    ADAMS   CLERK   7788    1987-05-23 00:00:00     1100    \N      20
7900    JAMES   CLERK   7698    1981-12-03 00:00:00     950     \N      30
7902    FORD    ANALYST 7566    1981-12-03 00:00:00     3000    \N      20
7934    MILLER  CLERK   7782    1982-01-23 00:00:00     1300    \N      10
\.

COPY salgrade (grade,losal,hisal) FROM STDIN;
1       700     1200
2       1201    1400
3       1401    2000
4       2001    3000
5       3001    9999
\.

COMMIT;

[root@localhost ~/ora2pg]$ 

2.1.3 导入到pg

[root@localhost ~/ora2pg]$ psql postgres postgres -f table.sql 
SET
SET
CREATE TABLE
CREATE TABLE
CREATE TABLE
CREATE TABLE
[root@localhost ~/ora2pg]$ psql postgres postgres -f data.sql
BEGIN
COPY 0
COPY 4
COPY 14
COPY 5
COMMIT

用navicat查看表和表中数据是否已经在pg中存在

image

表结构和表数据迁移过去了

2.2 迁移视图

oracle建立测试视图

类似迁移表,配置文件的type改为VIEW即可

oracle的scott用户下没有视图,我创建个测试视图

[oracle@localhost ~]$ sqlplus scott/tiger

SQL*Plus: Release 11.2.0.4.0 Production on Tue Dec 22 11:10:06 2020

Copyright (c) 1982, 2013, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

11:10:06 SCOTT@orcl> create or replace view view_test as
11:10:16   2  select b.dname,sum(a.sal) sal
11:10:16   3  from emp a
11:10:16   4  join dept b on a.deptno=b.deptno
11:10:16   5  group by b.dname; 

View created.

Elapsed: 00:00:00.01
11:10:18 SCOTT@orcl> select * from view_test;

DNAME                 SAL
-------------- ----------
ACCOUNTING           8750
RESEARCH            10875
SALES                9400

Elapsed: 00:00:00.00
11:10:28 SCOTT@orcl> 

编辑配置文件并迁移

过程如下

[root@localhost ~]$ cat ora2pg_view.conf 
ORACLE_HOME /u01/app/oracle/product/11.2.0/dbhome_1
ORACLE_DSN  dbi:Oracle:host=192.168.168.3;sid=orcl
ORACLE_USER sys
ORACLE_PWD  oracle
SCHEMA  scott
TYPE VIEW
PG_NUMERIC_TYPE    0
PG_INTEGER_TYPE    1
DEFAULT_NUMERIC float
SKIP    fkeys pkeys ukeys indexes checks
NLS_LANG    AMERICAN_AMERICA.UTF8
OUTPUT     /root/ora2pg/view.sql
[root@localhost ~]$ ora2pg -c ora2pg_view.conf
WARNING: target PostgreSQL version must be set in PG_VERSION configuration directive. Using default: 11
[========================>] 1/1 views (100.0%) end of output.      
Fixing function calls in output files...
[root@localhost ~]$ cd ora2pg/
[root@localhost ~/ora2pg]$ ls
data.sql  table.sql  view.sql
[root@localhost ~/ora2pg]$ cat view.sql
-- Generated by Ora2Pg, the Oracle database Schema converter, version 21.0
-- Copyright 2000-2020 Gilles DAROLD. All rights reserved.
-- DATASOURCE: dbi:Oracle:host=192.168.168.3;sid=orcl

SET client_encoding TO 'UTF8';

\set ON_ERROR_STOP ON

SET check_function_bodies = false;

CREATE OR REPLACE VIEW view_test (dname, sal) AS SELECT  b.dname,sum(a.sal) sal
 FROM emp a
join dept b on a.deptno=b.deptno
group by b.dname;

[root@localhost ~/ora2pg]$ psql postgres postgres -f view.sql
SET
SET
CREATE VIEW

到pg中查看已经有了这个视图了

image

2.3 迁移存储过程

2.3.1 oracle建立测试存储过程

14:15:29 SYS@orcl> conn scott/tiger;
Connected.
14:15:37 SCOTT@orcl> CREATE OR REPLACE PROCEDURE p_jsq_test as
14:15:39   2  begin
14:15:39   3    insert into emp(empno,ename) values ('1','king');
14:15:39   4    commit;
14:15:39   5  end;
14:15:45   6  /

Procedure created.

Elapsed: 00:00:00.02
14:15:46 SCOTT@orcl> 

2.3.2 迁移过程

[root@localhost ~]$ cat ora2pg_procedure.conf 
ORACLE_HOME /u01/app/oracle/product/11.2.0/dbhome_1
ORACLE_DSN  dbi:Oracle:host=192.168.168.3;sid=orcl
ORACLE_USER sys
ORACLE_PWD  oracle
SCHEMA  scott
TYPE PROCEDURE
PG_NUMERIC_TYPE    0
PG_INTEGER_TYPE    1
DEFAULT_NUMERIC float
SKIP    fkeys pkeys ukeys indexes checks
NLS_LANG    AMERICAN_AMERICA.UTF8
OUTPUT     /root/ora2pg/procedure.sql
[root@localhost ~]$ ora2pg -c ora2pg_procedure.conf 
WARNING: target PostgreSQL version must be set in PG_VERSION configuration directive. Using default: 11
[========================>] 1/1 procedures (100.0%) end of procedures export.
Fixing function calls in output files...
[root@localhost ~]$ cd ora2pg/
[root@localhost ~/ora2pg]$ ls
data.sql  procedure.sql  table.sql  view.sql
[root@localhost ~/ora2pg]$ cat procedure.sql 
-- Generated by Ora2Pg, the Oracle database Schema converter, version 21.0
-- Copyright 2000-2020 Gilles DAROLD. All rights reserved.
-- DATASOURCE: dbi:Oracle:host=192.168.168.3;sid=orcl

SET client_encoding TO 'UTF8';

\set ON_ERROR_STOP ON

SET check_function_bodies = false;



CREATE OR REPLACE PROCEDURE p_jsq_test () AS $body$
BEGIN
  insert into emp(empno,ename) values ('1','king');
  commit;
end;
$body$
LANGUAGE PLPGSQL
SECURITY DEFINER
;
-- REVOKE ALL ON PROCEDURE p_jsq_test () FROM PUBLIC;

[root@localhost ~/ora2pg]$ psql postgres postgres -f procedure.sql 
SET
SET
CREATE PROCEDURE
[root@localhost ~/ora2pg]$ 

image

迁移到pg就变成函数了

其他object迁移方法类似,就不一一体验了

2.4 迁移成本评估

ora2pg将检查所有object来估算迁移成本和难易程度

[root@localhost ~]$ ora2pg -t SHOW_REPORT --estimate_cost -c ora2pg_data.conf 
WARNING: target PostgreSQL version must be set in PG_VERSION configuration directive. Using default: 11
[========================>] 4/4 tables (100.0%) end of scanning.       
[========================>] 8/8 objects types (100.0%) end of objects auditing.               
-------------------------------------------------------------------------------
Ora2Pg v21.0 - Database Migration Report
-------------------------------------------------------------------------------
Version Oracle Database 11g Enterprise Edition Release 11.2.0.4.0
Schema  SCOTT
Size    0.31 MB

-------------------------------------------------------------------------------
Object  Number  Invalid Estimated cost  Comments        Details
-------------------------------------------------------------------------------
DATABASE LINK   0       0       0.00    Database links will be exported as SQL/MED PostgreSQL's Foreign Data Wrapper (FDW) extensions using oracle_fdw.
GLOBAL TEMPORARY TABLE  0       0       0.00    Global temporary table are not supported by PostgreSQL and will not be exported. You will have to rewrite some application code to match the PostgreSQL temporary table behavior.
INDEX   2       0       1.20    2 index(es) are concerned by the export, others are automatically generated and will do so on PostgreSQL. Bitmap will be exported as btree_gin index(es). Domain index are exported as b-tree but commented to be edited to mainly use FTS. Cluster, bitmap join and IOT indexes will not be exported at all. Reverse indexes are not exported too, you may use a trigram-based index (see pg_trgm) or a reverse() function based index and search. Use 'varchar_pattern_ops', 'text_pattern_ops' or 'bpchar_pattern_ops' operators in your indexes to improve search with the LIKE operator respectively into varchar, text or char columns.  2 b-tree index(es). 
JOB     0       0       0.00    Job are not exported. You may set external cron job with them.
PROCEDURE       1       0       4.00    Total size of procedure code: 96 bytes. p_jsq_test: 3. 
SYNONYM 0       0       0.00    SYNONYMs will be exported as views. SYNONYMs do not exists with PostgreSQL but a common workaround is to use views or set the PostgreSQL search_path in your session to access object outside the current schema.
TABLE   4       0       1.00            Total number of rows: 23. Top 10 of tables sorted by number of rows:. emp has 14 rows. salgrade has 5 rows. dept has 4 rows. bonus has 0 rows. Top 10 of largest tables:. 
VIEW    1       0       1.00    Views are fully supported but can use specific functions.
-------------------------------------------------------------------------------
Total   8       0       7.20    7.20 cost migration units means approximatively 1 man-day(s). The migration unit was set to 5 minute(s)

-------------------------------------------------------------------------------
Migration level : A-3
-------------------------------------------------------------------------------

Migration levels:
    A - Migration that might be run automatically
    B - Migration with code rewrite and a human-days cost up to 5 days
    C - Migration with code rewrite and a human-days cost above 5 days
Technical levels:
    1 = trivial: no stored functions and no triggers
    2 = easy: no stored functions but with triggers, no manual rewriting
    3 = simple: stored functions and/or triggers, no manual rewriting
    4 = manual: no stored functions but with triggers or views with code rewriting
    5 = difficult: stored functions and/or triggers with code rewriting
-------------------------------------------------------------------------------

Details of cost assessment per function
Function p_jsq_test total estimated cost: 3
        TEST => 2
        SIZE => 1
-------------------------------------------------------------------------------
[root@localhost ~]$ 

从上述结果看出来scott这个schema迁移到pg属于比较简单,迁移成本低的

posted @ 2020-12-21 20:38  九命猫幺  阅读(4880)  评论(3编辑  收藏  举报