
前言
作为一个数据库迁移工具,我的任务是把来自Oracle的数据迁移到PostgreSQL中去。我一直兢兢业业地工作,协助dba一号大哥完成迁移任务。
今天dba一号大哥请假了,安排了dba三号小哥要把我部署在一套新的环境中。
安装需求
"你打算把我安装在那里?"我问dba三号小哥。
dba三号小哥思考了片刻说:"这次我要把你安装在PostgreSQL数据库所在的机器上。你能告诉我需要做那些步骤吗?"
好的,根据我的使用手册,你需要安装以下组件:
需要安装Oracle Client。 操作系统需要安装Perl 环境(perl 5.10及更高版本)。然后安装 Perl::DBI
模块。(DBI Perl模块> 1.614)。如果需要gzip压缩功能,需要额外的安装Compress::Zlib
模块。在一些发行版上,还需要安装Time::HiRes
模块。需要安装 DBD::Oracle
模块连接Oracle数据库。上述安装完成之后就是可以编译安装我(ora2pg)了。 如果你需要通过我导入到PostgreSQL,还需要安装 DBD::Pg
模块连接PostgreSQL数据库。如果你只是落地导出转换脚本,则不需要安装。
DBA3号小哥开玩笑地说:"你这个安装过程让人槽点满满啊。"
安装ora2pg
1.安装oracle 19c 客户端
DBA3号小哥现在开始安装了,我需要耐心地在旁边指导,我不想让自己成为一个残疾人。
"安装oracle Client需要到官网上下载安装包,下载地址是:https://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.html
"
[root@centos8 ~]# wget -c https://download.oracle.com/otn_software/linux/instantclient/191000/oracle-instantclient19.10-jdbc-19.10.0.0.0-1.x86_64.rpm
[root@centos8 ~]# wget -c https://download.oracle.com/otn_software/linux/instantclient/191000/oracle-instantclient19.10-sqlplus-19.10.0.0.0-1.x86_64.rpm
[root@centos8 ~]# wget -c https://download.oracle.com/otn_software/linux/instantclient/191000/oracle-instantclient19.10-devel-19.10.0.0.0-1.x86_64.rpm
[root@centos8 ~]# wget -c https://download.oracle.com/otn_software/linux/instantclient/191000/oracle-instantclient19.10-basic-19.10.0.0.0-1.x86_64.rpm
[root@centos8 ~]# rpm -ivh oracle-instantclient19.10-basic-19.10.0.0.0-1.x86_64.rpm
[root@centos8 ~]# rpm -ivh oracle-instantclient19.10-devel-19.10.0.0.0-1.x86_64.rpm
[root@centos8 ~]# rpm -ivh oracle-instantclient19.10-jdbc-19.10.0.0.0-1.x86_64.rpm
[root@centos8 ~]# rpm -ivh oracle-instantclient19.10-sqlplus-19.10.0.0.0-1.x86_64.rpm
"小哥,你的第一步完成了,但是你还需要把环境变量设上。"我耐心的指导着。
export ORACLE_HOME=/usr/lib/oracle/19.10/client64
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH
export PATH=$ORACLE_HOME/bin:$PATH
cd ~
source .bash_profile
DBA3号小哥点了点头说:"我都弄完了,现在我们来测试一下能不能连Oracle数据库。"
[root@centos8 ~]# sqlplus hr/Sqlite123@//192.168.56.130:1521/orclpdb1
2.安装Perl 环境
"小哥,你这系统自带了perl环境,是5.26版本,满足大于5.10的要求。"
[root@centos8 ~]# perl -v
This is perl 5, version 26, subversion 3 (v5.26.3) built for x86_64-linux-thread-multi
(with 51 registered patches, see perl -V for more detail)
"嗯,那我们接下来就安装perl的相关模块吧"。DBA3号小哥说道。
"嗯,小哥,你直接用yum源安装简单一些,这里面除了DBD::Oracle模块比较麻烦,它是需要单独下载编译安装的。其他的全部使用yum"
DBA3号小哥点了点头说:"ok,现在开始用yum安装。"
[root@centos8 ~]# yum install perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker perl-Time-HiRes perl-devel perl-DBI perl-Compress-Zlib perl-open
3.安装DBD :: Oracle
"小哥,继续加油,现在我们要去下载DBD :: Oracle模块进行安装,这个模块是Oracle的驱动程序,让perl能够连接Oracle数据库,我们从网站https://metacpan.org/pod/DBD::Oracle
进行下载。"
[root@centos8 ~]# wget -c https://cpan.metacpan.org/authors/id/M/MJ/MJEVANS/DBD-Oracle-1.80.tar.gz
[root@centos8 ~]# tar -xvzf DBD-Oracle-1.80.tar.gz
[root@centos8 ~]# cd DBD-Oracle-1.80/
[root@centos8 DBD-Oracle-1.80]# perl Makefile.PL
[root@centos8 ~]# make && make install
DBA3号小哥下载了DBD-Oracle-1.8版本,编译安装好了DBD :: Oracle模块。
4.安装ora2pg软件
"小哥,现在要去下载我(ora2pg)并编译安装了,我是开源软件,从https://github.com/darold/ora2pg/releases
上下载就行。"
DBA3号小哥有点不耐烦的说道:"你的安装可真是麻烦,需要下载这么多东西,你的作者能不能把你改造一下,简化一下安装步骤啊"。
[root@centos8 ~]# wget -c https://codeload.github.com/darold/ora2pg/tar.gz/v21.0
[root@centos8 ~]# ls -lrt v21.0
-rw-r--r--. 1 root root 457716 Mar 9 07:57 v21.0
[root@centos8 ~]# tar -xvf v21.0
[root@centos8 ~]# cd ora2pg-21.0/
[root@centos8 ora2pg-21.0]# perl Makefile.PL
[root@centos8 ora2pg-21.0]# make && make install
"保持耐心,到这一步就差不多了,我们的安装还是很顺利的,没有耽搁一点功夫!"
DBA3号小哥喃喃自语道:"就是觉得你们安装很麻烦啊。好了,下一步是做什么?"
5.配置和使用ora2pg
"下一步是配置和测试,现在我们需要自己编写一个配置文件,然后使用配置文件连接Oracle数据库进行测试,正常情况下是能够连通的,如果有异常情况,则证明前面我们的安装有一些错误。"
DBA3号小哥一听来了兴趣,"终于到这一步了,配置文件怎么配?"
"你上网站http://ora2pg.darold.net/documentation.html
可以查看官方的配置文档,我的配置有点多,因为我需要应对各种不同的情况。不过,你现在可以从创建一个通用工程先开始"
DBA3号小哥说道:"好的,那我先来创建一个通用工程。"
[root@centos8 ora2pg]# ora2pg --project_base /root/ora2pg --init_project hr_migrate
Creating project hr_migrate.
/root/ora2pg/hr_migrate/
schema/
dblinks/
directories/
functions/
grants/
mviews/
packages/
partitions/
procedures/
sequences/
synonyms/
tables/
tablespaces/
triggers/
types/
views/
sources/
functions/
mviews/
packages/
partitions/
procedures/
triggers/
types/
views/
data/
config/
reports/
"现在你可以看到,咱们创建了一个迁移工程,自动生成默认的模板,config文件夹下包含配置文件,还有一个叫export_schema.sh
的shell脚本。你现在可以编辑config下的配置文件,配置好oracle相关的连接字符串、用户名、密码以及要导出的schema,然后执行export_schema.sh
脚本就会帮你把Oracle的DDL导出来,然后你在使用脚本输出的命令导出数据。你先试一下"。
DBA3号小哥又继续问道:"那具体的config下配置哪些内容?"
"我们现在测试,就先简单的配置一下。你配置下面这些选项,然后执行export_schema.sh
脚本。"
[root@centos8 hr_migrate]# vi config/ora2pg.conf
# Set the Oracle home directory
ORACLE_HOME /usr/lib/oracle/19.10/client64
# Set Oracle database connection (datasource, user, password)
ORACLE_DSN dbi:Oracle:host=192.168.56.130;port=1521;service_name=orclpdb1
ORACLE_USER hr
ORACLE_PWD Sqlite123
SCHEMA HR
DBA3号小哥摇摇头叹了口气说道:"还有好多配置选项,不知道干嘛用的,让人云里雾里。"
"你现在先把测试玩转起来,后面真正迁移你就会用到这些选项,那个时候在深入学习不迟。"
"好的,那我先把这搭起来。"DBA3号小哥信心满满的说道。
接下来DBA3号小哥运行了export_schema.sh
脚本。

