首页 > 数据库 >Oracle数据表搬迁到openGauss

Oracle数据表搬迁到openGauss

时间:2024-04-10 15:33:37浏览次数:13  
标签:rows ora2pg -- mogdb 数据表 conf Oracle TABLE openGauss

Oracle 数据表搬迁到 openGauss
搬迁方法
Oracle 数据表搬迁到 openGauss 数据库比较容易想到的两个工具是 oracle_fdw 及 Ora2Pg。

oracle_fdw
oracle_fdw 是嵌入在目标端数据库里的一个扩展插件,允许在目标端数据库里访问其他异构数据库的表,openGauss 数据库目前也支持这一插件。

oracle_fdw 在 openGauss 数据库的使用可以参考我写的这篇文章:<<opengauss1.0.1 支持 oracle_fdw 和 mysql_fdw>>

如下所示,目标端建立了到源端数据表的映射,可以在目标端用 create table as select 方式进行拷贝。

CREATE FOREIGN TABLE public.f_oracle_test (
id int,
info character varying
)
SERVER server_ora
OPTIONS (
schema 'scott',
"table" 'AA'
);
Ora2Pg
Ora2Pg 是一个开源的迁移转换工具,它可以连接 Oracle 数据库并进行扫描,自动提取结构或数据,然后生成可加载到 PostgreSQL 数据库中的 SQL 脚本。

本文介绍使用 Ora2Pg 工具先搬迁数据表及数据到 PostgreSQL,然后再从 PostgreSQL 搬迁到 openGauss。

Ora2Pg 工具的安装可以参考附录一,搬迁前常见的操作命令可以参考附录二。

下面演示具体操作步骤:

1.初始一个搬迁目录

在 postgres 用户下操作

ora2pg --init_project project20210507
--project_base /home/postgres/data
该目录用于分类存放源端不同的对象类型,如 table、view、package、function 等,以及 Oracle 端原生的 SQL 脚本及 Ora2Pg 转换后的脚本等。

2.定制 Ora2Pg 配置文件

在 postgres 用户下操作 vi project20210507/config/ora2pg.conf

NO_HEADER
ORACLE_DSN dbi:Oracle:host=x.x.x.x;port=1521;sid=xxx
ORACLE_USER xxx
ORACLE_PWD xxx
PG_VERSION 12
PG_DSN dbi:Pg:host=...;port=6000;dbname=xxx
PG_USER xxx
PG_PWD xxx
SCHEMA xxx
ALLOW T_.* UL_.*
EXCLUDE TMP_.* .*BACKUP
DATA_TYPE VARCHAR2:character varying
SKIP fkeys,indexes
COMPILE_SCHEMA 0
DISABLE_COMMENT 1
DROP_FKEY 1
注意参数值大小写问题,上面配置 Oracle 及 PG 连接参数值可以为小写,SCHEMA 配置 Oracle 端的模式名称需要配置为大写。ALLOW 与 EXCLUDE 一般只使用一种,不要同时配置。上面 ALLOW 配置白名单,只搬迁以“T
”开头和“UL_”开头的表,EXCLUDE 配置黑名单,不搬迁以“TMP_”开头及以“_BACKUP”结尾的表。

3.使用 Ora2Pg 导出 oracle 端指定列表的表结构文件

如果我们要完整搬迁所有的对象,包括 table、view、package、function 等,可以使用脚本文件 export_schema.sh 进行导出,并对导出的脚本进行导入测试修正。

多数情况下我们先需要按对象类型逐一手工操作一遍,手工配置处理不兼容性,多次处理完成后最后使用脚本一次性把所有对象导出。

这里演示只导出部分表,我们使用 allow 参数直接指定,参数值之间使用逗号分割。在 postgres 用户下操作。

