因工作项目上有Oracle到PostgreSQL数据库迁移的需求,如若手动迁移必是一件麻烦的事,因此考虑借助第三方工具,之所以选择使用Ora2Pg,原因有三,一是开源免费(这点非常重要哈),二是功能强大,不仅能完成数据库定义的转换,同时数据迁移也能完成,三是因为类比其他开源数据库迁移工具,使用率更高,这也就意味着出问题的时候可查阅的资料多,不用担心社区环境的问题。接下来,让我们废话少说,一起看看这东西到底怎么用~
首先因为Ora2Pg是Perl语言编写的,所以要使用这个工具,则必须为其搭建Perl运行环境,另外因为本文重点在教学,所以我们一并将数据库的安装配置说明(真是保姆级贴心,哭死)另外,没有加可选的都是必须安装的(为了让你少走弯路,听话哈~)
既然是Oracle迁移至PostgreSQL,那Oracle必须安装哈,首先我们说第一种使用场景,如果你要迁移的数据库在本地,或者想要在本地环境上测试数据库迁移,那就乖乖去Oracle官网下载安装Oracle客户端吧,我这里使用的是Oracle21c的XE版本,也就是Oracle21c的精简版,虽然叫精简版,但足够我开发生产所需了
Oracle 21c下载地址
将下载后的ZIP压缩包解压安装即可,安装过程中涉及到为系统管理用户system设置初始密码的问题,大家不要设置完了之后忘记了!安装好之后Windows + R输入services.msc调出所有服务列表,所有Oracle的服务都正常启动运行就OK了!
再说第二种使用场景,如果你要迁移的数据库在远程,不在本机上,那你大可不必下载完整且庞大的Oracle客户端,只需要下载Oracle官方出品的精简版本,用来连接远程Oracle数据库即可
Oracle instant client下载地址
至于精简客户端怎么使用,网上的教程很多很多,我在这里就不赘述了~
安装好Oracle之后,我们需要修改两个配置文件,listener.ora和tnsnames.ora,将ORACLE_HOME和主机信息修改成我们自己本地的。
假如使用Oracle精简客户端Oracle Instant Client,就将这里的ORACLE_HOME修改为instantclient的目录,主机号同样修改为远程IP
我使用的是PostgreSQL15.1的版本,大家可根据项目要求自行选择哈~
PostgreSQL 15.1下载地址
上面的图片是下载按钮的位置,防止大家找不到哈~ (简直太贴心了~)
PostgreSQL的安装简直是傻瓜式安装,选择好自己的安装目录直接就下一步就好了,这里有一个坑,我第一次安装好PostgreSQL之后,在服务列表后,竟然没有PostgreSQL的服务,回想了一下安装过程,我只修改了安装目录以及locale信息,为了确保万一,我的安装目录已经是全英文的了,所以没有问题,那只能是在选locale信息的时候我没使用默认的,而是手动更改了中文简体,只有这一步有可能出现问题了,好在比起其他的数据库,PostgreSQL的卸载非常简单,只需要使用PostgreSQL自带的卸载,不停的下一步就能完整的卸载了,根本不需要管注册表之类的,卸载完成后重新安装,这次我只修改了安装路径,其他的全都下一步,默认密码我设置了跟超管账户名一样的postgres,安装完成后终于在服务列表中看到了正在运行中的postgreSQL,到此,postgreSQL的安装就结束了!
Windows上的Perl运行环境不止一个,我这里使用的是Ora2Pg官网上推荐的Strawberry Perl
Strawberry Perl下载地址
下载下来之后只需要选择好安装路径一直下一步就好了,安装可谓是非常简单友好了~
GitHub上同样有Ora2Pg的工程,但考虑到大家办公网络环境使用GitHub访问、拉取代码或许存在不便利,我这里更推荐大家在SOURCEFORGE上直接方便快捷的下载~
Ora2Pg下载地址
下载下来的文件是一个后缀名为.tar.bz2的压缩包,大家可以使用7zip解压软件直接解压后得到后缀名为.tar的文件,再使用7zip解压一边.tar就可以得到源码了~
Navicat相信很多人并不陌生,是一个数据库可视化连接工具,我这边使用的是Navicat Premium 15,因为是可选安装项目,下载地址跟注册机大家可以自行找度娘,也可以使用其他的自己趁手的可视化工具,如A5、PL/SQL Developer等。这里使用Navicat的时候我碰到了一个问题,我本想的是Oracle跟PostgreSQL都是用Navicat连接,但是Navicat在连接PostgreSQL15.1的时候出现了问题,报错有一个字段在pg_database表中不存在,无法连接PostgreSQL数据库,我还以是我的Navicat版本低了,于是我查阅了相关资料,发现截止到发文日,Navicat最新的16版本仍旧在连接高版本的PostgreSQL15.1的时候无法连接,于是我就死了心了,使用PostgreSQL自带的PgAmin4来操作PostgreSQL也是一样能达到效果的,对于强迫症来说不能使用一个可视化工具同时连接两个数据库,可真是太难受了。
我在这里将所有版本信息完整的列出来,我只能保证在下面这些版本上运行是没有问题的,其他的大版本有差别的话真的很难说了
接下来终于开始上手实操了,大家认真听讲哈~
因为大家在使用Ora2Pg迁移工具的时候,不确定能达到怎样的预期效果,所以大多是先搭建环境测试一下,所以我们本次教程也从搭建一个全新的数据库开始讲起~
众所周知,在Oracle中没有什么数据库的概念,大家在使用Oracle的时候都是创建一个全新的表空间(类比mysql/PostgreSQL的数据库)来操作,所以我们第一步先来创建一个表空间,提到创建表空间,21c这种比较新的版本比起很早之前的10g等版本还真的是有一些区别,我们在这里不推荐使用Navicat等可视化工具来创建表空间,原因只有一个,Oracle较新的版本里,session不仅仅有CBD一个,还有PDB,可视化工具无法便捷的更换session,如果你的可视化工具能够做到方便的切换session,那就当我说了一堆废话吧,因此,我们这里使用Oracle自带的sql plus来完成表空间的创建、用户的创建、用户的授权等等。
1.以管理员身份登录
2.创建测试用的表空间
create tablespace TESTTEST datafile ‘D:\ProSoft\Oracle21c\oradata\XE\TESTTEST01.dbf’ size 10M autoextend on maxsize 1G;
需要注意的是,为避免其他问题,表空间的名字需要使用大写,另外指定的datafile不要与表空间名字相同(TESTTEST01.dbf)
3.再次创建表空间
大部分人认为到了这一步,该使用下面的语句在新创建的表空间下创建用户了,
create user C##TESTTEST identified by testtest default tablespace TESTTEST;
但是!!!才不是!!!如果直接创建用户必定会抛出下面的异常
ORA-65048: error encountered when processing the current DDL statement inpluggable database ORCLPDB
ORA-00959: tablespace ‘CHENJCH_TBS’ does not exist
根据报错信息我们得知,提示表空间不存在,这里就是一个坑,不说了,说多了都是泪,究其原因便是上面提到的,较新版本的Oracle中会话Session不仅只有默认的CBD,同时新增了PDB,而我们创建用户的时候,Oracle默认是在PDB的session中创建,PDB的session中当然不存在我们创建的表空间了,所以,我们需要先切换Session到PDB,再次在PDB中创建同样的一个表空间
alter session set container=xepdb1;
这里我想当然的以为PDB的session是xepdb,但报错提示不存在,于是我打开Oracle的安装目录查看了一下,发现原来后面还有一个1,于是再次执行成功切换session
切换session后便可以愉快的创建表空间了~
create tablespace TESTTEST datafile ‘D:\ProSoft\Oracle21c\oradata\XE\XEPDB1\TESTTEST01.dbf’ size 10M autoextend on maxsize 1G;
但需要注意的是,表空间的datafile文件路径需要添加上XEPDB1这一层目录
4.创建用户
在创建用户之前,大家需要先将session切换回CBD
alter session set container=CDB$ROOT;
create user C##TESTTEST identified by testtest default tablespace TESTTEST;
需要注意的是,这里创建用户,一定要使用C##或者c##开头,否则无法正确创建,具体原因的话也是版本的问题,想要深究的同学可以自行找度娘哈~ 都能找到答案的,找不到你就留言找我~~
5.授权用户
最后一步给我们新创建的用户C##TESTTEST授权就可以了~
grant connect,resource,dba to C##TESTTEST;
Oracle表空间创建,新建用户,用户授权,全部over~~
6.创建测试用表
最后我们使用Navicat随便创建两张表,用来数据库迁移测试用
上面是我随手创建的两张表,这里就不赘述了。只对一点做补充说明,Navicat在连接Oracle数据库的时候,可能会连接不成功,这里大家需要注意将连接信息正确填写
主机号需要配置为上面提到的两个Oracle配置文件中配置的主机号,我这里配置的都是127.0.0.1本地
关于服务名,因为我们下载的是Oracle 21c XE,所以服务名是XE,如果下载的是完整企业版的,这里应该是orcl才可以
在高级里面,建议修改一下设置位置,不修改的话Navicat会默认给一个在C盘的位置,C盘空间的重要性我就会赘述了,大家根据自己的情况修改吧。
如果还是不能连接Oracle,那么就检查一下下面这个配置
工具》选项》环境》OCI环境
Navicat会有一个默认的oci.dll目录,将其修改为Oracle安装目录中的oci.dll,就不会有问题了~
其他的统统不用管了,直接创建表就行了,注意选择在我们创建的用户下创建表,这样表才会在用户对应的表空间中。
PostgreSQL在我们这次迁移任务中扮演的是最终的接受方,因为Ora2Pg工具可以连接Oracle直接导出SQL文件,也可以同时再连接上PostgreSQL直接将Oracle迁移至PostgreSQL,所以我们也可以暂时不创建PostgreSQL数据库,反正导出SQL文件就已经足够了,日后我们有了SQL文件在哪里都能导入PostgreSQL数据库~
这里我们使用PostgreSQL自带的PgAdmin来简单创建一个数据库吧~
直接在Database上右键>Create>database,就能方便快捷的创建一个用来接受数据的数据库了~
1.cmd定位到解压后的Ora2Pg目录中,执行下面的命令使用Perl解析Ora2Pg
perl Makefile.PL
2.上面的命令执行完成后,会有提示,按照提示执行下面的命令即可
dmake && dmake install
3.紧接着执行下面的命令
gmake && gmake install
4.接下来需要使用Perl的军火库cpan,执行下列命令
cpan
5.获取DBI连接驱动
get dbi
6.安装DBI驱动
install dbi
7.获取DBD::Oracle驱动
get DBD::Oracle
8.安装DBD::Oracle驱动
install DBD::Oracle
到这步为止,驱动模块安装完毕,大家可以在perl的目录下(cpan\build)查看是否已安装完成(安装过程中不报错或者只有警告信息就不会有问题~)
9.确认一下自己的Oracle环境变量是否已正确配置
如果使用的Oracle instantclient,也是需要配置环境变量的
10.修改Ora2Pg的配置文件ora2pg_conf.dist(安装目录下)
# 设置Oracle主目录:Oracle的安装目录
ORACLE_HOME D:\ProSoft\Oracle21c\dbhomeXE
# 设置Oracle数据库连接(数据源、用户、密码)连接远程的,需要配置远程数据库ip和端口
ORACLE_DSN dbi:Oracle:host=127.0.0.1;sid=XE;port=1521
ORACLE_USER C##TESTTEST
ORACLE_PWD testtest
# 需要迁移什么内容,就配置什么内容
TYPE TABLE,VIEW,SEQUENCE,TRIGGER,FUNCTION,PROCEDURE
# 导出SQL目录
OUTPUT F:\ora2pg_output
# 这里配置你自己的Oracle数据库 不配置的情况下默认导出所有表
SCHEMA XXXX
11.最后!终于可以愉快的使用了~
ora2pg -c D:\ProSoft\ora2pg-23.2\ora2pg_conf.dist -d
记得将路径换成自己的配置文件的路径,最后的-d是指输出详细过程log,不加-d也是可以正常执行哦~
总体而言,Ora2Pg的使用还是比较方便的,借助这个强大的工具,能够大幅度提高我们DB迁移工作的效率,并且基本能够满足我们的需求,即便真的有什么问题,我们再手动变更一下就好了,好了,大家如果有什么疑问就给我留言评论吧,我看到了会一一为大家解答,全体起立,下课~