使用ORA2PG迁移数据库

 

首先需要安装 Perl 和 PostgreSQL数据库,还需要安装Oracle的客户端。我都是在本机 Windows 系统上测试的,对应的文件名:

ActivePerl-5.26.3.2603-MSWin32-x64-a95bce075.exe
postgresql-10.6-1-windows-x64-binaries.zip

软件装完进入Perl 的bin目录,命令安装Perl 的 Oracle驱动,命令有两个:

C:\Perl64\bin>cpan
Loading internal null logger. Install Log::Log4perl for logging messages

cpan shell -- CPAN exploration and modules installation (v2.18)
Enter 'h' for help.

cpan> get DBD::Oracle
Fetching with LWP:
http://ppm.activestate.com/CPAN/authors/01mailrc.txt.gz
...

cpan> install DBD::Oracle
Running install for module 'DBD::Oracle'
  ZARQUON/DBD-Oracle-1.76.tar.gz
....

完了参考 Windows下Postgresql数据库的下载与配置方法 配置PG数据库。

再就是安装 ora2pg,这个只需要下载解压即可。剩下的就是数据库导出的脚本文件。由于 TYPE 一次只支持一个值,所以如果有多个数据库对象导出,就要写多个这样的脚本文件。比如我导出存储过程的脚本:

ORACLE_HOME F:\app\client\Lenovo\product\12.1.0\client_1
ORACLE_DSN dbi:Oracle:host=192.168.1.222;sid=VINCI;port=1521
ORACLE_USER TEST_CURIE
ORACLE_PWD TEST_CURIE
SCHEMA TEST_CURIE
USER_GRANTS 0
DEBUG 0
ORA_INITIAL_COMMAND
EXPORT_SCHEMA 0
CREATE_SCHEMA 1
COMPILE_SCHEMA 0
TYPE PROCEDURE
PG_VERSION 10.6-1
OUTPUT F:\software\export\output_proc.sql

如果需要导出整个数据库表数据,那么将 TYPE 的值改为 DATA 即可(不可有ALLOW属性)。如果像我遇到的情况一样,就是数据库的记录非常多,那么可以写多个脚本文件,每个文件只导出指定的表记录,则需要把 TYPE 的值改为 INSERT(或 COPY),然后增加一个 ALLOW 属性,它的值可以是若干个表以逗号或者空格隔开的表名。如下面这个只导出一个 DRUG_EXPOSURE 的表记录到 output_data_drug_exposure0.sql 文件。多个这样的脚本可以同时在多个 dos 窗口执行。

ORACLE_HOME F:\app\client\Lenovo\product\12.1.0\client_1
ORACLE_DSN dbi:Oracle:host=192.168.1.222;sid=VINCI;port=1521
ORACLE_USER TEST_CURIE
ORACLE_PWD TEST_CURIE
SCHEMA TEST_CURIE
USER_GRANTS 0
DEBUG 0
ORA_INITIAL_COMMAND
EXPORT_SCHEMA 0
CREATE_SCHEMA 1
COMPILE_SCHEMA 0
TYPE INSERT
ALLOW DRUG_EXPOSURE
PG_VERSION 10.6-1
OUTPUT F:\software\export\output_data_drug_exposure0.sql
# 编码是处理表数据中的中文,不设置则中文可能会显示乱码
CLIENT_ENCODING UTF8
NLS_LANG AMERICAN_AMERICA.AL32UTF8

而导入生成的SQL文件到 PG 数据库,用PGAdmin感觉没有 Navicat 快和方便,可能是我还不熟悉PGAdmin的使用吧。 

  • 碰到的问题:
  1. 数据库的导出脚本所执行的机器需要有 ORACLE_HOME 环境变量,可以本地装一个客户端,然后配置该环境变量
  2. 数据库的对象和数据必须分开导出,所以需要写很多脚本,如果数据库比较大,还需要多写几个数据导出脚本文件,每个导出部分表数据(ALLOW属性可以以逗号或空格分隔多个表名),这样数据文件小一点,导入PG库也快点,排错也容易点
  3. 如果导出数据,脚本文件里的TYPE 不管是INSERT还是 COPY, 生成的sql文件尾部都会有重置所有SEQUENCE的restart值,如果整体导出没什么问题,但是分批导出数据的话,则每个sql文件里都需要删除这些语句,可写程序处理掉(如果文件太大Notepad打不开)
  4. 如果数据里有中文,则强烈建议在脚本里设置编码方式,否则中文大概率上不能正确导出,会有乱码,PG导入时会报错。设置了UTF8编码后就没有问题了
  5. 我这边先是写一个脚本模板,写程序复制多个导出表数据的脚本,每个脚本负责一个表的数据导出,然后对应生成等量的bat文件,再通过程序批量执行bat文件(都是简单的Java流操作)

你可能感兴趣的:(Database)