我用了数据库迁移工具(从Oracle迁移到PostgreSQL)

这是PostgreSQL Advent Calendar 2022的第13天的帖子。

昨天,我在@hmatsu47的Supabase上尝试了一下从应用程序中使用TCE(透明列加密)。

首先

由于这是我第一次进行数据库迁移,可能会有一些错误(欢迎提出指正!)也请谅解我在使用PostgreSQL方面的经验较少。

这次的目标

目前的情况是预计将使用的Oracle数据库迁移到PostgreSQL。
以下可能是其优点:

    • コストダウン

 

    他の商用DBMSと変わらないパフォーマンス

关于DB迁移工具

本次使用ora2pg工具,从Oracle中提取了DDL定义等内容,完成了向PostgreSQL 15版本的迁移。

ora2pg是一种使用Perl编写的开源软件,可以将Oracle或MySQL数据库迁移到PostgreSQL。您可以在此处下载。最新版本为23.2。

环境

操作系统:CentOS
版本:7.5
数据库①:Oracle12c
数据库②:PostgreSQL15

安装步骤

由于本次是离线进行,我们下载了资源并通过Make命令进行构建。
还有一种方法是通过CPAN等进行安装。
另外,在安装ora2pg之前,还需要确保Perl的版本在5.16以上。

$ perl -v

This is perl 5, version 30, subversion 3 (v5.30.3) built for darwin-thread-multi-2level
(with 2 registered patches, see perl -V for more detail)

我們準備的資材如下列所示。

使用WinSCP等工具将资材存储到指定位置。

    • ora2pg

 

    • DBD::Oracle

 

    • DBI

 

    Time-Hires
$ tar zxf ora2pg.tar.gz
$ cd ora2pg
$ perl Makefile.PL
$ make & make install
$ ll /usr/local/bin/ora2pg
$ tar zxf DBD-Oracle-1.83.tar.gz
$ cd DBD-Oracle-1.83
$ perl Makefile.PL
$ make & make install
$ tar zxf DBI-1.643.tar.gz
$ cd DBI-1.643
$ perl Makefile.PL
$ make & make install
$ tar zxf Time-HiRes-1.9764.tar.gz
$ cd Time-HiRes-1.9764
$ perl Makefile.PL
$ make & make install

执行命令

1. 修改conf文件 conf

# ORACLE接続情報
ORACLE_DSN      dbi:Oracle:host=localhost;sid=userinfo;port=1521
ORACLE_USER     user
ORACLE_PWD      password
SCHEMA USERINFO

# 拡張機能:ORAFCEを使用する場合は、1を設定
ORAFCE 0

2.和Oracle进行连接确认

$ ora2pg -c ./config/ora2pg.conf -t SHOW_VERSION
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0

3. 如果进行一次性抽取的情况下

创建一个模板文件夹,并执行生成的 Shell。

# mkdir ./db_migration
# ora2pg --project_base ./db_migration --init_project test_project
Creating project test_project.
/root/db_migration/test_project/
        schema/
                dblinks/
                directories/
                functions/
                grants/
                mviews/
                packages/
                partitions/
                procedures/
                sequences/
                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 script import_all.sh to automate all imports.

我会再次修改设置文件。
修改完后,会执行批量提取操作。

$ sh -x export_schema.sh

确认执行后的输出文件(使用tree命令)。

[root@localhost:test_project]# tree
.
├── config
│   └── ora2pg.conf
├── data
├── export_schema.sh
├── import_all.sh
├── reports
│   ├── columns.txt
│   ├── report.html
│   └── tables.txt
├── schema
│   ├── dblinks
│   ├── directories
│   │   └── directories.sql
│   ├── functions
│   ├── grants
│   ├── mviews
│   │   └── mviews.sql
│   ├── packages
│   ├── partitions
│   ├── procedures
│   │   ├── procedure.sql
│   │   └── TEST_ADD_procedure.sql
│   ├── sequences
│   │   └── sequence.sql
│   ├── synonyms
│   ├── tables
│   │   ├── CONSTRAINTS_table.sql
│   │   ├── FKEYS_table.sql
│   │   ├── INDEXES_table.sql
│   │   └── table.sql
│   ├── tablespaces
│   ├── triggers
│   ├── types
│   └── views
│       ├── TESTview.sql
│       └── view.sql
└── sources
    ├── functions
    ├── mviews
    │   └── mviews.sql
    ├── packages
    ├── partitions
    ├── procedures
    │   ├── procedure.sql
    │   └── TEST_ADD_procedure.sql
    ├── triggers
    ├── types
    └── views
        ├── TEST_view.sql
        └── view.sql

