
はじめに
Ora2Pg は Oracle から PostgreSQL へのデータベース移行を行うオープンなツールです。
Ora2Pg を使うには Perl が必要で、Windows では環境構築が意外と面倒です。 Perl をこのためだけにインストールしたくもないので、インストール不要なポータブルな Ora2Pg 実行環境を作ります。
なお、Docker が使えれば、Ora2Pg の Docker イメージが公開されているので、これを使えば簡単です。以下を参照してください。
ショート・バージョン
以下の5つのファイルをダウンロードして ora2pg のような任意ディレクトリにまとめて解凍する。
- strawberry-perl-portable(バージョンは5.36) ダウンロードページ
- oracle instantclient Basicパッケージ(バージョンは19.18) ダウンロードページ
- oracle instantclient SDK パッケージ(バージョンは19.18) ダウンロードページ
- oracle instantclient SQL*Plus パッケージ(バージョンは19.18) ダウンロードページ
- Ora2Pg (バージョンは24.3) リリースページ
以下のようなディレクトリレイアウトになる。
xxx\ora2pg\
strawberry-perl\
instantclient_19_18\
ora2pg-24.3\
strawberry-perl の中の portableshell.bat を実行してターミナルを起動して ora2pg をビルドする。
cd ../ora2pg-24.3 perl Makefile.PL gmake && gmake install
生成された ora2pg の設定ファイル類をカレントディレクトリに移動して不要ファイル類を削除する。
cd .. move C:\ora2pg\* . rmdir C:\ora2pg rmdir /s /q ora2pg-24.3
Oracle データベースに接続するために DBD::Oracle モジュールを導入する(instantclient の環境変数設定)。
set LD_LIBRARY_PATH=c:\<xxx>\ora2pg\instantclient_19_18 set ORACLE_HOME=c:\<xxx>\ora2pg\instantclient_19_18 cpan -T install DBD::Oracle
起動用のバッチファイル ora2pg\ora2pgshell.bat を作成する。
@echo off if not "%1" == "/SETENV" setlocal set PATH=%~dp0strawberry-perl\perl\site\bin;%~dp0strawberry-perl\perl\bin;%~dp0strawberry-perl\c\bin;%PATH% set PATH=%~dp0instantclient_19_18;%PATH% set LD_LIBRARY_PATH=%~dp0instantclient_19_18 set ORACLE_HOME=%~dp0instantclient_19_18 set TERM= set PERL_JSON_BACKEND= set PERL_YAML_BACKEND= set PERL5LIB= set PERL5OPT= set PERL_MM_OPT= set PERL_MB_OPT= if "%1" == "/SETENV" goto END if "%1" == "" goto INTERACTIVE REM For non-interactive invocations of this batch file, run Perl with all REM provided argument and return its exit code. Clear the ERRORLEVEL REM variable in our local environment to ensure our "exit /b" statement REM returns the error level from Perl even if there is already an ERRORLEVEL REM variable in the environment: REM https://devblogs.microsoft.com/oldnewthing/20080926-00 set ERRORLEVEL= "%~dp0strawberry-perl\perl\bin\perl.exe" %* exit /b %ERRORLEVEL% :INTERACTIVE echo ---------------------------------------------- echo Welcome to Strawberry Perl Portable Edition! echo * URL - http://www.strawberryperl.com/ echo * see README.TXT for more info echo ---------------------------------------------- perl -MConfig -e "printf("""Perl executable: %%s\nPerl version : %%vd / $Config{archname}\n\n""", $^X, $^V)" 2>nul if ERRORLEVEL==1 echo FATAL ERROR: 'perl' does not work; check if your strawberry pack is complete! cmd /K :ENDLOCAL endlocal :END
作成した ora2pg ディレクトリをまるごと圧縮して、別の環境に持っていけば、そのまま Ora2Pg を使うことができます。
利用の際は、ora2pg\ora2pg.conf.dist を ora2pg\ora2pg.conf にコピーして以下の Oracle 接続情報を設定し、ora2pg\ora2pgshell.bat からターミナルを起動します。
# Set the Oracle home directory ORACLE_HOME /usr/local/oracle/10g # Set Oracle database connection (datasource, user, password) ORACLE_DSN dbi:Oracle:host=mydb.mydom.fr;sid=SIDNAME;port=1521 ORACLE_USER system ORACLE_PWD manager
以上の流れになります。以下は少し細かい説明を加えた手順になります。
Perl 環境の作成
Perl の実行環境は、環境依存の無い Strawberry Perl Portable 版を使います。
5.38 や 5.40 系の場合に、続く手順中でエラーが発生するため 5.36 を利用します。
strawberryperl から strawberry-perl-5.36.3.1-64bit-portable.zip をダウンロードして strawberry-perl ディレクトリ配下に解凍します。
mkdir ora2pg && cd ora2pg mkdir strawberry-perl
strawberry-perl\portableshell.bat を実行するとコマンドラインが起動します。
以下でバージョン確認をしておきましょう。
> perl --version This is perl 5, version 36, subversion 3 (v5.36.3) built for MSWin32-x64-multi-thread Copyright 1987-2023, Larry Wall Perl may be copied only under the terms of either the Artistic License or the GNU General Public License, which may be found in the Perl 5 source kit. Complete documentation for Perl, including FAQ lists, should be found on this system using "man perl" or "perldoc perl". If you have access to the Internet, point your browser at https://www.perl.org/, the Perl Home Page.
Oracle instantclient
Ora2Pg から Oracle データベースに接続するために、instantclient が必要です。
Microsoft Windows(x64)64ビット用Oracle Instant ClienのダウンロードからBasicパッケージ・SDK パッケージ・SQL*Plus パッケージをダウンロードして ora2pg ディレクトリに解凍します。
21c の場合、後に導入する DBD::Oracle でバージョン特定できないようだったので、ここでは以下をダウンロードしました。
instantclient-basic-windows.x64-19.18.0.0.0dbru.zipinstantclient-sdk-windows.x64-19.18.0.0.0dbru.zipinstantclient-sqlplus-windows.x64-19.18.0.0.0dbru.zip
それぞれのアーカイブに instantclient_19_18 ディレクトリを含んでいるので、そのまま上書きで解凍操作をすれば良いです。
なお、Oracle instantclient を利用するには Microsoft Visual C++ 2015-2022 Redistributable が必要になります。たいていインストール済みのハズですが、未インストールの場合は Microsoft Visual C++ Redistributable latest supported downloads からダウンロードしてインストールします。
Ora2Pg
Github のリリースページから Ora2Pg のソースファイルをダウンロードします。
ここでは ora2pg-24.3.zip を解凍して ora2pg ディレクトリに解凍します。
strawberry perl の portableshell.bat からターミナルを起動して以下でモジュールをインストールします。
cd C:\Users\<xxx>\ora2pg\ora2pg-24.3\ perl Makefile.PL gmake && gmake install
以下のような出力とともに strawberry perl 環境へのインストールが完了します。
> perl Makefile.PL Checking if your kit is complete... Looks good Generating a gmake-style Makefile Writing Makefile for Ora2Pg Writing MYMETA.yml and MYMETA.json Done... ------------------------------------------------------------------------------ Please read documentation at http://ora2pg.darold.net/ before asking for help ------------------------------------------------------------------------------ Now type: dmake && dmake install > gmake && gmake install cp lib/Ora2Pg/MySQL.pm blib\lib\Ora2Pg\MySQL.pm cp lib/Ora2Pg/PLSQL.pm blib\lib\Ora2Pg\PLSQL.pm cp lib/Ora2Pg.pm blib\lib\Ora2Pg.pm cp lib/Ora2Pg/GEOM.pm blib\lib\Ora2Pg\GEOM.pm cp lib/Ora2Pg/MSSQL.pm blib\lib\Ora2Pg\MSSQL.pm cp lib/Ora2Pg/Oracle.pm blib\lib\Ora2Pg\Oracle.pm "C:\Users\xxx\ora2pg\strawberry-perl-5.36.3.1-64bit-portable\perl\bin\perl.exe" -MExtUtils::Command -e cp -- scripts/ora2pg blib\script\ora2pg pl2bat.bat blib\script\ora2pg "C:\Users\xxx\ora2pg\strawberry-perl-5.36.3.1-64bit-portable\perl\bin\perl.exe" -MExtUtils::Command -e cp -- scripts/ora2pg_scanner blib\script\ora2pg_scanner pl2bat.bat blib\script\ora2pg_scanner Installing C:\Users\xxx\ora2pg\strawberry-perl-5.36.3.1-64bit-portable\perl\site\lib\Ora2Pg.pm Installing C:\Users\xxx\ora2pg\strawberry-perl-5.36.3.1-64bit-portable\perl\site\lib\Ora2Pg\GEOM.pm Installing C:\Users\xxx\ora2pg\strawberry-perl-5.36.3.1-64bit-portable\perl\site\lib\Ora2Pg\MSSQL.pm Installing C:\Users\xxx\ora2pg\strawberry-perl-5.36.3.1-64bit-portable\perl\site\lib\Ora2Pg\MySQL.pm Installing C:\Users\xxx\ora2pg\strawberry-perl-5.36.3.1-64bit-portable\perl\site\lib\Ora2Pg\Oracle.pm Installing C:\Users\xxx\ora2pg\strawberry-perl-5.36.3.1-64bit-portable\perl\site\lib\Ora2Pg\PLSQL.pm Installing C:\Users\xxx\ora2pg\strawberry-perl-5.36.3.1-64bit-portable\perl\site\bin\ora2pg Installing C:\Users\xxx\ora2pg\strawberry-perl-5.36.3.1-64bit-portable\perl\site\bin\ora2pg.bat Installing C:\Users\xxx\ora2pg\strawberry-perl-5.36.3.1-64bit-portable\perl\site\bin\ora2pg_scanner Installing C:\Users\xxx\ora2pg\strawberry-perl-5.36.3.1-64bit-portable\perl\site\bin\ora2pg_scanner.bat "Installing default configuration file (ora2pg.conf.dist) to C:\ora2pg" Appending installation info to C:\Users\xxx\ora2pg\strawberry-perl-5.36.3.1-64bit-portable\perl\lib/perllocal.pod
以下でバージョン確認をしておきます。
> ora2pg --version Ora2Pg v24.3
ログにあるように C:\ora2pg にデフォルトの設定ファイルなどが作成されます。
作業中の ora2pgディレクトリに移動し、ついでに ora2pg のソースも消しておきます。
move C:\ora2pg\* C:\Users\<xxx>\ora2pg rmdir C:\ora2pg rmdir /s /q C:\Users\<xxx>\ora2pg\ora2pg-24.3
ここまでで、以下のようなディレクトリ構成になります。
C:\Users\<xxx>\ora2pg
strawberry-perl\
instantclient_19_18\
changelog
INSTALL
ora2pg.conf.dist
README
DBD::Oracle
Ora2Pg で Oracle データベースに接続するために DBD::Oracle が必要です(なお、DBD::Pg のコンパイル済みドライバーは Strawberry Perl に予め含まれています)。
Oracle instantclient の環境変数を設定し、以下でインストールします。
set LD_LIBRARY_PATH=c:\Users\<xxx>\ora2pg\instantclient_19_18 set ORACLE_HOME=c:\Users\<xxx>\ora2pg\instantclient_19_18 cpan -T install DBD::Oracle
cpan の -T オプションでテストをスキップしています(テストでデータベース接続するのでエラーになる模様のため)。
起動用のバッチファイル作成
Ora2Pg を利用する際のパスや環境変数の設定を行うバッチファイルを用意しておきます。
ora2pg\ora2pgshell.bat を以下のように作成します。
@echo off if not "%1" == "/SETENV" setlocal set PATH=%~dp0strawberry-perl\perl\site\bin;%~dp0strawberry-perl\perl\bin;%~dp0strawberry-perl\c\bin;%PATH% set PATH=%~dp0instantclient_19_18;%PATH% set LD_LIBRARY_PATH=%~dp0instantclient_19_18 set ORACLE_HOME=%~dp0instantclient_19_18 set TERM= set PERL_JSON_BACKEND= set PERL_YAML_BACKEND= set PERL5LIB= set PERL5OPT= set PERL_MM_OPT= set PERL_MB_OPT= if "%1" == "/SETENV" goto END if "%1" == "" goto INTERACTIVE REM For non-interactive invocations of this batch file, run Perl with all REM provided argument and return its exit code. Clear the ERRORLEVEL REM variable in our local environment to ensure our "exit /b" statement REM returns the error level from Perl even if there is already an ERRORLEVEL REM variable in the environment: REM https://devblogs.microsoft.com/oldnewthing/20080926-00 set ERRORLEVEL= "%~dp0strawberry-perl\perl\bin\perl.exe" %* exit /b %ERRORLEVEL% :INTERACTIVE echo ---------------------------------------------- echo Welcome to Strawberry Perl Portable Edition! echo * URL - http://www.strawberryperl.com/ echo * see README.TXT for more info echo ---------------------------------------------- perl -MConfig -e "printf("""Perl executable: %%s\nPerl version : %%vd / $Config{archname}\n\n""", $^X, $^V)" 2>nul if ERRORLEVEL==1 echo FATAL ERROR: 'perl' does not work; check if your strawberry pack is complete! cmd /K :ENDLOCAL endlocal :END
ora2pg\ora2pgshell.bat から起動して Ora2Pg を使うことができます。

