我用了数据库迁移工具(从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.
扩展功能
$ 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移行について