当前位置: 首页 > 工具软件 > ora2pg > 使用案例 >

迁移数据库 oracle到PG之ora2pg的使用

郑嘉年
2023-12-01

先说在安装过程中遇到的问题:
1.首次想到的是将工具安装到oracle的服务器上面,从而达到数据不出机器,安全的一种思路,但是在安装的过程中遇到了这样或者那样的问题,虽然最后都解决了问题,也成功执行了。但是最终导致了linux的账号和密码无法登录的问题,root权限也无法登录,进而只能重刷服务器镜像环境。 故放弃。
遇到的问题就不记录了。意义不大。最后将ora2pg安装在了界定于oracle和PG的第三台机器上面。
最终实现的效果,通过执行命令,ora2pg会扫描数据库,将数据库的表结构和数据全部导出变成 sql文件,然后在通过pg 客户端,通过psql 命令将sql文件重新再次导入到PG,完成需求。
再次声明:
1. oracle 和PG 有些许数据类型的不一致,在导入导出之前需要根据实际情况进行判断,确定自己需要导出和导入的数据类型。
2. oracle 和PG 的sql 语法有细小区别,可能会导致修改sql
3. 数据库字段的大小写问题,oracle 内部默认字段全部是大写,而PG 默认是小写,这就导致我们自己编写的查库sql多少会有差异。
4. 二者的函数也有稍许不同。同样需要注意。

参考官网: https://ora2pg.darold.net/

ora2pg 工具达成数据库的迁移从大的方面来说需要两步:

  1. 安装ora2pg工具
  2. 使用ora2pg工具进行迁移

ora2pg 的简单安装和使用:

1.安装环境

linux: 8.x
ora2pg: 23.1
DBD-oracle: 1.8.3
oracle-instantclient 19. basic, devel,jdbc,sqlplus: 19.6.0.0.0
postgresql: 12

2. 安装ora2pg

2.1 安装Oracle client

yum install -y oracle-instantclient19.6-jdbc oracle-instantclient19.6-basic oracle-instantclient19.6-devel oracle-instantclient19.6-sqlplus 

2.2 安装perl 依赖,如果有不需要再次安装

yum install -y gcc
yum install perl-devel
yum install -y perl-DBI

2.3 创建需要安装的文件夹目录

起名为ora2pg

2.4 安装DBD::ORACLE

将安装包放入ora2pg目录下

tar xvf DBD-Oracle-1.8.3.tar.gz
cd DBD-Oracle-1.8.3
perl Makefile.PL
make
make install

2.5 安装ora2pg

同样的将安装包放入创建好的ora2pg 目录下

tar xvf ora2pg-23.1.tar.gz
cd ora2pg-23.1.tar
perl Makefile.PL
make&&make install

安装完成进行检查:

ora2pg -v

如果执行此命令发现没有反应,not found command, 那么需要我们手动配置ora2pg 的环境进行。一般情况下,安装会在默认的目录下面
如果需要,请自行查询ora2pg 的默认安装目录,然后通过export 命令,将其环境变量进行配置,然后再次执行check 命令。

2.6 安装PostgreSQL

yum -y install postgresql12

安装完成进行检查:

psql -v

3. 使用ora2pg 工具进行数据导入导出

首先,当我们吧ora2pg 安装好之后,进入到ora2pg的目录后,我们会看到 ora2pg.conf.dist 这个文件,这个为官方的配置参考文件。
一般情况下,我们在导入导出数据的时候,我们会将数据库表结构和数据分开进行导入。
所以这里我们需要两个配置文件。一个针对table,一个针对data

3.1 编写配置文件

3.1.1 数据库表配置文件

配置文件存放的地方也同样放于前面新创建的目录:ora2pg

导出的表名称起名为: ora2pg_table.conf