ora2pg ディレクトリは以下のような構成になります。
このディレクトリをまるごと圧縮して、別の環境に持っていけば、そのまま Ora2Pg を使うことができます。

Ora2Pg の実行
Ora2Pg はコマンドライン引数で設定を行いますが、数が多くなるので設定ファイルを使用するのが良いでしょう。
ひな形は ora2pg\ora2pg.conf.dist となるので、これを ora2pg\ora2pg.conf としてコピーして編集します。
以下のディレクティブで接続設定を行います。
# Set the Oracle home directory ORACLE_HOME c:\Users\<xxx>\ora2pg\instantclient_19_18 # Set Oracle database connection (datasource, user, password) ORACLE_DSN dbi:Oracle:host=mydb.mydom.fr;sid=SIDNAME;port=1521 ORACLE_USER system ORACLE_PWD manager
その他、大量の設定項目があります。よく使うのは以下でしょうか。
SCHEMA対象スキーマの指定FILE_PER_TABLEテーブルデータのエクスポート時にテーブル別にファイルを分けるOUTPUT_DIR出力時の基準ディレクトリを指定REPLACE_AS_BOOLEANnumber(1,0)やchar(1)の型をブール値に変換する指定
設定ファイルができれば、以下でテーブル定義のエクスポートができます。
ora2pg -t TABLE -c ora2pg.conf -b data/tables
以下でテーブルデータのエクスポートができます。
ora2pg -t COPY -c ora2pg.conf -b data
-t は、設定ファイルでは TYPE ディレクティブで、以下のように多くの選択肢があります。
# Type of export. Values can be the following keyword: # TABLE Export tables, constraints, indexes, ... # PACKAGE Export packages # INSERT Export data from table as INSERT statement # COPY Export data from table as COPY statement # VIEW Export views # GRANT Export grants # SEQUENCE Export sequences # TRIGGER Export triggers # FUNCTION Export functions # PROCEDURE Export procedures # TABLESPACE Export tablespace (PostgreSQL >= 8 only) # TYPE Export user defined Oracle types # PARTITION Export range or list partition (PostgreSQL >= v8.4) # FDW Export table as foreign data wrapper tables # MVIEW Export materialized view as snapshot refresh view # QUERY Convert Oracle SQL queries from a file. # KETTLE Generate XML ktr template files to be used by Kettle. # DBLINK Generate oracle foreign data wrapper server to use as dblink. # SYNONYM Export Oracle's synonyms as views on other schema's objects. # DIRECTORY Export Oracle's directories as external_file extension objects. # LOAD Dispatch a list of queries over multiple PostgreSQl connections. # TEST perform a diff between Oracle and PostgreSQL database. # TEST_COUNT perform only a row count between Oracle and PostgreSQL tables. # TEST_VIEW perform a count on both side of number of rows returned by views # TEST_DATA perform data validation check on rows at both sides. # SEQUENCE_VALUES export DDL to set the last values of sequences TYPE TABLE
![[改訂3版]内部構造から学ぶPostgreSQL―設計・運用計画の鉄則 Software Design plus [改訂3版]内部構造から学ぶPostgreSQL―設計・運用計画の鉄則 Software Design plus](https://m.media-amazon.com/images/I/51viS42F0HL._SL500_.jpg)