Oracle迁移PostgreSQL方案

需求:Oracle迁移至Postgresql数据库,结构相对简单,没有view、function、procedure .etc

比较使用工具(开源):
1、pgloader
2、ora2pg
3、Dbeaver



首选方案是pgloader,但失败了,最终选择了ora2pg来迁移
以下是我的实践过程:

pgloader

1、首先安装pgloader

apt-get install pgloader

2、设置配置文件loadtable.load(名字自定义)

LOAD DATABASE
    FROM oracle://username:password@IP:Port/SID
    INTO postgresql://username:password@IP:Port/DB_name

WITH include drop, create tables, create indexes, reset sequences

SET work_mem to '16MB', maintenance_work_mem to '512 MB'


BEFORE LOAD DO
$$ create schema if not exists public; $$

AFTER LOAD DO
$$ analyze; $$;

3、执行pgloader loadtable.load,结果报错:

Migrating from #<SQLITE-CONNECTION sqlite:///home/oracle:/username:password@IP:Port/SID.load
FATAL error: Failed to open sqlite file #P"/home/oracle:/username:password@IP:Port/SID": Could not open sqlite3 database /home/oracle:/username:password@IP:Port/SID

经过查找资料,是要安装oracle client,在https://www.oracle.com/database/technologies/instant-client/downloads.html安装了:
basic
sqlplus
SDK

mkdir -p /home/oracle_instantclient
wget --content-disposition https://download.oracle.com/otn_software/linux/instantclient/instantclient-basic-linuxx64.zip
wget --content-disposition https://download.oracle.com/otn_software/linux/instantclient/instantclient-sqlplus-linuxx64.zip
wget --content-disposition https://download.oracle.com/otn_software/linux/instantclient/instantclient-sdk-linuxx64.zip

解压

mkdir -p /opt/oracle/instantclient
cd /opt/oracle/instantclient
unzip /home/oracle_instantclient/instantclient-basic-linuxx64.zip
unzip /home/oracle_instantclient/instantclient-sqlplus-linuxx64.zip
unzip /home/oracle_instantclient/instantclient-sdk-linuxx64.zip

设置环境变量

vi ~/.bashrc
添加:
export ORACLE_HOME=/opt/oracle/instantclient/instantclient_23_7
export LD_LIBRARY_PATH=$ORACLE_HOME
export PATH=$ORACLE_HOME:$PATH

source ~/.bashrc

4、再次执行,还是报错,但是另一个错误,难道还是配置环境的问题?环境配置真的很烦,不想搞环境了,于是我试一下用docker镜像的方式,结果也是报下面的错误

FATAL Failed to parse "oracle://username:password@IP:Port/SID" as a source URI.

由于时间问题暂不研究,使用ora2pg方式试试

ora2pg

此方式也要配置环境,嫌麻烦,用docker方式来尝试了。
目前迁出表结构、数据是要分开执行的,执行完自动中断


镜像:georgmoser/ora2pg:latest

设置/config/ora2pg.conf配置,及/data/config/output.sql目录(表结构):
-- EXPORT_SCHEMA 为yes,则导出表结构
-- EXPORT_DATA 为yes,则导出数据

# Oracle 数据库连接信息
ORACLE_DSN dbi:Oracle:host=IP;sid=ESYS
ORACLE_USER XXXX
ORACLE_PWD XXXX
# PostgreSQL 数据库连接信息
PG_DSN dbi:Pg:dbname=postgres;host=IP;port=5432
PG_USER postgres
PG_PWD postgres
# 其他配置选项
SCHEMA AMQT
OUTPUT config/output.sql   # 表结构输出文件
DATA_LIMIT 10000
# 启用数据迁移
DATA yes
# 类型转换
DATA_TYPE NUMBER(*,2):NUMERIC
DEFAULT_NUMERIC NUMERIC  # 不设置,Number没有精度则会转成bigint
# 启用表结构导出
EXPORT_SCHEMA no
# 启用数据导出
EXPORT_DATA yes
# 启用多线程数据导出
JOBS 4  # 设置并行线程数,例如 4
# 直接迁移到 PostgreSQL
TYPE COPY

检验数据完整性

1、检查数据行数
2、校验和(Checksum):一种用于验证数据完整性的方法
它通过对数据进行特定的数学运算生成一个固定长度的值(即校验和),然后可以使用这个值来检测数据在传输或存储过程中是否发生了变化。校验和广泛应用于数据传输、文件存储、数据库迁移等场景。
哈希函数(如 MD5、SHA-1、SHA-256)是一种将任意长度的数据映射为固定长度的值的算法.

附录

number 默认转bigint,应转numeric
number转换numeric后,计算出现精度缺失

ora2pg:https://ora2pg.darold.net/documentation.html

posted @   Cody&  阅读(35)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示