Ora2Pg 迁移Oracle至 PostgreSQL 之实战指南

文章目录

  • [一、Ora2pg 是什么?](#一、Ora2pg 是什么?)
  • [二、Ora2pg 的核心功能](#二、Ora2pg 的核心功能)
    • [2.1. 架构(Schema)转换](#2.1. 架构(Schema)转换)
    • [2.2. 数据迁移](#2.2. 数据迁移)
    • [2.3. PL/SQL 代码转换](#2.3. PL/SQL 代码转换)
    • [2.4. 迁移评估与报告](#2.4. 迁移评估与报告)
    • [2.5. 其他实用功能](#2.5. 其他实用功能)
  • [三、Ora2pg 的工作原理](#三、Ora2pg 的工作原理)
  • 四、安装Ora2pg依赖
    • [4.1.安装Oracle client](#4.1.安装Oracle client)
      • [4.1.1 下载Oracle client相关package](#4.1.1 下载Oracle client相关package)
      • [4.1.2 解压缩、合并package](#4.1.2 解压缩、合并package)
    • [4.2. 安装postgresql](#4.2. 安装postgresql)
    • [4.3. 安装Perl](#4.3. 安装Perl)
      • [4.3.1 下载](#4.3.1 下载)
      • [4.3.2 安装:](#4.3.2 安装:)
      • [4.3.3 验证:](#4.3.3 验证:)
    • [4.4. 确认以及设置环境变量](#4.4. 确认以及设置环境变量)
      • [4.4.1 Oracle 环境变量](#4.4.1 Oracle 环境变量)
      • [4.4.2 Postgresql 环境变量](#4.4.2 Postgresql 环境变量)
      • [4.4.3 strawberry Perl环境变量](#4.4.3 strawberry Perl环境变量)
  • [五. 配置CPAN以及安装CPANM](#五. 配置CPAN以及安装CPANM)
    • [5.1. 配置CPAN](#5.1. 配置CPAN)
    • [5.2. 安裝 cpanm](#5.2. 安裝 cpanm)
  • 六、安装数据库驱动
    • [6.1. 安裝 DBD::Oracle](#6.1. 安裝 DBD::Oracle)
    • [6.2. 安装DBD::PG](#6.2. 安装DBD::PG)
  • [七、 安装Ora2pg](#七、 安装Ora2pg)
  • [八、 安装 Perl DBI 模块(必要依赖)](#八、 安装 Perl DBI 模块(必要依赖))
  • [九、Ora2Pg 实践](#九、Ora2Pg 实践)
    • [9.1. Ora2Pg 迁移项目初始化](#9.1. Ora2Pg 迁移项目初始化)
    • [9.2. 迁移项目目录结构确认](#9.2. 迁移项目目录结构确认)
    • [9.3. 数据库连接与迁移参数配置](#9.3. 数据库连接与迁移参数配置)
    • [9.4. 测试参数配置文件](#9.4. 测试参数配置文件)
    • [9.5. 生成迁移评估报告](#9.5. 生成迁移评估报告)
    • [9.6. 使用生成的powershell脚本汇出/汇入数据](#9.6. 使用生成的powershell脚本汇出/汇入数据)
    • [9.7. 手工汇入单表示例](#9.7. 手工汇入单表示例)
      • [9.7.1. 配置 Ora2Pg 设定档](#9.7.1. 配置 Ora2Pg 设定档)
      • [9.7.2. 导出表结构(DDL)](#9.7.2. 导出表结构(DDL))
      • [9.7.3. 在 PostgreSQL 执行 DDL 导入](#9.7.3. 在 PostgreSQL 执行 DDL 导入)
      • [9.7.4. 导出资料(COPY 格式)](#9.7.4. 导出资料(COPY 格式))
      • 9.7.5.导入数据到postgresql
  • 十、总结

一、Ora2pg 是什么?

Ora2pg 是一款开源的、免费的 Perl 工具,专为将 Oracle 数据库迁移到 PostgreSQL 数据库 而设计,由法国企业 Dalibo 主导开发维护(PostgreSQL 生态重要贡献者)。它的核心作用是自动化完成 Oracle 到 PostgreSQL 的架构转换、数据迁移、存储过程 / 函数 / 触发器等对象的转换,大幅降低跨数据库迁移的手工工作量和出错风险。

简单来说:Ora2pg 是 Oracle 迁移到 PostgreSQL 的 "桥梁工具",支持从简单的表结构 / 数据迁移,到复杂的 PL/SQL 代码、分区表、物化视图等对象的转换,是目前业界最主流的 Oracle → PostgreSQL 迁移工具之一。

二、Ora2pg 的核心功能

Ora2pg 能覆盖迁移的全流程,核心功能可分为以下几类:

2.1. 架构(Schema)转换

自动解析 Oracle 中的数据库对象,并转换为 PostgreSQL 兼容的 DDL 语句,支持的对象包括:

基础对象:表(含字段类型、约束、默认值)、视图、序列、同义词;

约束与索引:主键、外键、唯一约束、普通索引、位图索引(PostgreSQL 无位图索引,会转换为普通索引);

高级对象:分区表(Oracle 分区转换为 PostgreSQL 分区表 / 继承表)、物化视图、用户 / 角色 / 权限。

2.2. 数据迁移

提供多种数据导出 / 导入方式,将 Oracle 中的数据迁移到 PostgreSQL:

  • 直接导出:从 Oracle 读取数据,生成 PostgreSQL 兼容的 COPY 语句(高效批量导入)或 SQL INSERT 语句;
  • 批量处理:支持大表分批次导出,避免内存溢出;
  • 增量迁移:支持基于时间戳、SCN(系统更改号)的增量数据同步。

2.3. PL/SQL 代码转换

这是迁移的核心难点,Ora2pg 能自动将 Oracle 的 PL/SQL 代码转换为 PostgreSQL 的 PL/pgSQL 代码,包括:

  • 存储过程、函数、包(Package);
  • 触发器、事件触发器;
  • 游标、异常处理、内置函数(如 Oracle 的 SYSDATE 转换为 PostgreSQL 的CURRENT_TIMESTAMP)。

2.4. 迁移评估与报告

在正式迁移前,可生成迁移评估报告,统计:

  • 待迁移的对象数量、类型;
  • PL/SQL 代码中不兼容的语法、函数(标注为 "手动修改项");
  • 迁移难度等级,帮助制定迁移计划。

2.5. 其他实用功能

  • 支持 Oracle RAC、CDB/PDB(多租户)环境的迁移;
  • 支持远程连接 Oracle(通过 DBI/DBD::Oracle 驱动)和 PostgreSQL;
  • 可自定义转换规则(通过配置文件调整映射关系)。

三、Ora2pg 的工作原理

Ora2pg 基于 Perl 开发,依赖 Oracle 客户端驱动(如 Instant Client)和 PostgreSQL 客户端工具,工作流程如下:

  • 连接 Oracle:通过 DBI/DBD::Oracle 模块连接 Oracle 数据库,读取元数据(表结构、代码、权限等)和数据;
  • 解析与转换:将 Oracle 的对象定义、PL/SQL 代码解析为抽象语法树,再转换为 PostgreSQL 兼容的语法;
  • 生成文件:输出转换后的 DDL 脚本、数据导入脚本、评估报告等;
  • 导入 PostgreSQL:通过 psql 执行 DDL 脚本创建对象,再通过 COPY 或 INSERT 导入数据。

四、安装Ora2pg依赖

4.1.安装Oracle client

本文将安装Oracle 19 版本作为本文的演示基础,原则上,新的client版本也将兼容较旧的oracle版本,当然也可以选择与将要进行数据转换的目标数据库相对应的client版本

4.1.1 下载Oracle client相关package

首先,我们需要下载三个package:

4.1.2 解压缩、合并package

我们将刚刚下载的3个package解压缩至c:\oracle\product下:

  • 解压缩basic package
bash 复制代码
PS C:\>Expand-Archive -path $env:userprofile\Downloads\instantclient-basic-windows.x64-19.29.0.0.0dbru.zip -DestinationPath C:\oracle\product -force
  • 解压缩sqlplus package
bash 复制代码
PS C:\>Expand-Archive -path $env:userprofile\Downloads\instantclient-sqlplus-windows.x64-19.29.0.0.0dbru.zip -DestinationPath C:\oracle\product -force
  • 解压缩SDK package
bash 复制代码
PS C:\>Expand-Archive -path $env:userprofile\Downloads\instantclient-sqlplus-windows.x64-19.29.0.0.0dbru.zip -DestinationPath C:\oracle\product -force

PS C:\>Expand-Archive -path $env:userprofile\Downloads\instantclient-sdk-windows.x64-19.29.0.0.0dbru.zip -DestinationPath C:\oracle\product -force

4.2. 安装postgresql

由于本文的目的是在windows上安装ora2pg,用于连接位于远端的源端Oracle与目标端postgresql,并将oracle的数据结构以及数据汇入到postgresql,因此只需要安装"Command Line Tools"即可,它将包括:

  • 命令行工具
  • client libraries,包含libpg、ecpg、pg_basebackup、pg_restore、pg_dump、pg-bench等

4.3. 安装Perl

Strawberry Perl是面向 Windows 操作系统的免费、开源 Perl 发行版,由社区维护,旨在为 Windows 用户提供开箱即用的完整 Perl 开发环境------ 无需手动编译源码,无需配置复杂的环境变量,下载安装后即可直接使用 Perl 解释器、核心模块及配套工具。

4.3.1 下载

Strawberry Perl 官方网站下载对应系统(32/64 位)的安装包,选择需要的 Perl 版本。

4.3.2 安装:

双击安装包,按向导完成安装(默认路径如 C:\Strawberry),安装完成后会自动将 Perl 可执行文件路径加入系统环境变量。

4.3.3 验证:

打开命令提示符(CMD)或 PowerShell,执行以下命令

bash 复制代码
perl -v

若输出版本号则表示安装成功:

bash 复制代码
This is perl 5, version 42, subversion 0 (v5.42.0) built for MSWin32-x64-multi-thread

Copyright 1987-2025, Larry Wall

Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl".  If you have access to the
Internet, point your browser at https://www.perl.org/, the Perl Home Page.

4.4. 确认以及设置环境变量

确认是否已经设置好相关的环境变量,如果没有,补齐如下相关的环境变量

4.4.1 Oracle 环境变量

环境变量名称 环境变量值 说明
ORACLE_HOME C:\oracle\product\instantclient_19_29 ORACLE Home目录
PATH C:\oracle\product\instantclient_19_29\bin 假如存在bin目录

4.4.2 Postgresql 环境变量

环境变量名称 环境变量值 说明
PG_HOME C:\Program Files\PostgreSQL\16\ Postgresql Home目录
PATH C:\Program Files\PostgreSQL\16\bin 假如存在bin目录

4.4.3 strawberry Perl环境变量

环境变量名称 环境变量值 说明
PATH C:\Strawberry\c\bin Postgresql Home目录
PATH C:\Strawberry\perl\site\bin 假如存在bin目录
PATH C:\Strawberry\perl\bin 假如存在bin目录

五. 配置CPAN以及安装CPANM

5.1. 配置CPAN

先進入 CPAN shell

請在 cmd(Windows Terminal)輸入:

bash 复制代码
C:\Windows\System32>cpan

这是 Perl 官方的模块管理/配置界面。

你可以在里面:

  • 安装 Perl 模块
  • 设定 CPAN 下载/编译/缓存/镜像等配置
  • 运行 CPAN 命令(o conf 之类)

之后,会看到 CPAN shell 提示:

bash 复制代码
cpan>

这里看到 cpan> 提示符就表示你已经进入了 CPAN shell。

初始化 CPAN 配置

目的在于让 CPAN 在下载模块时支持 HTTPS 协议。

在 CPAN 里输入:

bash 复制代码
o conf init pushy_https

它将开启 HTTPS 支持,确保模块从 HTTPS 源下载,而不是 HTTP。

最后按照提示回答 yes,最后:

这将提交配置,使之生效

bash 复制代码
o conf commit

5.2. 安裝 cpanm

通过 CPAN 安装 cpanminus 工具(简称 cpanm),它是一个更轻量、易用的 Perl 模块安装器。

bash 复制代码
cpan App::cpanminus

使用 cpanm 是为了安装更快、更自动化、更简洁、方便脚本化,当然也可以使用cpan直接下载安装模块( cpan 功能完整但操作较繁琐)

六、安装数据库驱动

6.1. 安裝 DBD::Oracle

为 ora2pg 安装必需的 Perl Oracle 驱动模块,使 Perl 能够连接和操作 Oracle 数据库。

bash 复制代码
cpanm DBD::Oracle

注意,Perl 模块命名用 Parent::Child 形式,Parent 是命名空间,Child 是具体模块,对应目录/文件结构。这里的Parent是DBD(Database Driver的缩写),Child是Oracle,串联起来就是Oracle的DB驱动

輸出:

bash 复制代码
--> Working on DBD::Oracle
Fetching http://www.cpan.org/authors/id/Z/ZA/ZARQUON/DBD-Oracle-1.90.tar.gz ... OK
Configuring DBD-Oracle-1.90 ... OK
Building and testing DBD-Oracle-1.90 ... OK
Successfully installed DBD-Oracle-1.90
1 distribution installed

6.2. 安装DBD::PG

同样,我们的目的是将Oracle的数据汇入到postgresql,所以也需要预先安装PG的database driver:

bash 复制代码
 cpanm  --notest DBD::Pg

输出:

bash 复制代码
--> Working on DBD::Pg
Fetching http://www.cpan.org/authors/id/T/TU/TURNSTEP/DBD-Pg-3.18.0.tar.gz ... OK
Configuring DBD-Pg-3.18.0 ... OK
Building DBD-Pg-3.18.0 ... OK
Successfully installed DBD-Pg-3.18.0 (upgraded from 3.8.0)

七、 安装Ora2pg

7.1. 下载ora2pg

Ora2pg,具体版本参考官网

7.2.解压缩Ora2pg

这里使用powershell指令解压缩刚刚下载的ora2pg包至目标文件夹d:\ora2pg-25.0

bash 复制代码
PS C:\>Expand-Archive -path $env:userprofile\Downloads\ora2pg-25.0.zip -DestinationPath D:\ora2pg-25.0 -force

7.3.安装Ora2pg

  1. 进入解压后的 Ora2Pg 文件夹,运行Makefile.PL:
bash 复制代码
PS D:\ora2pg-25.0\ora2pg-25.0> perl Makefile.PL

输出:

bash 复制代码
Checking if your kit is complete...
Looks good
Generating a gmake-style Makefile
Writing Makefile for Ora2Pg
Writing MYMETA.yml and MYMETA.json

Done...
------------------------------------------------------------------------------
Please read documentation at http://ora2pg.darold.net/ before asking for help
------------------------------------------------------------------------------
Now type: dmake && dmake install

这是 Perl 模块安装的准备步骤。

它会:

  • 检查系统环境和依赖是否完整(输出 "Checking if your kit is complete... Looks good")。
  • 根据模块源码生成 Makefile,这是编译和安装的说明文件。
  • 写入元信息文件 MYMETA.yml 和 MYMETA.json。
  1. 编译并安装 Ora2Pg
    按照提示,继续运行gmake && dmake install指令
bash 复制代码
PS D:\ora2pg-25.0\ora2pg-25.0> gmake;gmake install PREFIX=C:/ora2pg

输出:

bash 复制代码
Checking if your kit is complete...
Looks good
Generating a gmake-style Makefile
Writing Makefile for Ora2Pg
Writing MYMETA.yml and MYMETA.json

Done...
------------------------------------------------------------------------------
Please read documentation at http://ora2pg.darold.net/ before asking for help
------------------------------------------------------------------------------
Now type: dmake && dmake install
PS D:\ora2pg-25.0\ora2pg-25.0> gmake;gmake install PREFIX=C:/ora2pg
cp lib/Ora2Pg/PLSQL.pm blib\lib\Ora2Pg\PLSQL.pm
cp lib/Ora2Pg/MySQL.pm blib\lib\Ora2Pg\MySQL.pm
cp lib/Ora2Pg/Oracle.pm blib\lib\Ora2Pg\Oracle.pm
cp lib/Ora2Pg/GEOM.pm blib\lib\Ora2Pg\GEOM.pm
cp lib/Ora2Pg/MSSQL.pm blib\lib\Ora2Pg\MSSQL.pm
cp lib/Ora2Pg.pm blib\lib\Ora2Pg.pm
"C:\Strawberry\perl\bin\perl.exe" -MExtUtils::Command -e cp -- scripts/ora2pg blib\script\ora2pg
pl2bat.bat blib\script\ora2pg
"C:\Strawberry\perl\bin\perl.exe" -MExtUtils::Command -e cp -- scripts/ora2pg_scanner blib\script\ora2pg_scanner
pl2bat.bat blib\script\ora2pg_scanner
"Installing default configuration file (ora2pg.conf.dist) to C:\ora2pg"
Appending installation info to C:\STRAWB~1\perl\lib/perllocal.pod

这是 Perl 模块安装的执行步骤。

  • gmake 会根据 Makefile 编译构建模块(生成 .pm 文件、可执行脚本等)。
  • gmake install 会把构建好的模块、脚本和配置文件安装到目标目录(这里是 C:/ora2pg)。

7.4. 确认安装

bash 复制代码
PS C:\> where.exe ora2pg

输出:

bash 复制代码
C:\Strawberry\perl\site\bin\ora2pg
C:\Strawberry\perl\site\bin\ora2pg.bat

八、 安装 Perl DBI 模块(必要依赖)

DBI 是 Perl 的数据库接口模块(Database Interface),提供统一的接口来操作各种数据库。

bash 复制代码
PS D:\ora2pg-25.0\ora2pg-25.0> cpanm DBI

输出:

bash 复制代码
--> Working on DBI
Fetching http://www.cpan.org/authors/id/H/HM/HMBRAND/DBI-1.647.tgz ... OK
Configuring DBI-1.647 ... OK
Building and testing DBI-1.647 ... OK
Successfully installed DBI-1.647 (upgraded from 1.645)
1 distribution installed

九、Ora2Pg 实践

9.1. Ora2Pg 迁移项目初始化

使用 Ora2Pg 创建一个新的迁移项目目录模板(migration_project),这个阶段将初始化一个标准迁移工程结构,给你后面真正执行 Oracle → PostgreSQL 迁移做准备。

bash 复制代码
PS C:\> ora2pg --project_base C:\oracle\product\instantclient_19_29 --init_project migration_project

Output:

bash 复制代码
Creating project migration_project.
C:\oracle\product\instantclient_19_29/migration_project/
        schema/
                dblinks/
                directories/
                functions/
                grants/
                mviews/
                packages/
                partitions/
                procedures/
                sequences/
                sequence_values/
                synonyms/
                tables/
                tablespaces/
                triggers/
                types/
                views/
        sources/
                functions/
                mviews/
                packages/
                partitions/
                procedures/
                triggers/
                types/
                views/
        data/
        config/
        reports/

Generating generic configuration file
Creating script export_schema.sh to automate all exports.
Creating Powershell script export_schema.ps1 to automate all exports.
Creating script import_all.sh to automate all imports.

这个阶段还没有导出数据库,只是创建项目框架 + 生成自动化脚本。

9.2. 迁移项目目录结构确认

查看 Ora2Pg 创建的迁移项目 migration_project 目录里有哪些文件和文件夹,确认项目结构是否已生成

bash 复制代码
dir C:\oracle\product\instantclient_19_29\migration_project\

输出:

bash 复制代码
    目錄: C:\oracle\product\instantclient_19_29\migration_project


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----       2025/12/4  上午 10:22                config
d-----       2025/12/4  上午 10:22                data
d-----       2025/12/4  上午 10:22                reports
d-----       2025/12/4  上午 10:22                schema
d-----       2025/12/4  上午 10:22                sources
-a----       2025/12/4  上午 10:22           1976 export_schema.ps1
-a----       2025/12/4  上午 10:22           2269 export_schema.sh
-a----       2025/12/4  上午 10:22          17784 import_all.sh

以上输出的目录与文件作用如下:

项目 作用
config/ 保存迁移配置文件(如 ora2pg.conf)
schema/ 保存 Oracle 数据库对象结构(表、视图、函数等分类目录)
sources/ 保存 Oracle 这些对象的 SQL/PLSQL 源代码
data/ 以后会存导出的数据库数据文件
reports/ 保存迁移分析报告
export_schema.ps1 你在 Windows 上用来自动导出 Oracle 结构的 PowerShell 脚本
export_schema.sh Linux/WSL 里用来自动导出 Oracle 结构的 Shell 脚本
import_all.sh 以后用来把转换后的结构/数据导入 PostgreSQL的脚本

9.3. 数据库连接与迁移参数配置

接下来开始写迁移脚本,档案在项目位置\config\ora2pg.conf,建议源文件复制起来,新增一个新的档案,简易范例如下:

bash 复制代码
ORACLE_HOME               C:\oracle\product\instantclient_19_29\
ORACLE_DSN                dbi:Oracle:host=172.19.85.8;service_name=CPS_QAS;port=1521
ORACLE_USER               cesuser
ORACLE_PWD                SXNVM6TGL
EXPORT_SCHEMA             1
SCHEMA                    CESUSER
TABLE                     CES_ARRIVAL_NOTE
USER_GRANTS               1
TYPE                      TABLE
PG_VERSION                15
PG_DSN                    dbi:Pg:dbname=id_cps;host=172.19.85.11;port=5432
PG_USER                   dbmgr
PG_PWD                    Idcc888*
PG_SCHEMA                 id_cps
RENAME                    CES_ARRIVAL_NOTE:CES_ARRIVAL_NOTE_V2

以上是Ora2Pg 迁移项目的配置参数片段(环境变量/配置字段),用于告诉 Ora2Pg:

从哪台 Oracle 读取哪个用户的哪个 Schema/表,导出结构权限,并迁移到哪台 PostgreSQL 的哪个数据库和 Schema,同时做对象重命名。

9.4. 测试参数配置文件

让 Ora2Pg 读取配置文件连接 Oracle,并显示 Oracle 数据库版本。

bash 复制代码
PS C:\> ora2pg -t SHOW_VERSION -c C:\oracle\product\instantclient_19_29\migration_project\config\ora2pg.conf
HINT: you should activate USER_GRANTS for a connection without DBA privilege. Continuing with USER privilege.
Oracle Database 10g Release 10.2.0.5.0

9.5. 生成迁移评估报告

bash 复制代码
PS C:\oracle\product\instantclient_19_29\migration_project\reports> ora2pg -t SHOW_REPORT -c  C:\oracle\product\instantclient_19_29\migration_project\config\ora2pg.conf --estimate_cost --dump_as_html > migration_report.html

输出:

bash 复制代码
[2025-12-04 16:39:48] [========================>] 181/181 tables (100.0%) end of scanning.
[2025-12-04 16:39:53] [========================>] 10/10 objects types (100.0%) end of objects auditing.

生成的报表内容,包含oracle数据库object数量及迁移难易度

9.6. 使用生成的powershell脚本汇出/汇入数据

使用 PowerShell 执行项目文件夹里 export_schema.ps1,可一次汇出 Data 以外的 Schema 所有内容,汇出的档案会存在Schema文件夹

bash 复制代码
.\export_schema.ps1

注意,如果脚本报错,按照错误提示做相应调整

接下来汇入所有Schema及Data,使用 PowerShell 输入以下指令 才会正常显示互动接口,Data为直接连数据库汇入

bash 复制代码
sh import_all.sh -d <Pg Database> -o <Onwer> -U <User> -h <Pg ip>

9.7. 手工汇入单表示例

本章节演示使用 Ora2Pg 从 Oracle 10g 资料库导出单张表,并导入 PostgreSQL 的完整流程,包括授权读取、DDL 生成、资料 COPY 及 psql 汇入执行。

9.7.1. 配置 Ora2Pg 设定档

调整 ora2pg.conf 配置文件内容如下(本示例仅导出 CESUSER.CES_ARRIVAL_NOTE 单表):

bash 复制代码
ORACLE_HOME               C:\oracle\product\instantclient_19_29\
ORACLE_DSN                dbi:Oracle:host=172.19.85.8;service_name=CPS_QAS;port=1521
ORACLE_USER               cesuser
ORACLE_PWD                SXNVM6TGL
DEBUG                     1
EXPORT_SCHEMA             0
TYPE                      TABLE
SCHEMA                    CESUSER
TABLE                     CES_ARRIVAL_NOTE
ALLOW                     CES_ARRIVAL_NOTE
USER_GRANTS               1
PG_VERSION                15
PG_DSN                    dbi:Pg:dbname=id_cps;host=172.19.85.11;port=5432
PG_USER                   dbmgr
PG_PWD                    Idcc888*
PG_SCHEMA                 id_cps
RENAME                    CES_ARRIVAL_NOTE:CES_ARRIVAL_NOTE_V2

9.7.2. 导出表结构(DDL)

在 PowerShell 中执行以下命令汇出表 DDL:

bash 复制代码
PS C:\oracle\product\instantclient_19_29\migration_project> ora2pg -c .\config\ora2pg.conf -o tables.sql

输出:

bash 复制代码
[2025-12-05 09:52:36] Ora2Pg version: 25.0
[2025-12-05 09:52:36] Export type: TABLE
[2025-12-05 09:52:36] Geometry export type: INTERNAL
[2025-12-05 09:52:36] ORACLE_HOME = C:\oracle\product\instantclient_19_29\
[2025-12-05 09:52:36] NLS_LANG = AMERICAN_AMERICA.AL32UTF8
[2025-12-05 09:52:36] NLS_NCHAR = AL32UTF8
[2025-12-05 09:52:36] Trying to connect to database: dbi:Oracle:host=172.19.85.8;service_name=CPS_QAS;port=1521
[2025-12-05 09:52:36] HINT: you should activate USER_GRANTS for a connection without DBA privilege. Continuing with USER privilege.
[2025-12-05 09:52:36] Isolation level: SET TRANSACTION ISOLATION LEVEL READ COMMITTED
[2025-12-05 09:52:36] Force Oracle to compile schema CESUSER before code extraction
[2025-12-05 09:52:37] Looking forward functions declaration in schema CESUSER.
[2025-12-05 09:52:38] Retrieving table information...
[2025-12-05 09:52:39] Collecting 1 tables in ALL_OBJECTS took:  1 wallclock secs ( 0.00 usr +  0.00 sys =  0.00 CPU)
[2025-12-05 09:52:39] Collecting 1 tables comments in ALL_TAB_COMMENTS took:  0 wallclock secs ( 0.00 usr +  0.00 sys =  0.00 CPU)
[2025-12-05 09:52:40] Collecting 1 tables information in ALL_TABLES took:  1 wallclock secs ( 0.00 usr +  0.00 sys =  0.00 CPU)
[2025-12-05 09:52:40] Retrieving index information...
[2025-12-05 09:52:42] Collecting 26 indexes in ALL_INDEXES took:  2 wallclock secs ( 0.00 usr +  0.00 sys =  0.00 CPU)
[2025-12-05 09:52:42] Retrieving columns information...
[2025-12-05 09:52:42] Collecting column information for table ...
[2025-12-05 09:52:42] DEBUG,
SELECT A.COLUMN_NAME, A.DATA_TYPE, A.DATA_LENGTH, A.NULLABLE, A.DATA_DEFAULT,
    A.DATA_PRECISION, A.DATA_SCALE, A.CHAR_LENGTH, A.TABLE_NAME, A.OWNER
FROM ALL_TAB_COLUMNS A
WHERE A.TABLE_NAME NOT LIKE 'BIN$%' AND A.OWNER='CESUSER'  AND (REGEXP_LIKE(UPPER(A.TABLE_NAME), ?))
ORDER BY A.COLUMN_ID
[2025-12-05 09:52:42] Collecting 60 columns in ALL_INDEXES took:  0 wallclock secs ( 0.00 usr +  0.00 sys =  0.00 CPU)
[2025-12-05 09:52:42] Retrieving comments information...
[2025-12-05 09:52:43] Retrieving foreign keys information...
[2025-12-05 09:52:47] Retrieving unique keys information...
[2025-12-05 09:52:47] Retrieving check constraints information...
[2025-12-05 09:52:48] [1] Scanning table CES_ARRIVAL_NOTE (13443331 rows)...
[2025-12-05 09:52:48] Retrieving table partitioning information...
[2025-12-05 09:52:50] Exporting tables...
[2025-12-05 09:52:50] Dumping table CES_ARRIVAL_NOTE...
[2025-12-05 09:52:50] Fixing function calls in output files...

9.7.3. 在 PostgreSQL 执行 DDL 导入

使用 psql 将生成的 SQL 执行至 PostgreSQL 目标库,完成建表与索引创建:

bash 复制代码
 psql -h 172.19.85.11 -p 5432 -d id_cps -U dbmgr -f .\table.sql

9.7.4. 导出资料(COPY 格式)

在同一配置基础上,执行 COPY 导出,用于产生 PostgreSQL 可直接导入的资料格式:

bash 复制代码
 ora2pg -c .\config\ora2pg.conf --type COPY -o .\data\data.sql

9.7.5.导入数据到postgresql

bash 复制代码
psql -h 172.19.85.11 -p 5432 -d id_cps -U dbmgr -f .\data\data.sql

至此,数据将被汇入到目标postgresql数据库,汇入过程中,如果出错,可根据提示调整

十、总结

以上示例以 最简化的单表迁移步骤 为主,旨在通过清晰可验证的命令与配置,达到 抛砖引玉、快速上手 的目的。

但实际上 Ora2Pg 具备远超本示例的迁移能力,例如:

  • 全库(Whole Database)迁移:可一次性导出整个 Oracle 资料库的表、视图、索引、约束、序列、授权及资料内容
  • 全 Schema 迁移:无需逐表指定,可自动扫描并导出整个 Schema 物件
  • 配置自动从 Oracle 导入 PostgreSQL:支援 --type COPY 或 --type DATA 直接生成
  • PostgreSQL COPY 资料区块,也可结合 psql、\copy 或 pg_bulkload 进行高效资料载入
  • 直接导入模式(Direct Import):结合 pipe 或 \copy FROM PROGRAM 方式,让PostgreSQL 直接从 Oracle 读取并加载资料,省去中间 SQL 档案落地
  • 迁移 PL/SQL 物件:可将 Oracle Function / Procedure / Package 代码自动转换为 PostgreSQL 兼容语法
  • 并行导出(Parallel Export):可提升大资料表导出效能
  • 资料型态与字符集适配:支援智能转换 Oracle → PostgreSQL 兼容型态
  • 全库授权同步:透过 USER_GRANTS=1 读取 Oracle 授权,并生成 PostgreSQL GRANT 语句
    换言之,本章节展示的仅是 Ora2Pg 迁移生态中的 一块基石,真正应用到生产环境时,它能够实现 从结构到资料、从单表到全库、从离线脚本到直接载入、从手工控制到自动化迁移 的完整解决方案。
相关推荐
我是苏苏2 小时前
MSSQL04: SQLserver的用户权限管理
数据库
l1t2 小时前
达梦数据库和Oracle兼容性和性能比较
数据库·sql·oracle·达梦
lkbhua莱克瓦242 小时前
基础-事务
开发语言·数据库·笔记·mysql·事务
weixin_436525072 小时前
NestJS-TypeORM QueryBuilder 常用 SQL 写法
java·数据库·sql
Cosolar2 小时前
MySQL EXPLAIN 执行计划分析:能否查看 JOIN 关联顺序
数据库·后端·mysql
micromicrofat3 小时前
【MongoDB】WSL2访问宿主机的MongoDB
数据库·mongodb
两拆3 小时前
Redhat7.9安装部署Oracle 19C
数据库·oracle
TDengine (老段)3 小时前
TDengine 企业用户建表规模有多大?
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
byzh_rc4 小时前
[算法设计与分析-从入门到入土] 复杂算法
数据库·人工智能·算法·机器学习·支持向量机