Perl+DB2環境をUbuntu 12.04にPerlbrewで構築する

Perlからデータベース(RDB)に接続するには、DBIというデータベースアクセスの共通インターフェースを使用します。DBIはRDBの接続方法の差異を吸収するためのライブラリで、DB2を含む多くのデータベースに対応しています。

このエントリでは、PerlからDB2にアクセスできる環境を構築する方法を解説します。OSはUbuntu Linux 12.04 (32bit版)を使用していますので、前提としてOSの導入が必要です。PerlはUbuntuに付属するものではなく、Perlbrewでインストールを行います。これは、いくつかのメリットがあるのですが、OS標準のperlとは独立して色々なPerlやモジュールを試すことができるというのが大きなメリットだと思います。

また、UbuntuにはDB2を導入するために必須のパッケージを導入しておく必要があります。詳細は以下で紹介しているDB2インストールの情報を参照してください。

sudo apt-get install libaio1 ksh libstdc++6-4.4-dev libstdc++6-4.4-pic

DB2をインストールする

OSが準備できたらDB2を導入します。DB2のエディションは問いませんし、おそらくほとんどのバージョンで動くと思いますが、このエントリでは無料で使えるDB2 Express-Cのv10.1を使用しています。DB2 Express-Cは下記リンクからダウンロード可能です。

2023年5月13日 補足:本記事は作成が2012年のため内容が古くなっている点にご注意ください。無料版のDb2は現在ではDb2 Community Editionという名前になり、ダウンロード先も変わっています。こちらを参照してください。→ 無料で利用できる Db2 Community Edition の概要・制限・ダウンロード方法 また、インストール方法はこちらを参照してください 。→ 無料で利用できる Db2 Community Edition for Linux インストールガイド

DB2 Express-C デベロッパー・ポータル

Download DB2 Express-C

インストールは以下のクイックインストールで説明している、GUIのウィザードでステップバイステップで進める方法で実行することも可能ですし、その下のリンク(DB2、基本の「き」)で説明している応答ファイル(レスポンスファイル)を使ってGUI無しで導入することも可能です。

今回は応答ファイルを使った方法でDB2 Express-Cを導入しました。上記の記事にある方法とほとんど同じですが、ご参考までに私が使用した応答ファイルを以下に置いておきます。この後Perlから接続するためのドライバをコンパイルするので、DB2の開発ツール(ヘッダやライブラリ)の導入が必要です

今回は以下の内容で応答ファイル(db2expc.rsp)を作成して ./db2setup -r db2expc.rsp としてDB2をインストールしました。 COMP=APPLICATION_DEVELOPMENT_TOOLSを指定することで開発ツールを導入しています。GUIのセットアップでも「カスタマイズ」を選択することで、開発ツールの導入が可能です。

PROD                    = EXPRESS_C
LIC_AGREEMENT           = ACCEPT
FILE                    = /opt/ibm/db2/V10.1
INSTALL_TYPE            = CUSTOM
COMP                    = APPLICATION_DEVELOPMENT_TOOLS
COMP                    = DB2_SAMPLE_DATABASE
LANG                    = JP
INTERACTIVE             = YES

DB2をインストールした後は、インスタンスとデータベースを作成します。詳しくは上記インストール方法のリンクを参照してください。

Perl環境のインストール(Perlbrew)

PerlはOSに含まれていますが、今回はOS付属のPerlは使わずに、ソースからコンパイルしてユーザが読み書き可能なディレクトリ(~/perl5/以下)に別途Perlを導入します。これにはいくつかのメリットがあります。

  • 最新バージョンのPerlを導入できる。複数のバージョンを使い分ける事もできる
  • モジュール類も好きなバージョンが導入できる
  • ユーザが読み回アクセス可能なディレクトリに導入するため、Perl本体や、各種モジュールの導入時にroot権限が必要無い

開発の場合は色々なバージョンで試すことが必要なケースがありますので、OS付属のPerlとは別に準備するのが便利です。また通常OSに含まれるPerlは最新バージョンでは無いので、最新を試す事ができるというのもメリットですね。(執筆時、Ubuntu 12.04に付属のPerlはv5.14.2でした)

ソースをダウンロードして、configureして…というステップでPerlを導入して良いのですが、Perlbrewというスクリプトを使用すると楽に導入が可能ですので、ここではこれを使用します。Perlbrewには複数バージョンのPerlを導入して切り替える機能があるので、とても便利です。

ここではsimというユーザの環境にPerlbrewを導入しています。simはDB2のインスタンスオーナーでもあります。つまり、DB2のコマンドを発行できる環境にPerlbrewを導入しています。特にPerlBrewを導入するユーザを決めていない場合、インスタンスオーナー(一般的にはdb2inst1といったID)でこの後の作業をするのがお勧めです。ただしインスタンスオーナー以外であってもPerlからDB2に接続する環境を構築可能です。

