はじめに
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.zip
instantclient-sdk-windows.x64-19.18.0.0.0dbru.zip
instantclient-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_BOOLEAN
number(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