所有的ddl语句都导出到了schema下的子目录里面。最后还输出了一条指令。
To extract data use the following command:
ora2pg -t COPY -o data.sql -b ./data -c ./config/ora2pg.conf
"小哥,你注意执行完脚本有个命令需要你再手动执行一下,刚刚导出的是ddl脚本,现在最后这个手动的命令是导出数据的。"

"ok,我已经把数据导出来了。"DBA3号小哥按我的要求做完说道。
"嗯,有了结构和数据之后,你再配置好config里面的PostgreSQL连接字符串,执行import_all.sh就能完整的把刚刚的这些脚本导入了。不过在这之前你需要安装DBD :: Pg模块。"
DBA3号小哥又开始不耐烦的说道:"又要安装这些真是很烦躁啊"
"小哥,这里需要你注意的是还需要设置PostgreSQL的环境变量哦!"
[root@centos8 ~]# wget -c https://cpan.metacpan.org/authors/id/T/TU/TURNSTEP/DBD-Pg-3.14.2.tar.gz
[root@centos8 ~]# gunzip DBD-Pg-3.14.2.tar.gz
[root@centos8 ~]# tar -xvf DBD-Pg-3.14.2.tar
[root@centos8 ~]# cd DBD-Pg-3.14.2/
vi bash_parfile
export ORACLE_HOME=/usr/lib/oracle/19.10/client64
export PGHOME=/data/postgresql/pgsql
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$PGHOME/lib:$LD_LIBRARY_PATH
export PATH=$ORACLE_HOME/bin:$PGHOME/bin:$PATH
source .bash_profile
[root@centos8 DBD-Pg-3.14.2]# perl Makefile.PL
[root@centos8 DBD-Pg-3.14.2]# make && make install
DBA3号小哥利索的配置好环境变量,装完DBD :: Pg模块,然后说道:"现在肯定是又要修改配置文件那些连PostgreSQL的字符串吧。"
"是啊,小哥你现在是越来越知道我们的套路了。配置完成后你就可以执行导入脚本了,记得要使用-I选项,这个选项可以排除索引、约束、触发器,等完全导入数据之后在使用-i进行索引、约束、触发器的创建。"
PG_DSN dbi:Pg:dbname=postgres;host=192.168.56.119;port=5432
PG_USER postgres
PG_PWD Sqlite1、23

DBA3号小哥开心的说道:"我已经执行成功了。我现在去看一下数据是否已经导入了"。

"已经全部导进去了,大功告成!"。DBA3号小哥笑呵呵的说。
"不,你还要在运行-i执行导入索引、约束、触发器"。

DBA3号小哥再次执行了脚本,使用了-i选项。"ok,全部完成了,全部测试正常。可以下班了!"
"小哥,厉害了"。
DBA3号小哥收拾好电脑,得意的说道:"今天先到这里,后续你还要教我的一些使用技巧。"
"没问题。"


励志成为PostgreSQL大神
长按关注吧