Perlbrewを導入するには、curlコマンドでシェルスクリプトファイルを取得して実行する事が推奨されているのですが、Ubuntu 12.04にはデフォルトでcurlが入っていないので、まずはapt-getでcurlを導入します。

sim@u1204:~$ sudo apt-get install curl
[sudo] password for sim:
パッケージリストを読み込んでいます... 完了
(略)
curl (7.22.0-3ubuntu4) を設定しています ...

次にcurlを使ってシェルスクリプトファイルを取得して、bashで実行します。Perlbrewのホームページに書かれているように、curl -kL http://install.perlbrew.pl | bash と実行します。

sim@u1204:~$ curl -kL http://install.perlbrew.pl | bash
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0   315    0     0    0     0      0      0 --:--:--  0:00:01 --:--:--     0
100  1022  100  1022    0     0    527      0  0:00:01  0:00:01 --:--:--  5009

## Download the latest perlbrew

## Installing perlbrew
perlbrew is installed: ~/perl5/perlbrew/bin/perlbrew

perlbrew root (~/perl5/perlbrew) is initialized.

Append the following piece of code to the end of your ~/.bash_profile and start a
new shell, perlbrew should be up and fully functional from there:

    source ~/perl5/perlbrew/etc/bashrc

上記のように実行すると、~/perl5/以下にPerlbrew環境が準備されます。あとはメッセージに出ている、source ~/perl5/perlbrew/etc/bashrc を ~/.bashrcの最後に追記します。(メッセージには~/.bash_profileと書かれていますが、ubuntu環境では~/.bashrcが適切です)

上記のsource ~/perl5/perlbrew/etc/bashrc を実行することで環境変数等が設定されてPerlbrewが実行可能になりますので、別のコンソールを開く(もしくはログオフしてログインし直す)等して~/.bashrcを実行するか、コンソール上で直接 source ~/perl5/perlbrew/etc/bashrc を実行してPerlbrewを実行可能にしてください。Perlbrewが実行できるかどうかは、helpオプションを付けて実行してみると良いでしょう。

sim@u1204:~$ perlbrew help

availableオプションを実行すると、導入可能なPerlのバージョン一覧が表示されます。

sim@u1204:~$ perlbrew available
perl-5.17.4
perl-5.16.1
perl-5.14.2
perl-5.12.4
perl-5.10.1
perl-5.8.9
perl-5.6.2
perl5.005_04
perl5.004_05
perl5.003_07

ここでは、安定版として(執筆時点で)最新のPerl v.5.16.1を導入します。多くのケースではperlbrew install perl-5.16.1とだけ実行すれば良いようなのですが、Ubuntu 12.04の場合、-Dusethreadsを付けてスレッドを使うように指定しないとうまく構築できませんでしたので、以下のようにしてインストールします。(もし、-Dusethreadsを付けてもエラーが出る場合は、 -Dplibpth=/usr/lib/i386-linux-gnu 同時に指定するとうまくいくかもしれません。これは32bitの場合のパスで、64bit環境で、-Dusethreads -Dplibpth=/usr/lib/x86_64-linux-gnu を指定します)

perlのソースコード一式をインターネット経由で取得してコンパイルするため、インターネット接続が必要です。また、コンパイル(とテスト)には環境によりますが、ある程度の時間が掛かります。私の環境では以下のように19分掛かりました。

sim@u1204:~$ time perlbrew install perl-5.16.1 -Dusethreads
Installing /home/sim/perl5/perlbrew/build/perl-5.16.1 into ~/perl5/perlbrew/perls/perl-5.16.1

This could take a while. You can run the following command on another shell to track the status:

  tail -f ~/perl5/perlbrew/build.perl-5.16.1.log

perl-5.16.1 is successfully installed.

real    19m25.541s
user    4m8.796s
sys     9m14.195s

無事にインストールできたので、インストールしたPerlを使えるかどうか試してみます。perlbrewコマンドのswitchオプションで使用したいPerlを指定すると、そのバージョンのPerlに切り替えて使用できるようになります。以下では切り替え後にperl -vでバージョンを確認していますが、v5.16.1が使用できるようになっているのが分かります。

sim@u1204:~$ perlbrew switch perl-5.16.1
sim@u1204:~$ perl -v

This is perl 5, version 16, subversion 1 (v5.16.1) built for i686-linux-thread-multi

Copyright 1987-2012, 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.
(略)

このswitchオプションを使用すると、その後別のターミナルにログインしてもswitchで選択したPerlが使用できるようになっています(OSをシャットダウンしてもswitchで切り替えた内容は有効です)。Perlbrewで複数のperlを導入していて、一時的に現在のコンソールでだけPerlを切り替えたい場合は、useオプションを使用します。

cpanmのインストール