ora2pg --conf config/ora2pg.conf
--basedir ./schema/tables
--type TABLE
--allow "T_TAB1,T_TAB2,UL_TAB1,UL_TAB2..."
--plsql
--out table.sql
--jobs 10 --copies 10 --parallel 10
最后的三个并行参数代表 ora2pg 并行处理表的任务数,每个任务从 Oracle 端传输数据的并行数及每个任务 ora2pg 传输到 PostgreSQL 的并行数,可根据实际环境进行修改。

4.使用 psql 工具导入表结构文件到 PG

下面是导入到 PostgreSQL 的操作,在 postgres 用户下操作

/opt/pg12/bin/psql -Umogdb mogdb -f ./schema/tables/table.sql
上面的操作需要先提前创建用户及数据库,参见如下步骤

/opt/pg12/bin/psql
create user mogdb password 'xxx';
drop database if exists mogdb;
create database mogdb owner mogdb;
\c mogdb postgres
drop schema public;
\c mogdb mogdb
create schema mogdb authorization mogdb;
create schema pkg1 authorization mogdb;
create schema pkg2 authorization mogdb;
上面的模式 pkg1 和 pkg2 用于 package 包的存储。

5.使用 gsql 工具导入表结构文件到 openGauss

导入到 openGauss 的操作与上面导入到 PG 类似,openGauss 使用 gsql 工具进行导入。

su - omm
gsql -U mogdb -f ./schema/tables/table.sql
如果有分区表语法需要单独处理下,openGauss 与 PostgreSQL 分区表的语法差异可以参考:openGauss 与 PostgreSQL 分区策略语法测试

6.使用 ora2pg 传输 oracle 表数据到 PG

先从 oracle 端查询下数据条数最大的十个表,在 postgres 用户下操作

ora2pg --conf config/ora2pg.conf
--allow "T_TAB1,T_TAB2,UL_TAB1,UL_TAB2..."
--type SHOW_TABLE
上一步输出结果如下:

[1] TABLE T_TAB1 (owner: XXX, 2869 rows)
[2] TABLE T_TAB2 (owner: XXX, 785412 rows)
[3] TABLE UL_TAB1 (owner: XXX, 4153778 rows)
[4] TABLE UL_TAB2 (owner: XXX, 140 rows)
...
[x] TABLE xx (owner: XXX, 125793 rows)

Total number of rows: 1873163888

Top 10 of tables sorted by number of rows:
[1] TABLE xx has 395364413 rows
[2] TABLE xx has 379561355 rows
[3] TABLE xx has 363704131 rows
[4] TABLE xx has 237709148 rows
[5] TABLE xx has 105294544 rows
[6] TABLE xx has 99877964 rows
[7] TABLE xx has 54815152 rows
[8] TABLE xx has 49803085 rows
[9] TABLE xx has 45016399 rows
[10] TABLE xx has 25595242 rows
我们可以排除上面最大的 10 个表来提升整体的搬迁效率,大表可以单独配置任务来处理。提前使用–oracle_speed 和–ora2pg_speed 参数可以用来测试速度而并不实际搬迁数据,以便预估时间。

下面使用 COPY 方式搬迁数据,并修改了每次内存中缓存的数据条数为 10 万。

ora2pg --conf config/ora2pg.conf
--type COPY
--allow "T_TAB1,T_TAB2,UL_TAB1,UL_TAB2..."
--limit 100000
--jobs 10 --copies 10 --parallel 10
7.使用 pg_dumpall 导出文本 SQL 数据文件

在 postgres 用户下操作

/opt/pg12/bin/pg_dumpall
--username mogdb
--data-only
--exclude-database=template0,template1,postgres
--file pg_mogdb.sql
8.使用 gsql 导入数据文件到 openGauss

导入前先删除下文件里的 set 语句,比如 row_security 等参数,这些参数再 openGauss 里不兼容。

su - omm
gsql -U mogdb -f pg_mogdb.sql
至此我们批量把 oracle 中部分表搬迁至 openGauss 数据,中间借助 PostgreSQL 数据库转储表数据。

如果要搬迁 package 包,可以按包名使用 ora2pg 进行批量转换,在 postgres 用户下操作。

