暂无图片
暂无图片
3
暂无图片
暂无图片
暂无图片

openGauss/MogDB数据库之Oracle搬迁

原创 多米爸比 2021-05-09
3064

搬迁方法

Oracle数据表搬迁到MogDB/openGauss数据库比较容易想到的两个工具是oracle_fdw及Ora2Pg。

oracle_fdw

oracle_fdw是嵌入在目标端数据库里的一个扩展插件,允许在目标端数据库里访问其他异构数据库的表,MogDB数据库目前也支持这一插件。

oracle_fdw的使用可以参考我写的这篇文章:<<oracle_fdw和mysql_fdw插件的使用>>

如下所示,目标端建立了到源端数据表的映射,可以在目标端用create table as select方式进行拷贝。

CREATE FOREIGN TABLE public.f_oracle_test (
    id int,
    info character varying
)
SERVER server_ora 
OPTIONS (
    schema 'scott',
    "table" 'AA'
);

Ora2Pg

Ora2Pg是一个开源的迁移转换工具,它可以连接Oracle数据库并进行扫描,自动提取结构或数据,然后生成可加载到PostgreSQL数据库中的SQL脚本。

本文介绍使用Ora2Pg工具先搬迁数据表及数据到PostgreSQL,然后再从PostgreSQL搬迁到MogDB。

Ora2Pg工具的安装可以参考附录一,搬迁前常见的操作命令可以参考附录二。

下面演示具体操作步骤:

1.初始一个搬迁目录

在postgres用户下操作

ora2pg --init_project project20210507  \
--project_base /home/postgres/data

该目录用于分类存放源端不同的对象类型,如table、view、package、function等,以及Oracle端原生的SQL脚本及Ora2Pg转换后的脚本等。

2.定制Ora2Pg配置文件

在postgres用户下操作
vi project20210507/config/ora2pg.conf

NO_HEADER
ORACLE_DSN  dbi:Oracle:host=x.x.x.x;port=1521;sid=xxx
ORACLE_USER xxx
ORACLE_PWD  xxx
PG_VERSION  12
PG_DSN  dbi:Pg:host=127.0.0.1;port=6000;dbname=xxx
PG_USER        xxx
PG_PWD         xxx
SCHEMA         xxx
ALLOW          T_.* UL_.*
EXCLUDE        TMP_.* .*_BACKUP
DATA_TYPE VARCHAR2:character varying
SKIP  fkeys,indexes
COMPILE_SCHEMA  0
DISABLE_COMMENT 1
DROP_FKEY 1

注意参数值大小写问题,上面配置Oracle及PG连接参数值可以为小写,SCHEMA配置Oracle端的模式名称需要配置为大写。ALLOW与EXCLUDE一般只使用一种,不要同时配置。上面ALLOW配置白名单,只搬迁以“T_”开头和“UL_”开头的表,EXCLUDE配置黑名单,不搬迁以“TMP_”开头及以“_BACKUP”结尾的表。

3.使用Ora2Pg导出oracle端指定列表的表结构文件

如果我们要完整搬迁所有的对象,包括table、view、package、function等,可以使用脚本文件export_schema.sh进行导出,并对导出的脚本进行导入测试修正。

多数情况下我们先需要按对象类型逐一手工操作一遍,手工配置处理不兼容性,多次处理完成后最后使用脚本一次性把所有对象导出。

这里演示只导出部分表,我们使用allow参数直接指定,参数值之间使用逗号分割。
在postgres用户下操作

ora2pg --conf config/ora2pg.conf \
--basedir ./schema/tables \
--type TABLE \
--allow "T_TAB1,T_TAB2,UL_TAB1,UL_TAB2..." \
--plsql \
--out table.sql \
--jobs 10 --copies 10 --parallel 10

最后的三个并行参数代表ora2pg并行处理表的任务数,每个任务从Oracle端传输数据的并行数及每个任务ora2pg传输到PostgreSQL的并行数,可根据实际环境进行修改。