# oracle 数据库的安装目录
ORACLE_HOME         
# oracle数据库的连接信息
ORACLE_DSN        
# oracle数据库用户名    
ORACLE_USER
#密码配置的明文         
ORACLE_PWD
#oracle 数据库的schema
SCHEMA                     
#配置0不导出schema, 配置1导出schema
EXPORT_SCHEMA     0
# TYPE 为table 表明导出的是数据库表结构,如果为insert, 导出的则是数据, 还有其他的配置,具体查询官方给的配置文档
TYPE    TABLE
#此字段为导入PG时候需要的schema字段,如果上述配置导出的时候导出了oracle的schema,那么这个字段可删除掉不进行配置,如果没有导出Oracle的schema,需要在导入到PG的时候导入新的schema,那么则需要手动提前创建PG的schema,并在此处进行配置
PG_SCHEMA   
# 此处配置的oracle导入到PG 的数据类型的转换。针对不同的数据类型,自行根据需要进行配置,多个之间逗号隔开
DATA_TYPE   DATA:data
#导出的字符格式,一般不需要懂
NLS_LANG     AMERICAN_AMERICA.UTF8   
#配置导出时的log输出路径,如果导出成功,log文件里面没有内容,如果导出失败,log里面一般会有原因
LOGFILE      /tmp/table.log
# 配置导出的表结构sql文件,可以和log放一块
OUTPUT     /tmp/table.sql

3.1.2 数据库数据配置文件

导出的数据配置文件起名为: ora2pg_data.conf

# oracle 数据库的安装目录
ORACLE_HOME         
# oracle数据库的连接信息
ORACLE_DSN        
# oracle数据库用户名    
ORACLE_USER
#密码配置的明文         
ORACLE_PWD
#oracle 数据库的schema
SCHEMA                     
#配置0不导出schema, 配置1导出schema
EXPORT_SCHEMA     0
# TYPE 为table 表明导出的是数据库表结构,如果为insert, 导出的则是数据, 还有其他的配置,具体查询官方给的配置文档
TYPE    INSERT
#此字段为导入PG时候需要的schema字段,如果上述配置导出的时候导出了oracle的schema,那么这个字段可删除掉不进行配置,如果没有导出Oracle的schema,需要在导入到PG的时候导入新的schema,那么则需要手动提前创建PG的schema,并在此处进行配置
PG_SCHEMA   
# 此处配置的oracle导入到PG 的数据类型的转换。针对不同的数据类型,自行根据需要进行配置,多个之间逗号隔开
DATA_TYPE   DATA:data
#导出的字符格式,一般不需要懂
NLS_LANG     AMERICAN_AMERICA.UTF8   
#配置导出时的log输出路径,如果导出成功,log文件里面没有内容,如果导出失败,log里面一般会有原因
LOGFILE      /tmp/data.log
# 配置导出的表结构sql文件,可以和log放一块
OUTPUT     /tmp/data.sql

3.2 执行ora2pg命令,导出表结构和表

3.2.1 导出表结构

#此命令执行的时候会进行当前schema 下的全表扫描并导出所有的表结构
ora2pg -c ora2pg_table.conf  
#此命令执行的时候会进行当前schema下的指定的表名进行扫描,并导出表结构
ora2pg -c ora2pg_table.conf -a 'TABLE[表名,表名,表名]'

3.2.2 导出数据

#此命令执行的时候会进行当前schema 下的全表扫描并导出所有的表数据
ora2pg -c ora2pg_data.conf  
#此命令执行的时候会进行当前schema下的指定的表名进行扫描,并导出表数据
ora2pg -c ora2pg_data.conf -a 'TABLE[表名,表名,表名]'

3.2.3 至此,数据导出成功,然后去到自己配置文件配置的目录就可以去查看文件了,查看表结构是不是自己想要的数据结构,索引什么的都带上了没有。 此处有一个问题,因为导出的数据全部都在同一个文件,如果数据量是海量的时候,可能会导致文件会异常的大,因为在实操的过程中,我们的数据量都很小,并且都是分应用,分批进行导出,所以文件大小的问题基本没有考虑过。但是我认为:我们也可以使用分批的形式进行导入导出。反正也就是多准备几个命令的事情。

3.3 导入数据到PG

同样的,这块因为安装了PG,我们也是直接执行psql 命令直接进行导入就行。

3.3.1 导入表结构

# -h pg 的host, -p 端口, -U 用户名,  -d database,  -f  前面导出的数据文件路径和名称
psql -h  xxx -p xxx -U xxx  -d xxx -f /tmp/table.sql 

3.3.2 导入 数据

# -h pg 的host, -p 端口, -U 用户名,  -d database,  -f  前面导出的数据文件路径和名称
psql -h  xxx -p xxx -U xxx  -d xxx -f /tmp/data.sql 
 类似资料: