从Oracle迁移到openGauss实战分享

介绍

ora2og 是一个将 Oracle 数据库迁移至 openGauss 的工具,主要编程语言为 perl,通过 perl DBI 模块连接 Oracle 数据库,自动扫描并提取其中的对象结构及数据,产生 SQL 脚本,通过手动或自动的方式应用到 openGauss。此外,工具还提供丰富配置项,用户可以自定义迁移行为。ora2og 初始代码源自 ora2pg,一个将 Oracle 迁移至 PostgreSQL 的开源工具。版本为 release v21.1:GitHub - darold/ora2pg at v21.1。

优秀特性

支持导出数据库绝大多数对象类型,包括表、视图、序列、索引、外键、约束、函数、存储过程等。
提供 PL/SQL 到 PL/PGSQL 语法的自动转换,一定程度避免了人工修正。
可生成迁移报告,包括迁移难度评估、人天估算。
可选对导出数据进行压缩,节约磁盘开销。
配置选项丰富,可自定义迁移行为。

执行迁移

环境

本篇使用环境:
Oracle : 华为云服务器 2 核 4G + CentoOS 7.6 +Oracle 11.2
openGauss:华为云服务器 2 核 4G + CentoOS 7.6 +openGauss 3.1.0 极简版
两台节点网络互通
迁移前准备
Ora2og 工具既可以安装在 Oracle 服务器上,也可以安装在 openGauss 服务器上。本篇中将工具部署在 Oracle 服务器上。
注意,如果安装在 openGauss 上时,需要在服务器上安装 Oracle 客户端。下载路径:
Instant Client for Linux x86-64 (64-bit)

软件安装

Ora2Pg 语言为 perl,故需安装所需 perl 模块。

root 用户下操作

yum install -y perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker
yum install perl-CPAN

安装 DBI、JSON、DBD:Pg、DBD:Oracle,Ora2Pg 依赖这些软件去连接数据库。

perl -MCPAN -e 'install DBI'
perl -MCPAN -e 'install JSON'
perl -MCPAN -e 'install DBD::Pg'export ORACLE_HOME=/u01/app/oracle/product/11.2.0/
export LD_LIBRARY_PATH=/u01/app/oracle/product/11.2.0/lib使用 perl -MCPAN -e 'install DBD::Oracle' 安装报错了,换了另一种自己编译的方式。[root@oraclehost ora2pg-master]# perl -MCPAN -e shell
......
cpan[1]> get DBD::Oracle
........
Checksum for /root/.cpan/sources/authors/id/Z/ZA/ZARQUON/DBD-Oracle-1.83.tar.gz ok
......
cpan[2]> quit[root@oraclehost ora2pg-master]# cd /root/.cpan/sources/authors/id/Z/ZA/ZARQUON/
[root@oraclehost ZARQUON]# tar -zxvf DBD-Oracle-1.83.tar.gz
[root@oraclehost ZARQUON]# cd DBD-Oracle-1.83
[root@oraclehost DBD-Oracle-1.83]# perl Makefile.PL
[root@oraclehost DBD-Oracle-1.83]# make && make install

ora2og 工具安装

安装 Ora2Pg <you_install_dir>为目标安装路径,<source_code_dir>为下载的代码路径。 如果服务器上没有 git 的话,可以从网站把源码包下载再解压。

mkdir -p /opt/software/ora2pg
git clone https://toscode.gitee.com/opengauss/openGauss-tools-ora2og.git

进到代码目录下

perl Makefile.PL PREFIX=<your_install_dir>
make && make install

设置环境变量,查看是否安装成功

export PERL5LIB=<source_code_dir>/lib
export PATH=$PATH:<your_install_dir>/usr/local/bin

需要确保 bin 路径下有 ora2pg 这个文件,否则命令找不到。
执行ora2pg --help 查看命令是否正常
会返回一堆帮助信息

创建迁移项目

ora2pg --init_project oramig
创建迁移项目后会在当前目录下生成 oramig 目录模板,如下所示。其中主要包含两个脚本 export_schema.sh 和 import_all.sh,后续导出和导入即使用这两个脚本。schema 和 sources 目录存放各对象的 DDL 语句,区别在于 schema 存放 PL/SQL 语法转化为 PL/PGSQL 后的语句, sources 目录存放转化前 PL/SQL 的语句,data 目录存放表数据文件,config 目录包含配置文件 ora2pg.conf,reports 目录存放迁移报告。

Oracle 建个表,用来做测试数据

create table customerchat.test(name char(10));
insert into customerchat.test values('opengauss');
create table customerchat.xxx(name char(20));
insert into customerchat.xxx values('yy');

openGauss 侧新建数据库 mydb 和用户 tuser ,迁移时会用到。

mydb=#create database mydb;
mydb=# CREATE USER tuser WITH PASSWORD '自己定义';
mydb=# GRANT ALL PRIVILEGES TO tuser;
mydb=# alter database mydb owner to tuser;

配置 ora2pg.conf,

注意路径,后面执行 sh 的时候会找 config/ora2pg.conf。

cp <your_install_dir>/etc/ora2pg/ora2pg.conf.dist <source_code_dir>/config/ora2pg.conf

ORACLE 相关参数:

ORACLE_HOME /u01/app/oracle/product/11.2.0/
ORACLE_DSN dbi:Oracle:host=oracleIP;sid=orcl;port=1521
ORACLE_USER customerchat // 这里用的 oracle 普通用户和密码
ORACLE_PWD XXXXX
SCHEMA customerchat //一般和用户名一样
openGauss 相关参数:
PG_DSN dbi:Pg:dbname=mydb;host=localhost;port=5432
PG_USER tuser
PG_PWD 自己定义的密码

工具自身参数:
DATA_LIMIT 默认是 10000,如果 oracle 服务器内存较小,比如 4G 以下,可以修改为 2500 或 5000,否则可能会报内存不足。
更多更详细的配置项说明,可查看官网:
Ora2Pg : Migrates Oracle to PostgreSQL

测试一下配置:
执行ora2pg -t SHOW_VERSION -c config/ora2pg.conf会返回连接的 Oracle 版本号。

测试迁移

修改迁移工具 oramig 目录下 export_schema.sh 中导出类型 EXPORT_TYPE 和 SOURCE_TYPE,本次迁移导出 TABLE。

在 oramig 目录下执行
sh export_schema.sh

执行完成后 在 schema/tables 生成 table.sql ,里面是建表脚本。

reports/目录下生成的 report 报告

还是在 oramig 目录下执行导入
为了使用 openGauss 命令行工具 gsql,需要将数据库的 bin 和 lib 加在操作系统的环境变量 PATH 和 LD_LIBRARY_PATH 中。可以直接 root 用户执行 gsql 测试下。 3. 将 import_all.sh 里的 psql 修改为 gsql。

执行导入脚本,表示使用用户 tuser 登录 openGauss 中 mydb 的数据库,ip 和端口,-f 选项表示跳过用户和数据库是否需要创建的检查。

sh import_all.sh -d mydb -o tuser -h openGaussIP -p 5432 -f

执行成功。

可以看到表和数据都已经迁移过来。

Ora2Pg 不足

Ora2Pg 对 PL/SQL 和 PL/PGSQL 的语法转换处理采用正则表达式和文本替换的方式,先天设计不足,很难覆盖所有的语法,目前仅支持部分转换。因此,Ora2Pg 可以满足 SQL 简单的应用迁移,对于复杂的语法,并不能完全保证转换的正确性,需要对生成的 SQL 语句进行核对,必要时需要人工修正。

FAQ

1.报错:

Path to pg_config? /opt/software/openGauss/bin/pg_config
/opt/software/openGauss/bin/pg_config: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory

环境自带的是 1.0.2,得升级 libssl.so。

[root@oraclehost ~]# openssl version -a
OpenSSL 1.0.2k-fips 26 Jan 2017
yum remove openssl

获取新的版本并安装

wget https://www.openssl.org/source/openssl-1.1.1c.tar.gz
tar -zxvf openssl-1.1.1c.tar.gz
cd openssl-1.1.1c
./config --prefix=/usr/local/openssl #如果此步骤报错,需要安装 perl 以及 gcc 包
make && make installln -s /usr/local/openssl/lib/libssl.so.1.1 /usr/lib64/libssl.so.1.1
ln -s /usr/local/openssl/lib/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1
ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl
ln -s /usr/local/openssl/include/openssl /usr/include/openssl
echo "/usr/local/openssl/lib" >> /etc/ld.so.conf
ldconfig -vsudo yum install postgresql-devel再重新执行 perl -MCPAN -e 'install DBD::Pg'

2、perl 报错 Can’t locate JSON.pm in @INC

解决:

sudo perl -MCPAN -e 'install JSON'

3、如何查看 SID ?

SQL> select instance_name from V$instance;

4、执行 ora2pg -t SHOW_VERSION -c ora2pg.conf 报错

FATAL: -1 ... ERROR OCIEnvNlsCreate. Check ORACLE_HOME (Linux) env var or PATH (Windows) and or NLS settings, permissions, etc.
Aborting export...

Export $ORACLE_HOME 了半天,发现原来是 ora2pg.conf 里面配置的 ORACLE_HOME 不对

5、执行 ora2pg -t SHOW_VERSION -c ora2pg.conf 报错

FATAL: 12505 ... ORA-12505: TNS:listener does not currently know of SID given in connect descriptor (DBD ERROR: OCIServerAttach)
Aborting export...

解决办法 SID 配置有问题 或者 /etc/hosts 有问题。参考下面连接解决
redhat7.7(centOS7)安装ORACLE 11g出坑教程及问题总结与解决

6、执行 ora2pg -t SHOW_VERSION -c config/ora2pg.conf 报错

install_driver(Oracle) failed: Can't load '/usr/local/lib64/perl5/auto/DBD/Oracle/Oracle.so' for module DBD::Oracle: libclntsh.so.11.1: cannot open shared object file: No such file or directory at /usr/lib64/perl5/DynaLoader.pm line 190.

解决办法
export LD_LIBRARY_PATH=$ORACLE_HOME/lib

7、执行ora2pg -t SHOW_VERSION -c ora2pg.conf 报错

FATAL: ORA-08178: illegal SERIALIZABLE clause specified for user INTERNAL (DBD ERROR: OCIStmtExecute)

解决办法:
不要使用 sys 用户,使用普通 oracle 用户(没有可新建),然后修改 ora2pg.conf 中的用户名和密码

8、执行 sh import_all.sh -d mydb -o tuser -h IP -p 5432 -f 提示 Out of memory , 但是 top 显示还有 1G 多。

解决办法:
Opened ./config/ora2pg.conf and modfied set DATA_LIMIT 5000 or 2500 solved the issue.

9、报错:DBD::Pg::db do failed: ERROR: permission denied for relation xxx

解决办法:
需要给 openGauss 的角色赋权限
mydb=# grant all privileges to tuser;

10、报错:

DBI connect('dbname=mydb;host=openGaussIP;port=5432','testuser',...) failed: connection to server at "openGaussIP", port 5432 failed: none of the server's SASL authentication mechanisms are supported at /opt/software/ora2pg/lib

解决办法:
这个错是 openGauss 返回的。需要把 openGauss 的 pg_hba.conf & postgres.conf 再搞下。
修改 data/single_node/postgresql.conf中 password_encryption_type = 1 。
修改 pg_hba.conf 中

然后重启 openGauss:gs_ctl restart -D /opt/software/openGauss/data/single_node

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/738225.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

信息系统项目管理师002:信息系统(1信息化发展—1.1信息与信息化—1.1.2 信息系统)

文章目录 1.1.2 信息系统1.信息系统及其特性2.信息系统生命周期 记忆要点总结 1.1.2 信息系统 信息系统是由相互联系、相互依赖、相互作用的事物或过程组成的具有整体功能和综合行为的统一体。在经济与社会活动中&#xff0c;经常使用“系统”的概念&#xff0c;例如&#xff0…

C# OpenCvSharp DNN 部署yoloX

目录 效果 模型信息 项目 代码 下载 C# OpenCvSharp DNN 部署yoloX 效果 模型信息 Inputs ------------------------- name&#xff1a;images tensor&#xff1a;Float[1, 3, 640, 640] --------------------------------------------------------------- Outputs ---…

Flask python 开发篇:配置文件

配置文件相关使用介绍 一、相关介绍二、系统环境变量配置三、项目中用到的配置项3.1、直接写在主脚本里3.1、单独写在一个配置文件里 四、使用配置文件 一、相关介绍 一般来说&#xff0c;在执行flask run命令运行程序前&#xff0c;我们需要提供程序实例所在模块的位置 。 F…

Python实战:数字存储:选择合适的数据类型

在Python编程中&#xff0c;选择合适的数据类型来存储数字对于性能和内存使用至关重要。本文将深入探讨Python中的数字数据类型&#xff0c;包括整数&#xff08;int&#xff09;、浮点数&#xff08;float&#xff09;和复数&#xff08;complex&#xff09;。我们将通过具体的…

PostgreSQL教程(三十四):服务器管理(十六)之逻辑复制

逻辑复制是一种基于数据对象的复制标识&#xff08;通常是主键&#xff09;复制数据对象及其更改的方法。我们使用术语“逻辑”来与物理复制加以区分&#xff0c;后者使用准确的块地址以及逐字节的复制方式。PostgreSQL两种机制都支持。逻辑复制允许在数据复制和安全性上更细粒…

Cassandra 安装部署

文章目录 一、概述1.官方文档2. 克隆服务器3.安装准备3.1.安装 JDK 113.2.安装 Python3.3.下载文件 二、安装部署1.配置 Cassandra2.启动 Cassandra3.关闭Cassandra4.查看状态5.客户端连接服务器6.服务运行脚本 开源中间件 # Cassandrahttps://iothub.org.cn/docs/middleware/…

CI/CD笔记.Gitlab系列:2024更新后-设置GitLab导入源

CI/CD笔记.Gitlab系列 设置GitLab导入源 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_…

Spring Cloud + Nacos 集成Netty Socket.IO

项目需要集成实时消息通讯&#xff0c;所以尝试在项目中集成websocket。技术上选择了Socket.io&#xff0c;前/后端统一使用此开源项目来实现需求。 一、版本 spring cloud: 2022.0.4 注册中心&#xff1a; nacos Netty-Socket.io : 2.0.9 <dependency><groupI…

【C语言】InfiniBand驱动mlx4_register_interface函数

一、讲解 mlx4_register_interface函数是Mellanox InfiniBand驱动程序的一部分&#xff0c;这个函数的作用是注册一个新的接口(intf)到InfiniBand设备。这允许不同的子系统&#xff0c;如以太网或存储&#xff0c;能够在同一个硬件设备上注册它们各自需要的接口&#xff0c;在…

编程笔记 html5cssjs 008 HTML图片 名画欣赏

编程笔记 html5&css&js 008 HTML图片 名画欣赏 一、代码二、解释 这段HTML代码定义了一个网页&#xff0c;展示了名画欣赏的内容。主要包括页面的标题、样式定义和主体内容。其中&#xff0c;样式定义使用了CSS来控制页面的布局和外观&#xff0c;主体内容使用了结构化…

ASP.Net实现玩具管理(三层架构,两项数据相乘)