4.使用psql工具导入表结构文件到PG

下面是导入到PostgreSQL的操作,在postgres用户下操作

/opt/pg12/bin/psql -Umogdb mogdb -f ./schema/tables/table.sql

上面的操作需要先提前创建用户及数据库,参见如下步骤

/opt/pg12/bin/psql
create user mogdb password 'xxx';
drop database if exists mogdb;
create database mogdb owner mogdb;
\c mogdb postgres
drop schema public;
\c mogdb mogdb
create schema mogdb authorization mogdb;
create schema pkg1 authorization mogdb;
create schema pkg2 authorization mogdb;

上面的模式pkg1和pkg2用于package包的存储。

5.使用gsql工具导入表结构文件到MogDB

导入到MogDB的操作与上面导入到PG类似,MogDB使用gsql工具进行导入。

su - omm
gsql -U mogdb -f ./schema/tables/table.sql

如果有分区表语法需要单独处理下,MogDB与PostgreSQL分区表的语法差异可以参考:MogDB数据库PostgreSQL表分区语法测试

6.使用ora2pg传输oracle表数据到PG

先从oracle端查询下数据条数最大的十个表,在postgres用户下操作

ora2pg --conf config/ora2pg.conf \
--allow "T_TAB1,T_TAB2,UL_TAB1,UL_TAB2..." \
--type SHOW_TABLE

上一步输出结果如下:

[1] TABLE T_TAB1 (owner: XXX, 2869 rows)
[2] TABLE T_TAB2 (owner: XXX, 785412 rows)
[3] TABLE UL_TAB1 (owner: XXX, 4153778 rows)
[4] TABLE UL_TAB2 (owner: XXX, 140 rows)
...
[x] TABLE xx (owner: XXX, 125793 rows)
----------------------------------------------------------
Total number of rows: 1873163888

Top 10 of tables sorted by number of rows:
        [1] TABLE xx has 395364413 rows
        [2] TABLE xx has 379561355 rows
        [3] TABLE xx has 363704131 rows
        [4] TABLE xx has 237709148 rows
        [5] TABLE xx has 105294544 rows
        [6] TABLE xx has 99877964 rows
        [7] TABLE xx has 54815152 rows
        [8] TABLE xx has 49803085 rows
        [9] TABLE xx has 45016399 rows
        [10] TABLE xx has 25595242 rows

我们可以排除上面最大的10个表来提升整体的搬迁效率,大表可以单独配置任务来处理。提前使用–oracle_speed和–ora2pg_speed参数可以用来测试速度而并不实际搬迁数据,以便预估时间。

下面使用COPY方式搬迁数据,并修改了每次内存中缓存的数据条数为10万。

ora2pg --conf config/ora2pg.conf \
--type COPY \
--allow "T_TAB1,T_TAB2,UL_TAB1,UL_TAB2..." \
--limit 100000 \
--jobs 10 --copies 10 --parallel 10

7.使用pg_dumpall导出文本SQL数据文件

在postgres用户下操作

/opt/pg12/bin/pg_dumpall \
--username mogdb \
--data-only \
--exclude-database=template0,template1,postgres \
--file pg_mogdb.sql

8.使用gsql导入数据文件到MogDB

导入前先删除下文件里的set语句,比如row_security等参数,这些参数再MogDB里不兼容。

su - omm
gsql -U mogdb -f pg_mogdb.sql

至此我们批量把oracle中部分表搬迁至MogDB数据,中间借助PostgreSQL数据库转储表数据。

如果要搬迁package包,可以按包名使用ora2pg进行批量转换,在postgres用户下操作。

ora2pg --conf config/ora2pg.conf \
--basedir ./schema/packages \
--type PACKAGE \
--allow "PKG_XX1,PKG_XX2,..." \
--plsql \
--out package.sql