ora2pg --conf config/ora2pg.conf
--basedir ./schema/packages
--type PACKAGE
--allow "PKG_XX1,PKG_XX2,..."
--plsql
--out package.sql
使用 ora2pg 对 oracle 端的 package 包进行转换后,我们进行到转换后的包目录,然后可以直接在 openGauss 中进行修改调试。

cd schema/packages/pkg_xx1
cd schema/packages/pkg_xx2 ...
附录一 Ora2Pg 安装
安装 Perl

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

安装 DBI

$ wget https://cpan.metacpan.org/authors/id/T/TI/TIMB/DBI-1.643.tar.gz
$ tar -zxvf DBI-1.643.tar.gz
$ cd DBI-1.643
$ perl Makefile.PL
$ make && make install
安装 oracle 客户端

yum localinstall oracle-instantclient-basic-10.2.0.5-1.x86_64.rpm

yum localinstall oracle-instantclient-devel-10.2.0.5-1.x86_64.rpm

安装 DBD-Oracle

注意配置 oracle 客户端动态库,例如:

export LD_LIBRARY_PATH=/usr/lib/oracle/10.2.0.5/client64/lib:/usr/local/lib
$ wget https://cpan.metacpan.org/authors/id/M/MJ/MJEVANS/DBD-Oracle-1.80.tar.gz
$ tar -zxvf DBD-Oracle-1.80.tar.gz
$ cd DBD-Oracle-1.80
$ perl Makefile.PL
$ make && make install
安装 DBD-PG

需要先安装并配置好 PostgreSQL 环境变量,如果本机没有安装 PostgreSQL,请参考源码编译安装 PostgreSQL 12

确保环境变量配置正确,例如:

export PATH=$PATH:/opt/pgsql/bin
$ wget https://cpan.metacpan.org/authors/id/T/TU/TURNSTEP/DBD-Pg-3.14.2.tar.gz
$ tar -zxvf DBD-Pg-3.14.2.tar.gz
$ cd DBD-Pg-3.14.2
$ perl Makefile.PL
$ make && make install
安装 Ora2Pg

$ wget https://github.com/darold/ora2pg/archive/refs/tags/v21.1.tar.gz
$ tar zxvf v21.1.tar.gz
$ cd ora2pg-21.1
$ perl Makefile.PL
$ make # sudo make install
检查版本

$ cd ~
$ ./perl5/bin/ora2pg --version
Ora2Pg v21.1
附录二 Ora2Pg 迁移前常见操作
查看源端 Oracle 服务器版本

ora2pg --conf config/ora2pg.conf
--type SHOW_VERSION
查看有哪些 schema 模式(需要 dba 权限)

ora2pg --conf config/ora2pg.conf
--type SHOW_SCHEMA
查看表信息(每个表的 owner 和行数以及表行 top10)

ora2pg --conf config/ora2pg.conf
--type SHOW_TABLE
结果会输出表的数量及所有表的记录总数以及记录数最多的 top10。

查看列映射信息

ora2pg --conf config/ora2pg.conf
--type SHOW_COLUMN > check_colum.txt
观察日志是否有错误警告等信息,找出对应的错误进行配置处理,例如 Oracle 端有关键字命中,可以在 ora2pg.conf 文件进行转换处理,使用配置参数 REPLACE_COLS 。

REPLACE_COLS SCOTT.T_DEPT(isnull:isnulls)
REPLACE_COLS SCOTT.T_PERSON(using:usings)
上面 SCOTT 模式下 T_DEPT 表的 isnull 我们映射到 PostgreSQL 改为 isnulls。同理 T_PERSON 表的 using 字段我们改为 usings。

生成迁移报告(HTML)

ora2pg --conf config/ora2pg.conf
--estimate_cost --dump_as_html
--parallel 8 --jobs 2
--type SHOW_REPORT > html_report.html
迁移后验证

迁移测试,验证源端与目标端的表数据行数是否一致

