这篇文章是我在学习使用ora2pg
过程中的学习记录
,以便日后遗忘查阅;
诸君也可跟随我的步伐了解一下ora2pg
,或可移步如下官方文档参考学习:Ora2Pg : Migrates Oracle to PostgreSQL (darold.net)
本文的ora2pg
安装和使用记录是在win10
系统下迁移远程Oracle数据库到远程PostgreSQL数据库的应用环境下进行的,如果你的应用场景不同,可简阅做思路参考!
Ora2Pg
- Oracle to PostgreSQL database schema converter(Oracle到PostgreSQL数据库模式转换器)
Ora2Pg
是一个开源免费的数据库迁移工具,用于将Oracle
数据库迁移到PostgreSQL
兼容的模式。它连接您的Oracle数据库,自动扫描并提取其结构或数据,然后生成可以加载到PostgreSQL数据库中的SQL脚本。Ora2Pg非常易于使用,除了提供连接到Oracle数据库所需的参数外,不需要任何Oracle数据库知识。
TABLE with constraints, VIEW, MVIEW, TABLESPACE, SEQUENCE, INDEXES, TRIGGER, GRANT, FUNCTION, PROCEDURE, PACKAGE, PARTITION, TYPE, INSERT or COPY, FDW, QUERY, KETTLE, SYNONYM
- Export full database schema (tables, views, sequences, indexes), with unique, primary, foreign key and check constraints.
【导出完整的数据库架构(表、视图、序列、索引),具有唯一、主键、外键和检查约束。】
- Export grants/privileges for users and groups.
【导出用户和组的授予/权限。】
- Export range/list partitions and sub partitions.
【导出范围/列表分区和子分区。】
- Export a table selection (by specifying the table names).
【导出选择的表格(通过指定表格名称)。】
- Export Oracle schema to a PostgreSQL 8.4+ schema.
【将Oracle模式导出为PostgreSQL 8.4+模式。】
- Export predefined functions, triggers, procedures, packages and package bodies.
【导出预定义的函数、触发器、过程、包和包体。】
- Export full data or following a WHERE clause.
【导出完整数据或遵循WHERE子句。】
- Full support of Oracle BLOB object as PG BYTEA.
【完全支持Oracle BLOB对象作为PG BYTEA。】
- Export Oracle views as PG tables.
【将Oracle视图导出为PG表。】
- Export Oracle user defined types.
【导出Oracle用户定义的类型。】
- Provide some basic automatic conversion of PLSQL code to PLPGSQL.
【将Oracle表导出为外部数据包装表。】
- Works on any platform.
【适用于任何平台。】
- Export Oracle tables as foreign data wrapper tables.
【将Oracle表导出为外部数据包装表。】
- Export materialized view.
【导出具体化视图。】
- Show a report of an Oracle database content.
【显示Oracle数据库内容的报告。】
- Migration cost assessment of an Oracle database.
【Oracle数据库的迁移成本评估。】
- Migration difficulty level assessment of an Oracle database.
【Oracle数据库的迁移难度级别评估。】
- Migration cost assessment of PL/SQL code from a file.
【从文件迁移PL/SQL代码的成本评估。】
- Migration cost assessment of Oracle SQL queries stored in a file.
【存储在文件中的Oracle SQL查询的迁移成本评估。】
- Generate XML ktr files to be used with Penthalo Data Integrator (Kettle)
【生成要与Penthalo Data Integrator(Kettle)一起使用的XML ktr文件】
- Export Oracle locator and spatial geometries into PostGis.
【将Oracle定位器和空间几何图形导出到PostGis中。】
- Export DBLINK as Oracle FDW.
【将DBLINK导出为Oracle FDW。】
- Export SYNONYMS as views.
【将SYNONYMS导出为视图。】
- Export DIRECTORY as external table or directory for external_file extension.
【将DIRECTORY导出为external_file扩展名的外部表或目录。】
- Dispatch a list of SQL orders over multiple PostgreSQL connections
【通过多个PostgreSQL连接调度SQL订单列表】
- Perform a diff between Oracle and PostgreSQL database for test purpose.
【通过多个PostgreSQL连接调度SQL订单列表】
- MySQL/MariaDB and Microsoft SQL Server migration.
【MySQL/MariaDB和Microsoft SQL Server迁移。】
需要注意的是:Ora2Pg尽最大努力将您的Oracle数据库自动转换为PostgreSQL,但仍有手动工作要做。为函数、procedures、包和触发器生成的Oracle特定PL/SQL代码必须经过审查,以匹配PostgreSQL语法。
首先因为Ora2Pg是Perl语言编写的,所以要使用这个工具,则必须为其搭建Perl运行环境。注意:安装版本要大于等于5.10
Perl下载地址:Strawberry Perl for Windows
下载好如下:
傻瓜式安装即可,没有特殊操作。
必须在系统上安装Oracle Instant Client或完整的Oracle安装程序。
进行数据库迁移工作这些应该都已经安装了,这里不做赘述。
如果确实没有安装,这里推荐几篇相关博文供参考:
注意:这里由于我的数据库服务器都不在本机,这里我使用的是Oracle客户端进行的接下来的操作。
如果你的Oracle数据库在本机,这里也推荐一篇文章以作参考!
[Windows下Ora2Pg(Oracle到PostgreSQL迁移工具)的安装配置及使用教程](https://blog.csdn.net/qq_34272470/article/details/128128287#:~:text=使用Ora2Pg 1 1.cmd定位到解压后的Ora2Pg目录中,执行下面的命令使用Perl解析Ora2Pg perl Makefile.PL 2 2.上面的命令执行完成后,会有提示,按照提示执行下面的命令即可 dmake,get DBD%3A%3AOracle 8 8.安装DBD%3A%3AOracle驱动 install DBD%3A%3AOracle ... 更多项目)
在使用ora2pg时,我们需要配置Oracle客户端(或Oracle)的ORACLE_HOME环境变量,值为客户端安装目录。(这是必须的)
官方文档:You need to have the Oracle client libraries installed and the ORACLE_HOME environment variable must be defined.
Ora2Pg下载地址
下载好如下:
解压到任意目录即可!
Ora2Pg
连接数据库并进行迁移动作,DBI
Perl模块是必须安装的,并且其版本要大于1.614。
Ora2Pg
不仅能够迁移Oracle数据库,还可以迁移MySQL、SQL Server等,只需要安装对应的Perl模块即可。例如:
迁移Oracle - install DBD::Oracle
迁移MySQL - install DBD::MySQL
迁移SQL Server - install DBD::ODBC
有些ora2pg
发行版可能还需要安装Time::HiRes
Perl模块
Ora2Pg
可以导出sql脚本供pg数据库导入执行,也可以直接导入到远程pg数据库。
要导入sql脚本你还需要安装PostgreSQL客户端(psql)
如果你想动态直接导入到PostgreSQL,你至少还需要安装DBD::Pg
和Compress::Zlib
Perl模块
默认情况下,Ora2Pg
生成sql脚本供PostgreSQL客户端导入执行
通过cmd进入到Ora2Pg
安装目录,查看Perl版本(Perl版本要大于5.10
)
将把Ora2Pg.pm
安装到Perl库
perl Makefile.PL
gmake && gmake install
安装DBI
Perl模块
cpan
get DBI
install DBI
安装DBD::Oracle
Perl模块
官方文档:Installing DBD::Oracle require that the three Oracle packages: instant-client, SDK and SQLplus are installed as well as the libaio1 library.
可以看到,安装DBD::Oracle
还需要Oracle SDK和SQLplus,如果你和我一样安装的是精简版Oracle客户端,那么你还需要去官网下载安装Oracle SDK和SQLplus。
下载地址:Instant Client for Microsoft Windows (x64) 64-bit (oracle.com)
直接点击这里下载的是最新版本的精简版客户端、SQL*Plus、SDK
下载好如下三个压缩包:
SQL*Plus、SDK的安装是建立在精简版客户端的基础上的,你需要先安装好精简版客户端。
精简版客户端安装:精简版客户端客户端的安装很简单,解压到任意目录即可!配置ORACLE_HOME环境变量。注意!注意!注意!安装路径上一定不要有空格或中文字符!否则在安装DBD::Oracle
的时候,会报错!
SQL*Plus和SDK安装:直接将压缩包文件解压精简版客户端安装目录即可!
安装好之后,还需要配置LD_LIBRARY_PATH环境变量(注意,精简版客户端不安装SDK是没有sdk\lib的,安装DBD::Oracle
时会加载lib)
官方文档:If you are using Instant Client from ZIP archives, the LD_LIBRARY_PATH and ORACLE_HOME will be the same and must be set to the directory where you have installed the files. For example: /opt/oracle/instantclient_12_2/
做好这一切开始安装DBD::Oracle
cpan
get DBD::Oracle
install DBD::Oracle
安装完成之后再执行一下:install DBD::Oracle
,确定是否安装成功,如下表示安装成功!
ora2pg可以使用命令行的方式进行数据迁移,但是这种方式我暂未实验,了解一些常用命令即可!
ora2pg -c | --conf file : 设置非默认的配置文件,默认配置文件为 /etc/ora2pg/ora2pg.conf。(指定自定义配置文件路径)
ora2pg -d | --debug : 使用调试模式,输出更多详细信息。
# ora2pg --help
Usage: ora2pg [-dhpqv --estimate_cost --dump_as_html] [--option value]
-a | --allow str : 指定允许导出的对象列表,使用逗号分隔。也可以与 SHOW_COLUMN 选项一起使用。
-b | --basedir dir: 设置默认的导出目录,用于存储导出结果。
-c | --conf file : 设置非默认的配置文件,默认配置文件为 /etc/ora2pg/ora2pg.conf。
-d | --debug : 使用调试模式,输出更多详细信息。
-D | --data_type STR : 通过命令行设置数据类型转换。
-e | --exclude str: 指定导出时排除的对象列表,使用逗号分隔。也可以与 SHOW_COLUMN 选项一起使用。
-h | --help : 显示帮助信息。
-g | --grant_object type : 导出指定类型的对象上的授权信息,取值参见 GRANT_OBJECT 配置项。
-i | --input file : 指定要导入的 Oracle PL/SQL 代码文件,导入文件时不需要连接到 Oracle 数据库。
-j | --jobs num : 设置用于发送数据到 PostgreSQL 的并发进程数量。
-J | --copies num : 设置用于从 Oracle 导出数据的并发连接数量。
-l | --log file : 设置日志文件,默认为 stdout。
-L | --limit num : 导出数据时,每次写入磁盘之前在内存中缓冲的记录数量,默认值为 10000。
-m | --mysql : 导出 MySQL 数据库。
-n | --namespace schema : 设置需要导出的 Oracle 模式。
-N | --pg_schema schema : 设置 PostgreSQL 中的搜索路径 search_path。
-o | --out file : 设置导出的 SQL 文件的存储路径。默认值为当前目录下的 output.sql 文件。
-p | --plsql : 启用 PLSQL 代码到 PLPGSQL 代码的转换。
-P | --parallel num: 同时导出多个表,设置并发数量。
-q | --quiet : 不显示进度条。
-s | --source DSN : 设置 Oracle DBI 数据源。
-t | --type export: 设置导出类型。该参数将会覆盖配置文件中的导出类型(TYPE)。
-T | --temp_dir DIR: 为多个同时运行的 ora2pg 脚本指定不同的临时存储目录。
-u | --user name : 设置连接 Oracle 数据库连接的用户名。也可以使用 ORA2PG_USER 环境变量。
-v | --version : 显示 Ora2Pg 版本信息并退出。
-w | --password pwd : 设置连接 Oracle 数据库的用户密码。也可以使用 ORA2PG_PASSWD 环境变量。
--forceowner : 导入数据时,强制 ora2pg 将导入 PostgreSQL 的表和序列的拥有者设置为连接 Oracle 数据库时的用户。如果设置为指定的用户名,所有导入的对象属于该用户。默认情况下,对象的拥有者为连接 Pg 数据库的用户。
--nls_lang code: 设置 Oracle 客户端的 NLS_LANG 编码。
--client_encoding code: 设置 PostgreSQL 客户端编码。
--view_as_table str: 将视图导出为表,多个视图使用逗号分隔。
--estimate_cost : 在 SHOW_REPORT 结果中输出迁移成本评估信息。
--cost_unit_value minutes: 成本评估单位,使用分钟数表示。默认值为 5 分钟,表示一个 PostgreSQL 专家迁移所需的时间。如果是第一次迁移,可以设置为 10 分钟。
--dump_as_html : 生成 HTML 格式的迁移报告,只能与 SHOW_REPORT 选项一起使用。默认的报告是一个简单的文本文件。
--dump_as_csv : 与上个参数相同,但是生成 CSV 格式的报告。
--dump_as_sheet : 生成迁移评估时,为每个数据库生成一行 CSV 记录。
--init_project NAME: 创建一个ora2pg 项目目录结构。项目的顶级目录位于根目录之下。
--project_base DIR : 定义ora2pg 项目的根目录,默认为当前目录。
--print_header : 与 --dump_as_sheet 一起使用,输出 CSV 标题信息。
--human_days_limit num : 设置迁移评估级别从 B 升到 C 所需的人工日数量。默认值为 5 人工日。
--audit_user LIST : 设置查询 DBA_AUDIT_TRAIL 表时需要过滤的用户名,多个用户使用逗号分隔。该参数只能用于 SHOW_REPORT 和 QUERY 导出类型。
--pg_dsn DSN : 设置在线导入时的 PostgreSQL 数据源。
--pg_user name : 设置连接 PostgreSQL 的用户名。
--pg_pwd password : 设置连接 PostgreSQL 的用户密码。
--count_rows : 在 TEST 方式下执行真实的数据行数统计。
--no_header : 在导出文件中不添加 Ora2Pg 头部信息。
--oracle_speed : 用于测试 Oracle 发送数据的速度。不会真的处理或者写入数据。
--ora2pg_speed : 用于测试 Ora2Pg 发送转换后的数据的速度。不会写入任何数据。
ora2pg不仅可以使用命令行的方式进行数据迁移,还可以通过自定义配置文件进行数据迁移配置。
ora2pg安装目录下有一个默认配置文件ora2pg.conf.dist
,你可以通过学习配置项,来修改此配置文件的默认值,来达到你想要的业务需求。
该文件是可自定义进行配置项覆盖的,也就是说你可以在任意位置创建一个自定义配置文件,来增加自己的配置项,而不修改默认配置文件。
例如这样:
注意:配置项和值之间用tab键隔开
#设置Oracle主目录:Oracle的安装目录(如果说是Oracle客户端,就是客户端的路径)
ORACLE_HOME D:\test\instantclient_21_11
#设置Oracle数据库连接(数据源、用户、密码)连接远程的,需要配置远程数据库ip和端口
ORACLE_DSN dbi:Oracle:host=127.0.0.1;sid=orcl;port=1521
#填入Oracle用户名、密码
ORACLE_USER username
ORACLE_PWD pwd***
#配置你想迁移的内容,需要迁移什么内容,就配置什么内容,之间用“,”隔开
TYPE TABLE,VIEW,SEQUENCE,TRIGGER,FUNCTION,PROCEDURE
#导出SQL目标文件名称
OUTPUT user.sql
#导出SQL目标目录
OUTPUT_DIR C:\test
#配置你要导出的Oracle数据库 不配置的情况下默认导出所有数据库所有表
SCHEMA MY_Oracle_SCHEMA
#配置允许留下的表,这里可以使用正则表达式,示例表示迁移表名包含“BI_”的数据库表
ALLOW .*BI_.*
#默认情况下,Oracle模式不会导出到PostgreSQL数据库中,所有对象都是在默认的Pg命名空间下创建的。
#如果还要导出此架构并在此命名空间下创建所有对象,请将export_schema指令设置为1。
#这将使用默认的pg_catalog模式将导出SQL文件顶部的模式搜索路径设置为schema指令中设置的模式名称。
#如果要更改此路径,请使用指令PG_SCHEMA。
EXPORT_SCHEMA 0
#在输出文件开始时启用/禁用CREATE SCHEMA SQL顺序。它在默认情况下是启用的,并关系TABLE导出类型。
CREATE_SCHEMA 1
#限制导出到哪一个架构
PG_SCHEMA MY_PG_SCHEMA
#设置导出目标pg数据库
PG_DSN dbi:Pg:dbname=my_db;host=127.0.0.1;port=5432
#填入pg用户名、密码
PG_USER pg_username
PG_PWD pg_pwd***
更多配置项详细说明,请详见Ora2Pg
官方文档!
Ora2Pg : Migrates Oracle to PostgreSQL (darold.net)
匹配Oracle数据库中所有表名包含"BI_"的数据表迁移到PostgreSQL的test_schema下。(迁移表结构和数据)
编写ora2pg.conf.dist
配置文件:
ORACLE_HOME D:\test\instantclient_21_11
ORACLE_DSN dbi:Oracle:host=127.0.0.1;sid=orcl;port=1521
ORACLE_USER username
ORACLE_PWD pwd***
TYPE TABLE,INSERT
ALLOW .*BI_.*
PG_SCHEMA test_schema
OUTPUT user.sql
OUTPUT_DIR C:\test
执行迁移命令:
ora2pg -c C:\Users\zhao-XH\Desktop\ora2pg.conf.dist -d
导出sql脚本成功
在PostgreSQL客户端分别执行表结构和数据插入sql脚本即可!
迁移过程中要注意,字段的类型映射是否符合要求。官方给出的类型映射关系如下:
oracle类型 | postgresql类型 |
---|---|
date | timestamp |
long | text |
long raw | bytea |
clob | text |
nclob | text |
blob | bytea |
bfile | bytea |
raw | bytea |
rowid | oid |
float | double precision |
dec | decimal |
decimal | decimal |
double precision | double precision |
int | integer |
integer | integer |
real | real |
smallint | smallint |
binary_float | double precision |
binary_double | double precision |
tinestamp | timestamp |
xmltype | xml |
binary_integer | integer |
pls_integer | integer |
timestamp with time zone | timestamp with time zone |
timestamp with local time zone | timestamp with time zone |
如果类型映射不符合我们的要求,例如本次实验,我想要NUMBER(1,0)类型进行精度映射,而ora2pg工具考虑到效率问题,默认关闭NUMBER(p,s) -> numeric(p,s)的映射关系。采用了取整型的方式,这一点很显然不是我想要的。查阅官方文档,我们可以看出,要想开启NUMBER(p,s) -> numeric(p,s)的映射关系,需要将PG_INTEGER_TYPE配置项的值置为0即可!
官方文档:
PG_NUMERIC_TYPE
If set to 1 replace portable numeric type into PostgreSQL internal type. Oracle data type NUMBER(p,s) is approximatively converted to real and float PostgreSQL data type. If you have monetary fields or don't want rounding issues with the extra decimals you should preserve the same numeric(p,s) PostgreSQL data type. Do that only if you need exactness because using numeric(p,s) is slower than using real or double.
PG_INTEGER_TYPE
If set to 1 replace portable numeric type into PostgreSQL internal type. Oracle data type NUMBER(p) or NUMBER are converted to smallint, integer or bigint PostgreSQL data type following the value of the precision. If NUMBER without precision are set to DEFAULT_NUMERIC (see below).
DEFAULT_NUMERIC
NUMBER without precision are converted by default to bigint only if PG_INTEGER_TYPE is true. You can overwrite this value to any PG type, like integer or float.
我们也可以设置配置项来进行手动映射。方法如下:
官方文档:
If you're experiencing any problem in data type schema conversion with this directive you can take full control of the correspondence between Oracle and PostgreSQL types to redefine data type translation used in Ora2pg. The syntax is a comma-separated list of "Oracle datatype:Postgresql datatype". Here are the default list used:
DATA_TYPE VARCHAR2:varchar,NVARCHAR2:varchar,NVARCHAR:varchar,NCHAR:char,DATE:timestamp(0)...
The directive and the list definition must be a single line.
看到上述说明,我们关注以下几点:
示范,例如官方文档默认将DATE:timestamp(0),而我需要DATE:timestamp。同时我需要开启精度映射。
那么上述配置文件更改如下:
ORACLE_HOME D:\test\instantclient_21_11
ORACLE_DSN dbi:Oracle:host=127.0.0.1;sid=orcl;port=1521
ORACLE_USER username
ORACLE_PWD pwd***
TYPE TABLE,INSERT
ALLOW .*BI_.*
PG_SCHEMA test_schema
OUTPUT user.sql
OUTPUT_DIR C:\test
PG_INTEGER_TYPE 0
DATA_TYPE DATE:timestamp