4. 如果逐個提取的情況

使用工具时,有部分令人担忧的是某些表无法抽取的情况。无法确定是Oracle端的设置问题还是Ora2pg的设置问题,因此至今未能解决。因此,应该会有时候需要提取出无法抽取的表的DDL,并通过ora2pg进行转换。

ora2pg -c ora2pg.conf -t TABLE -b ~/table/ -o ora2pg_TABLE.sql

请在ora2pg的官方文件中指定要使用的TYPE。

对PostgreSQL和Oracle进行数据兼容性测试。

前提

・确保环境中安装有PostgreSQL。

安装访问PostgreSQL数据库的模块。

    DBD::Pg
$ tar zxf DBD-Pg-3.16.0.tar.gz
$ cd DBD-Pg-3.16.0
$ perl Makefile.PL
$ make & make install

修改conf文件

修改使用模板创建的ora2pg.conf文件。

PG_SCHEMA userinfo
PG_DSN dbi:Pg:dbname=userinfo;host=localhost;port=5432
PG_USER user
PG_PWD password

执行测试命令

ora2pg -t TEST -c ./config/ora2pg.conf > diff.txt

4.检查工作形式

这是一个摘录版本。如果显示如下,则看起来没有差异。
由于可能会输出错误,因此最好根据内容进行确认。

[TEST TABLE COUNT]
ORACLEDB:TABLE:5
POSTGRES:TABLE:5
[ERRORS TABLE COUNT]
OK, Oracle and PostgreSQL have the same number of TABLE.

扩展功能

拡張機能説明external_fileOracleのディレクトリをPostgreSQLでも使用したい時pgttPostgreSQL Global Temporary Tablesを使いたい時orafceOracleの関数を一部使用できるようにするpostgresql-fdw外部データとの連携したい時 (あまりよくわかっていない)
$ tar zxf external_file-1.0.tar.gz
$ cd external_file-1.0
$ make&make install
⇨pgttも同様
$ rpm -ivh orafce_15-4.0.1-1.rhel7.x86_64.rpm

在上述任务中,已经将各个扩展功能安装到PostgreSQL的Extension文件夹中。
接下来,我们将使得这些扩展功能可以在数据库中使用。

# CREATE EXTENSION external_file;
CREATE EXTENSION
# CREATE EXTENSION pgtt;
CREATE EXTENSION
# CREATE EXTENSION orafce;
CREATE EXTENSION
# CREATE EXTENSION postgres_fdw;
CREATE EXTENSION
# \dn
     List of schemas
     Name     |  Owner
--------------+----------
 dbms_alert   | user
 dbms_assert  | user
 dbms_output  | user
 dbms_pipe    | user
 dbms_random  | user
 dbms_utility | user
 oracle       | user
 plunit       | user
 plvchr       | user
 plvdate      | user
 plvlex       | user
 plvstr       | user
 plvsubst     | user
 public       | postgres
 utl_file     | user
 pgtt_schema  | user
 external_file| user
 userinfo     | user
# SHOW search_path;
search_path
--------------------------------
"$user", public
# ALTER ROLE user SET search_path = userinfo,oracle,external_file,pgtt_schema,,,;
ALTER ROLE

PostgreSQL文件导入指令

只限指特定的引入或采取行动。

psql -U user -d userinfo -f ./schema/tables/table.sql

一次性导入

$ sh -x import_all.sh

注意事项

    • OracleとPostgreSQLでは、データ操作クエリにて一部使用できない関数が使われている。

 

    • 例えば、ROWNUMが使えないなどあるため、互換性一覧を随時確認する必要がある

 

    • データの最大バイト数が違う

 

    • PostgreSQL:1GB

 

    • Oracle:2GB

 

    一部変換できないところがあるため、手作業が必要となります。

结束

非常感謝您的閱讀直到最後。

请返回

    • ora2pgを使用してOracleからPostgreSQLへ移行する

OracleからPostgreSQL移行について

bannerAds