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