目录 演示功能&#xff1a; 点击启动生成页面 步骤&#xff1a; 1、建文件 ​编辑 2、添加引用关系 3、根据数据库中的列写Models下的XueshengModels类 4、DAL下的DBHelper&#xff08;对数据库进行操作&#xff09; 5、DAL数据访问层下的service文件 6、BLL业务逻辑层…

华为HCIE实验题库哪里有?Cloud相关证书咋样?

华为HCIE认证的含金量很高&#xff0c;这除了是因为华为自身的影响力之外&#xff0c;也是因为HCIE的考试难度大。 HCIE的实验考试长达八个小时&#xff0c;考的是实际操作和论述&#xff0c;要想拿下HCIE实验考试&#xff0c;不断练习是十分关键的。 而华为HCIE实验的题库哪…

通讯协议制定之交互方式、步骤介绍

文章目录 通讯协议制定之交互方式、步骤介绍1. 前言2. 通讯协议发送类型2.1 周期发送2.2 事件发送 3. 通讯协议数据包类型3.1 握手3.2 心跳3.1 数据包 4. 小结 通讯协议制定之交互方式、步骤介绍 1. 前言 通讯协议又称通信规程&#xff0c;是指通信双方对数据传送控制的一种约…

【Spring Boot 3】读取resource文件

【Spring Boot 3】读取resource文件 背景介绍开发环境开发步骤及源码工程目录结构总结背景 软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历中,每次学习新技术总是要花费或…

如何部署Python Flask并实现远程访问本地搭建web站点【内网穿透】

文章目录 前言1. 安装部署Flask并制作SayHello问答界面2. 安装Cpolar内网穿透3. 配置Flask的问答界面公网访问地址4. 公网远程访问Flask的问答界面 前言 Flask是一个Python编写的Web微框架&#xff0c;让我们可以使用Python语言快速实现一个网站或Web服务&#xff0c;本期教程…

导出微软浏览器收藏的网页,并查看网页保存的登录密码

导出微软Edge浏览器收藏夹&#xff08;书签&#xff09;的步骤如下&#xff1a; 打开Microsoft Edge浏览器。右键点击浏览器收藏栏上的任意位置或使用快捷键Ctrl Shift O打开收藏夹管理页面。在收藏夹管理页面中&#xff0c;通常你会看到右上角或菜单区域有一个“…”或者三…

Axios中每次发送post请求前都会发送options请求

今天写前端的时候&#xff0c;发现每次post请求都会失败&#xff0c; 反复调试过后发现axios在每次发送post请求前都发送了options请求&#xff0c; 在网络搜罗了一大圈&#xff0c; 发现了原因是因为web页面发送了请求给vue后&#xff0c; vue再请求后端过程中发生了跨域&…

【算法】一维前缀和以及二维前缀和

目录 一维前缀和适用场景示例 二维前缀和适用场景一种情况另一种情况示例 一维前缀和 适用场景 求一段区间的和。 比如有一个数列 &#xff1a; 如果我们要求 [l,r]即某个区间内的数组和的时候&#xff0c;思路就是每遍历一个元素就进行求和&#xff0c;记录下加到al时的和…

Skywalking

1、简介 Skywalking是由国内开源爱好者吴晟开源并提交到Apache孵化器的开源项目&#xff0c; 2017年12月SkyWalking成为Apache国内首个个人孵化项目&#xff0c; 2019年4月17日SkyWalking从Apache基金会的孵化器毕业成为顶级项目&#xff0c; 目前SkyWalking支持Java、 .Net、 …

广告主投放系统从设计到实践

在当今数字广告行业中&#xff0c;广告主投放系统扮演着至关重要的角色。它是连接广告主和广告媒体之间的桥梁&#xff0c;帮助广告主实现广告投放目标并获得可观的回报。本篇博客文章将深入探讨广告主投放系统的设计和实践过程&#xff0c;并分享一些关键的经验和最佳实践。 …