使用ora2pg对oracle端的package包进行转换后,我们进行到转换后的包目录,然后可以直接在MogDB中进行修改调试。

cd schema/packages/pkg_xx1
cd schema/packages/pkg_xx2
...

附录一 Ora2Pg安装

安装Perl

# yum install -y perl perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker

安装DBI

$ wget https://cpan.metacpan.org/authors/id/T/TI/TIMB/DBI-1.643.tar.gz
$ tar -zxvf DBI-1.643.tar.gz
$ cd DBI-1.643
$ perl Makefile.PL
$ make && make install

安装oracle客户端

# yum localinstall oracle-instantclient-basic-10.2.0.5-1.x86_64.rpm
# yum localinstall oracle-instantclient-devel-10.2.0.5-1.x86_64.rpm

安装DBD-Oracle

注意配置oracle客户端动态库,例如:

export LD_LIBRARY_PATH=/usr/lib/oracle/10.2.0.5/client64/lib:/usr/local/lib
$ wget https://cpan.metacpan.org/authors/id/M/MJ/MJEVANS/DBD-Oracle-1.80.tar.gz
$ tar -zxvf DBD-Oracle-1.80.tar.gz
$ cd DBD-Oracle-1.80
$ perl Makefile.PL
$ make && make install

安装DBD-PG

需要先安装并配置好PostgreSQL环境变量,如果本机没有安装PostgreSQL,请参考源码编译安装PostgreSQL 12

确保环境变量配置正确,例如:

export PATH=$PATH:/opt/pgsql/bin
$ wget https://cpan.metacpan.org/authors/id/T/TU/TURNSTEP/DBD-Pg-3.14.2.tar.gz
$ tar -zxvf DBD-Pg-3.14.2.tar.gz 
$ cd DBD-Pg-3.14.2
$ perl Makefile.PL
$ make && make install

安装Ora2Pg

$ wget https://github.com/darold/ora2pg/archive/refs/tags/v21.1.tar.gz
$ tar zxvf v21.1.tar.gz
$ cd ora2pg-21.1
$ perl Makefile.PL
$ make 
# sudo make install

检查版本

$ cd ~
$ ./perl5/bin/ora2pg --version
Ora2Pg v21.1

附录二 Ora2Pg迁移前常见操作

查看源端Oracle服务器版本

ora2pg --conf config/ora2pg.conf \
--type SHOW_VERSION

查看有哪些schema模式(需要dba权限)

ora2pg --conf config/ora2pg.conf \
--type SHOW_SCHEMA 

查看表信息(每个表的owner和行数以及表行top10)

ora2pg --conf config/ora2pg.conf \
--type SHOW_TABLE

结果会输出表的数量及所有表的记录总数以及记录数最多的top10。

查看列映射信息

ora2pg --conf config/ora2pg.conf \
--type SHOW_COLUMN  > check_colum.txt

观察日志是否有错误警告等信息,找出对应的错误进行配置处理,例如Oracle端有关键字命中,可以在ora2pg.conf文件进行转换处理,使用配置参数REPLACE_COLS 。

REPLACE_COLS  SCOTT.T_DEPT(isnull:isnulls)
REPLACE_COLS  SCOTT.T_PERSON(using:usings)

上面SCOTT模式下T_DEPT表的isnull我们映射到PostgreSQL改为isnulls。同理T_PERSON表的using字段我们改为usings。

生成迁移报告(HTML)

ora2pg --conf config/ora2pg.conf \
--estimate_cost --dump_as_html \
--parallel 8 --jobs 2 \
--type SHOW_REPORT > html_report.html

迁移后验证

迁移测试,验证源端与目标端的表数据行数是否一致

ora2pg --conf config/ora2pg.conf \
--parallel 8 --jobs 2 \
--count_rows \
--type TEST > check_tables_count.txt
最后修改时间:2022-10-22 12:55:05
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
1人已赞赏
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论