• 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
    ",$_,$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属于比较简单,迁移成本低的

  • 相关阅读:
    百度地图Api 根据两个坐标点计算距离
    Android 6.0 Permission权限与安全机制
    CentOS安装nginx
    CentOS安装mysq
    CentOS安装JDK
    -bash: /root/java/jdk/bin/java: cannot execute binary file
    数据库连接池之_DButils
    数据库连接池之_c3p0
    数据库连接池之_Druid简单使用
    后台管理平台编辑表格
  • 原文地址:https://www.cnblogs.com/yongestcat/p/14169793.html
Copyright © 2020-2023  润新知