なぜか Windows 環境で Ora2Pg を使わなければならなくなった場合の環境構築方法


はじめに

Ora2Pg は Oracle から PostgreSQL へのデータベース移行を行うオープンなツールです。

Ora2Pg を使うには Perl が必要で、Windows では環境構築が意外と面倒です。 Perl をこのためだけにインストールしたくもないので、インストール不要なポータブルな Ora2Pg 実行環境を作ります。

なお、Docker が使えれば、Ora2Pg の Docker イメージが公開されているので、これを使えば簡単です。以下を参照してください。

blog1.mammb.com


ショート・バージョン

以下の5つのファイルをダウンロードして ora2pg のような任意ディレクトリにまとめて解凍する。

以下のようなディレクトリレイアウトになる。

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.distora2pg\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