Info2softは、ウェブサイトでより快適で適切な閲覧体験を提供するためにCookieを使用しています。 プライバシーポリシー
Loading...
多くの企業はライセンスコスト削減、高度な機能の活用、柔軟性向上を目的としてOracleからPostgreSQLへの移行を実施しています。PostgreSQLへの移行により、コスト効率に優れ将来性のあるデータベース戦略を構築できます。
ただし、OracleからPostgreSQLへの移行は単純ではありません。Oracleデータベースには複雑なスキーマ、ストアドプロシージャ、トリガー、PostgreSQLに直接互換性のない独自SQL機能が多く含まれるためです。
そこで活躍するのがOra2Pgです。Ora2PgはOracle‑PostgreSQL間のデータベース変換を簡素化する人気のオープンソース移行ツールです。Oracleデータベース構造を解析し、移行レポートを生成、スキーマをPostgreSQL互換のSQLに変換し、PostgreSQLにインポート可能なデータを出力します。
この記事ではOra2PgによるOracleからPostgreSQLへの移行手順を段階的に解説します。本ガイドはCentOS環境で動作確認済みで、インストール、設定、動作確認、移行評価、エクスポート、インポートなどの工程を網羅しています。
CentOS 7/8で動作確認済みの手順に従い、必要な依存パッケージを含めてツールをビルド・セットアップします。
YUMを使用し、ora2pgのコンパイルと実行に必須のパッケージをインストールします。
sudo yum install gcc postgresql-devel perl-DBI perl-ExtUtils-MakeMaker perl-devel perl-DBD-Pg -y
perl -MDBI -e 'print $DBI::VERSION'を実行し、Perlモジュールに欠落がないことを確認します。
1. Oracle公式リポジトリよりOracle BasicおよびSDK RPM(12.2以降)をダウンロードし、ローカルインストールします。
sudo yum install oracle-instantclient12.2-basic-12.2.0.1.0-1.x86_64.rpm oracle-instantclient12.2-devel-12.2.0.1.0-1.x86_64.rpm -y
2. ~/.bash_profileに環境変数を設定します。
export ORACLE_HOME=/usr/lib/oracle/12.2/client64
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
export PATH=$ORACLE_HOME/bin:$PATH
sqlplus ユーザー名/パスワード@oracle_host:1521/service_nameを実行し、クライアントが動作することを確認します。
本モジュールはora2pgがOracleに接続するために必要です。簡便のためCPANからインストールします。
cpan DBD::Oracle
perl -MDBD::Oracle -e 'print $DBD::Oracle::VERSION'で検証し、エラーが出力されなければ成功です。
安定版v20.0をダウンロードしコンパイルします。
wget https://github.com/darold/ora2pg/archive/refs/tags/v20.0.tar.gz
tar -xvf v20.0.tar.gz && cd ora2pg-20.0
perl Makefile.PL
make && sudo make install
ora2pg -vを実行し、「ora2pg v20.0」が表示されることでグローバルインストール完了を確認します。
ora2pg.confファイルの設定はOracleからPostgreSQLへの移行における重要な工程です。このファイルにはOra2PgのOracleインスタンスへの接続方法、移行対象データ、PostgreSQL互換向け出力形式が定義されます。
インストール後、デフォルトのora2pg.confは通常以下のパスに配置されます。
/usr/local/share/ora2pg/ora2pg.conf.dist
元のテンプレートを保持したまま、実用可能な設定ファイルとしてコピーします。
cp /usr/local/share/ora2pg/ora2pg.conf.dist /etc/ora2pg.conf
vimなどのテキストエディタで/etc/ora2pg.confを編集し、Oracle/PostgreSQL環境に合わせて必須パラメータを更新します。
# PostgreSQLバージョン(11以上推奨)
PG_VERSION = 14
# Oracle接続文字列(形式:dbi:Oracle:host=ORACLE_HOST;port=1521;sid=ORACLE_SID)
ORACLE_DSN = dbi:Oracle:host=192.168.1.100;port=1521;sid=ORCL
# Oracle認証情報(読み取り権限が最低限必要)
ORACLE_USER = oracle_migration_user
ORACLE_PWD = your_secure_password
# 移行対象Oracleスキーマ
SCHEMA = HR
# 完全なスキーマエクスポートを有効化
EXPORT_SCHEMA = 1
# ユーザー付与権限をエクスポート
USER_GRANTS = 1
# トランザクションモードを読み取り専用に設定(Oracleのロック問題回避)
TRANSACTION = READONLY
ora2pgコマンドを実行し、構文エラーと接続性を確認します。
ora2pg -t SHOW_VERSION -c /etc/ora2pg.conf
正常終了時はora2pgのバージョンが表示され、Oracleクライアントとの接続が確認できます。
移行スクリプト作成やレポート出力の前にOra2Pgの接続確認を実施し、移行失敗、出力破損、後続の時間ロスを回避することを推奨します。
以下の簡易テストで環境設定を検証します。
まずora2pgが設定ファイルを読み込み、重大なエラーなく実行できることを確認します。
ora2pg -t SHOW_VERSION -c /etc/ora2pg.conf
正常結果ではora2pgのバージョン(例:ora2pg v20.0)が出力され、Oracle DBDモジュールの読み込みが確認できます。「DBD::Oracle not found」が表示された場合はOra2pgインストールの手順3に戻りDBD::Oracle Perlモジュールを再インストールしてください。
ora2pgがOracleインスタンスに到達できるかを確認するテストを実行します。
ora2pg -t TEST_CONNECTION -c /etc/ora2pg.conf
成功すると「Oracle connection OK」が表示されます。代表的なエラーと対処は以下の通りです。
最後に対象Oracleスキーマを簡易スキャンし、ora2pgがオブジェクトを読み取れることを確認します。
ora2pg -t SHOW_SCHEMA -c /etc/ora2pg.conf
このコマンドは対象スキーマ(例:HR)内のテーブル、ビュー、シーケンスを一覧表示します。一覧が完全に出力されればora2pgが十分な読み取り権限を持ち、移行評価の実行準備が完了しています。
Oracleにはシノニム、DBMS_*系パッケージ、特殊なPL/SQLロジック、ネストトランザクションなど、Ora2Pgが自動変換できない独自機能が多数存在します。移行リスクと業務停止時間を評価し、実行可否を判断する必要があります。
Ora2Pgを用いた移行評価の手順は以下の通りです。
コマンドを実行しOracleスキーマをスキャンし、実行可能な詳細レポートを出力します。
ora2pg -t SHOW_REPORT --estimate_cost -c /etc/ora2pg.conf > oracle_to_postgres_assessment.txt
–estimate_costオプションにより移行難易度スコア(1‑10)が算出され、テーブル、PL/SQL、パーティション、権限などオブジェクト種別ごとの作業量が集計されます。
oracle_to_postgres_assessment.txtを参照し、オブジェクトを変換可否ごとに分類します。
レポートの難易度スコアをもとにリソースを配分します。
接続検証と移行評価完了後、以下の手順でOracleからPostgreSQLへ移行します。
評価結果に合わせてエクスポートモードを選択します(PL/SQLの複雑度が高い場合はスキーマのみ、リスクの低いデータベースは完全エクスポート)。
完全エクスポート(スキーマ+データ+権限):
ora2pg -c /etc/ora2pg.conf -o oracle_to_postgres_migration.sql -d
カスタムエクスポートオプション(対象を限定した移行向け)
✵ スキーマのみエクスポート(データなし、構造の事前テストに適する):
ora2pg -c /etc/ora2pg.conf -o oracle_schema_only.sql -t SCHEMA
✵ データのみエクスポート(Postgresスキーマが既に存在する場合):
ora2pg -c /etc/ora2pg.conf -o oracle_data_only.sql -t DATA
✵ 権限のみエクスポート(ユーザー権限):
ora2pg -c /etc/ora2pg.conf -o oracle_grants_only.sql -t GRANTS
未検証のスクリプトをインポートしてはいけません。移行評価に基づき、ora2pgが変換し損ねたOracle固有構文を修正します。
1. 変換不可のOracleキーワード(SYNONYM、DBMS_*、NESTED TABLEなど)を検索:
grep -i "SYNONYM\|DBMS_" oracle_to_postgres_migration.sql
2. 検出した問題を修正(シノニムをPostgresのビューへ置換、PL/SQLをPL/pgSQLへ書き換えなど)
3. Postgres上でドライランを実行し構文エラーを事前検知:
psql -h your_postgres_host -U postgres_user -d target_db -f oracle_to_postgres_migration.sql --dry-run
CREATE/INSERT権限を持つ専用のPostgres移行ユーザーを使用し、検証済みスクリプトを読み込みます。
psql -h your_postgres_host -p 5432 -U postgres_migration_user -d target_postgres_db -f oracle_to_postgres_migration.sql > migration_import_log.txt 2>&1
これによりスクリプトをインポートし、トラブルシューティング用にすべての出力・エラーを記録します。
1. 移行元OracleとPostgresを突き合わせ、データやオブジェクトの欠落がないことを確認します。
インポートされたテーブル一覧を取得(Oracle側の件数と照合):
SELECT table_name FROM information_schema.tables WHERE table_schema = 'hr';
2. 重要テーブルのレコード件数を検証(例:employees):
-- Postgres側件数
SELECT COUNT(*) FROM hr.employees;
-- Oracle側件数(照合用)
SELECT COUNT(*) FROM hr.employees;
3. 主キー・外部キーなど主要制約をテストし、データの整合性を確保:
SELECT employee_id, COUNT(*) FROM hr.employees GROUP BY employee_id HAVING COUNT(*) > 1;
主キーの重複チェックであり、0件返却されることが正常です。
備考:
ora2pg --parallel 4で出力を分割し、インポート時はPostgresのインデックス・制約を無効化(インポート後に再有効化)して読み込み速度を向上させてください。ora2pg -t INCREMENTALで新規・更新データを同期できます。環境を慎重に構築しても、ora2pgによるOracle‑PostgreSQL移行時には代表的なエラーが発生する場合があります。頻出する問題と簡易な解決策を記載します。
1. Perlモジュール欠落(DBD::Oracle/DBIエラー)
必要なPerlライブラリが欠落または破損している場合に発生します。DBD::OracleとDBIモジュールを再インストールし、バージョン確認コマンドで正常に読み込まれることを確認してください。
2. Oracle Instant Clientのパス関連の問題
環境変数の設定ミスによりOra2pgがOracleクライアントファイルを参照できません。ORACLE_HOMEとLD_LIBRARY_PATHを確認・修正し、システムプロファイルを再読み込みしてください。
3. Oracle接続または認証の失敗
資格情報の誤り、DSN形式の不正、ネットワーク遮断が原因で接続に失敗します。ora2pg.conf内のユーザー名、パスワード、ホスト、ポート、SIDまたはサービス名を検証してください。
4. PostgreSQL SQLスクリプトのインポートエラー
ora2pgが自動変換できないOracle固有構文が原因で発生します。移行評価レポートを参照し、非対応オブジェクトを特定し手動で書き換えてください。
5. 権限エクスポートの失敗
Oracle移行用ユーザーに十分な読み取り権限が付与されていません。対象スキーマに対し適切な読み取り権限を付与し、エクスポートを再実行してください。
6. 大規模データセットでのエクスポート処理の遅延
デフォルトではシングルスレッド処理のため大きなテーブルで処理が低速になります。–parallelオプションを使用しマルチスレッドエクスポートを有効化し処理を高速化してください。
7. パーティションや高度なオブジェクトの変換不具合
一部のOracleパーティションやカスタムオブジェクトはPostgresに直接マッピングできません。ora2pg.confの設定を調整し、非対応構造を手動で修正してください。
Ora2Pgは小規模・低複雑度のOracle‑PostgreSQL移行向けの実用的なオープンソースツールですが、大規模データセット(100GB以上)やミッションクリティカルな本番環境などエンタープライズ要件では重大な制限が存在します。
より高速かつ信頼性の高い無停止移行ソリューションを求める企業向けに、Info2Softのi2Streamは代表的な異種データベースレプリケーション製品であり、Ora2Pgの課題を解消し、エンタープライズクラスのOracle‑PostgreSQL移行機能を提供します。
Ora2Pgと比較したi2Streamの主なメリット:
Ora2PgによるOracleからPostgreSQLへの移行は、小規模かつ低複雑な環境に適した選択肢です。本ガイドの手順に沿って実施することで、OracleデータベースからPostgreSQLへ基本的な移行をスムーズに実行できます。
一方、業務停止が課される環境、大規模データセットなどエンタープライズのユースケースではInfo2Softのi2Streamがより適切です。エンタープライズクラスの異種データベースレプリケーション機能により無停止移行、リアルタイム同期、自動データ検証を実現し、Ora2Pgの本質的な課題を解決し、低リスクかつ効率的な移行を実現します。
さらにi2Streamは幅広いデータベースに対応しており、Oracle、MySQL、MS SQL Serverなどの間でデータ移行を実施可能です。