Perlのモジュール(拡張機能)は、CPAN(Comprehensive Perl Archive Network)という仕組みで管理されています。cpanmはそのCPAN経由でモジュールを導入するためのコマンドで、まずはこのcpanmをインストールします。perlbrew環境では以下のようにperlbrew install-cpanmとするだけで簡単に導入できます。

sim@u1204:~$ perlbrew install-cpanm
cpanm is installed to
/home/sim/perl5/perlbrew/bin/cpanm

Perl DBIのインストール

Perl DBIは、perlから各種データベースにアクセスするための共通のインターフェースです。DBIはインターフェースを提供するだけですので、実際のデータベースへのアクセス部分はDBDと呼ばれるモジュールが必要になりますが、まずDBIを導入します。先ほどcpanmを導入していますので、cpanmを使って簡単にDBIを導入できます。以下のようにcpanmにモジュール名の引数を付けて実行するとソースの取得とコンパイルが自動的に行われます。

sim@u1204:~$ cpanm DBI
--> Working on DBI
Fetching http://www.cpan.org/authors/id/T/TI/TIMB/DBI-1.622.tar.gz ... OK
Configuring DBI-1.622 ... OK
Building and testing DBI-1.622 ... OK
Successfully installed DBI-1.622
1 distribution installed

DBIのバージョンを指定していないので、執筆時点で最新のDBI v1.622がインストールされました。

DBD::DB2のインストール

DBD::DB2はPerl DBI経由でDB2にアクセスするためのモジュールです。これも同様にcpanmで導入しますが、先に環境変数の設定が必要です。(コンパイル時にDB2のクライアントライブラリの位置などを指定するため)

まず、インスタンスオーナー以外で作業をしている場合は、接続したいインスタンスオーナーの~ユーザ名/sqllib/db2profileをsouceで取り込みます。例えば以下のように実行します。

source ~db2inst1/sqllib/db2profile

このようにすることで、そのインスタンスに接続するために必要な環境変数が設定されます。(インスタンスオーナーで作業している場合は上記は不要です)

次にDBD::DB2をコンパイルする際に使用するDB2クライアントライブラリの位置を環境変数DB2LIBに設定します。一般的には以下のパスです。(64bit環境の場合は、/opt/ibm/db2/V10.1/lib64/を指定してください)

sim@u1204:~$ export DB2LIB=/opt/ibm/db2/V10.1/lib32/

これで準備が出来ましたので、あとはcpanmでDBD::DB2を導入します。

sim@u1204:~$ cpanm DBD::DB2
--> Working on DBD::DB2
Fetching http://www.cpan.org/authors/id/I/IB/IBMTORDB2/DBD-DB2-1.84.tar.gz ... OK
Configuring DBD-DB2-1.84 ... OK
Building and testing DBD-DB2-1.84 ... OK
Successfully installed DBD-DB2-1.84
1 distribution installed

執筆時点での最新版であるDBD::DB2 v1.84が導入されて、PerlからDB2に接続する環境が整いました。

テストプログラムの実行

導入が完了したので、簡単なテストプログラムを実行してみましょう。以下のようなスクリプトを作成して、testdb2.plという名前で保存します。これはSAMPLEデータベースの中にあるデータをクエリー(SELECT)して画面に表示するプログラムです。DB2導入時にSAMPLEデータベースを作成していない場合は、(DB2インスタンスオーナーで)db2samplコマンドを実行することで作成できます。

#!/usr/bin/env perl
use DBI;
use strict;

#DBに接続。IDとパスワードを省略するとログインユーザで接続を行う
my $dbh = DBI->connect("DBI:DB2:SAMPLE","","")
  or die "SAMPLE DBに接続できません : $DBI::errstr";

#SQLを実行
my $sth = $dbh->prepare
  ("SELECT DEPTNAME,COUNT(*) FROM EMPLOYEE E,DEPT D"
  . " WHERE E.WORKDEPT=D.DEPTNO GROUP BY DEPTNAME");
$sth->execute();

#アンサーセットを取得して表示
my ($deptname,$count);

while (($deptname,$count) = $sth->fetchrow())
{
  printf "%30s | %4d\n",$deptname,$count;
}

$sth->finish();
$dbh->disconnect();

保存したファイルをperlで実行するとDB2から取得したデータが画面に表示されます。なおDB2インスタンスオーナー以外で実行している場合は、ソースコードの中でIDとパスワードを指定する必要があります。スクリプト内のDBI->connectの第2引数にID、第3引数にパスワードを指定するように修正してから実行してください。

正しく設定できている場合、以下のように表示されます。これで動作確認ができました。

sim@u1204:~$ perl testdb2.pl
        ADMINISTRATION SYSTEMS | 7
            INFORMATION CENTER | 4
         MANUFACTURING SYSTEMS | 11
                    OPERATIONS | 7
                      PLANNING | 1
              SOFTWARE SUPPORT | 6
  SPIFFY COMPUTER SERVICE DIV. | 5
              SUPPORT SERVICES | 1

参考情報

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です