ora2pg --conf config/ora2pg.conf
--parallel 8 --jobs 2
--count_rows
--type TEST > check_tables_count.txt

标签:rows,ora2pg,--,mogdb,数据表,conf,Oracle,TABLE,openGauss
From: https://www.cnblogs.com/helloopenGauss/p/18126135

相关文章

  • openGauss 列存表PSort索引
    openGauss列存表PSort索引概述PSort(Partialsort)Index是在列存表的列上建的聚簇索引。CUDesc上有每个CU的min和max值,但如果业务的数据模型较为离散,查询时通过min和max值去过滤CU会出现大量的CU误读取,例如每个CU的min和max跨度都比较大时,其查询效率......
  • openGauss数据与PostgreSQL的差异对比
    openGauss数据与PostgreSQL的差异对比前言openGauss数据库已经发布2.0.1版本了,中启乘数科技是一家专业的专注于极致性能的数据库服务提供商,所以也关注openGauss数据库的特性。因为openGauss是从PostgreSQL发展出来的,所以我们详细讲解对比一下openGauss与原生Po......
  • 一键部署openGauss2.0.1 CentOS 7.6
    一键部署openGauss2.0.1[CentOS7.6]本文档目的是为了帮助高校学生提供基于CentOS7.6操作系统,实现openGauss数据库一键式安装的脚本。该脚本执行成功后,所有关于openGauss数据库的文件将保存在/gaussdb目录中。脚本内容中“...”请替换为服务器实际的私有IP地址。脚......
  • openGauss 2.1.0 闪回特性
    openGauss2.1.0闪回特性openGauss2.1.0于2021年9月30日发布,是openGauss的一个Preview版本,该版本生命周期仅为半年。该版本的新增功能如下:存储过程兼容性增强SQL引擎能力增强支持Ustore存储引擎支持段页式存储基于Paxos分布式一致性协议的高可用AI4DB和......
  • openGauss数据库xlog目录满问题处理
    openGauss数据库xlog目录满问题处理openGauss数据库xlog满通常为以下几个原因:1.主备状态不正常,存在网络问题,集群内有宕机的节点2.xlog保留数量过多3.逻辑复制槽失效,且未及时清理4.开启归档,但归档失败导致xlog不清理首先,确认数据库状态gs_om-tquery确认主备状态......
  • HAProxy适配openGauss使用指导书
    一、HAProxy简介HAProxy是一个开源的项目,其代码托管在Github上,代码链接如下:HAProxy代码链接。HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy实现了一种事件驱动,单一进程模型,此模型支持非......
  • MogDB/openGauss 开机自启动
    MogDB/openGauss开机自启动在centos7.6操作系统上设置MogDB/openGauss开机自启动,我们先来了解一下自定义服务的配置文件组成部分,共分为[Unit]、[Service]、[Install]三个部分。[Unit]Description=当前服务的简单描述Documentation=服务配置文件的位置Before=在某服务......
  • 如何在openGauss 2.1.0中使用Job
    如何在openGauss2.1.0中使用Job如何在openGauss2.1.0中使用JobJob类似unix中的crontab,有定时执行的功能,可以在指定的时间点或每天的某个时间点等自行执行任务。在各类系统使用运行过程中,经常会遇到需要定时完成的任务,比如定时更新数据,定时统计数据生成报表等等,这些......
  • java连接Oracle(JDBC)
    packagetext.coming;importjava.sql.*;publicclassdemo{publicstaticvoidmain(String[]args){Connectionct=null;Statementstatement=null;try{Class.forName("oracle.jdbc.driver.OracleDriver");......
  • Oracle 获取视图的DDL
    version:OracleDatabase10gEnterpriseEditionRelease10.2.0.4.0通过sqlplus获取视图的DDL的两种方法先设置格式setline233pages233long9999通过all_views/dba_views视图selecttextfromdba_viewswhereview_name='V_$DATABASE';TEXT-------------......