新トップページへ | Tip

DB2 Express-C(9.5) をとりあえず使う

LastUpdate : 08/04/28

 DB2が機能が一部制限されるとしても、無料版が(これを、DB2 Express-Cと呼ぶらしいよ?)公開されてから、、数年経過しました。当時は、見向きもしませんでしたが、仕事でDB2を使う機会がありまして、DB2に興味を持ちました。
 そんなわけで、まぁ、とりあえず、さわってみるかー的な感じでとりあえず、やってみたことを書きます。
 DB2 Express-Cの入手には、IBMのサイトにて、簡単な会員登録(?)みたいなものが必要です(メールアドレスとか名前とかの登録)。

 windows用も、Linux用も、いろいろなプラットホーム用のものが公開されているのですが、私の環境は、DB2サーバがLinux(CentOS5.1 64Bit版)で、クライアントがWindowsVistaです。
ちなみに、IBMのホームページに導入マニュアル的なものが、きちんとあります。

IBMサイト内にLinux用のインストールガイドがあります → http://www.ibm.com/developerworks/jp/offers/db2express-c/installlin_v95/

推奨環境のディストリビューションにCentOSの名前がありません。しかし、RedHatEnterpriseLinuxの名前があるから、大丈夫かなぁ、思っていますが・・・(RedHatとSUSEとUbuntuしか推奨ディストリビューションの欄に無い。)。

インストールとか
Linuxへインストールしてみる(GUIを使用)
テスト用のDBを作成し、接続してみる
日常的な操作など
インスタンスの起動・停止(+「接続を強制的に無効にする」方法)
インスタンスの追加

Linuxへインストールしてみる(GUIを使用)

 仮想化したDB2用に作成したサーバにDB2をインストールします(私の環境の話)。ちなみに、64Bit用のものを私はLinuxへインストールします。

IBMのインストールガイド( http://www.ibm.com/developerworks/jp/offers/db2express-c/installlin_v95/ )には、GUIインストールについてしか、かかれてない様子なので(私が探しきれていないだけ??)、仕方が無いので、X-Window環境を用意しなければなりません。

なので、Linuxのインストール時点で、X-Windowのパッケージのインストールを忘れずに行います(私はついでに、GNOMEのパッケージもインストールしました)。
さらに、vnc-serverもついでに、インストールしておきます(インストール時点で選択しなくても、あとあとインストールすればいいだけですが)

vnc-serverを起動すると、最初の起動の場合、パスワードを聞かれるので、てきとーに設定します。
で、デフォルトだと、twmが立ち上がって、見た目がしょぼいので、 ~/.vnc/xstartup ファイルの内容の

twm &

となっているところを

#twm &
exec gnome-session &

という感じにして、gnomeが立ち上がるようにします。
画像のタイトルバーがlocaldomainと書かれているのは、SSHでポートフォワードさせているからです。
Linuxのサーバーに、WindowsVistaからReadVNCで接続しています。

さてはて、準備が整ったので、なにか面倒なことが起きても困るので、ガイドに沿って操作を行うことにします。

[root@db2_server ~]# ls
anaconda-ks.cfg                            Desktop      install.log.syslog
db2_linux_64_db2exc_950_LNX_x86_64.tar.gz  install.log
[root@db2_server ~]# mkdir /work
[root@db2_server ~]# mv db2_linux_64_db2exc_950_LNX_x86_64.tar.gz /work/
[root@db2_server work]#cd /work
[root@db2_server work]# tar -zxvf db2_linux_64_db2exc_950_LNX_x86_64.tar.gz

とりあえず、ダウンロードしたファイルは、自分のhomeディレクトリにある状態なので、/workのディレクトリを作成し、ファイルを移動し、解凍を行います(DB2 Express-CのLinux版64Bitのファイル名前は db2exc_950_LNX_x86_64.tar.gz だと思います。いろいろとDLしたので、わかりづらいので、私は名前を少し変更しています)。

解凍が終了したならば

[root@db2_server work]# cd exp/
[root@db2_server work]# ./db2setup

expディレクトリに移動し、この中にあるdb2_setupというスクリプトがあるので、それを実行します。
これで、以下のようなウインドウが出てくれば、「Install a Product」のところから、ウイザードに従ってインストールするだけで、OKです。

しかし・・・、立ち上がらない場合は、以下を参考にしてください(私は、最初これで、ハマりましたw)

IBMのサイトをみてみると、インストールには以下のパッケージがないとだめですよー、と書かれている。
libaio
compat-libstdc++
 libaioについては、インストールしたかどーか、記憶にないですが、標準のインストール方法(ServerとかServerGUIとかDesktop-Gnomeとかのパッケージを選択していたら、インストールされるようになっているみたいです)では、インストールされる様子です。
 また、compat-libstdc++についても、上と同じように、普通に、インストールされます。
が・・・・・・・・・・・・www
場合によっては、うまく行きません(ライブラリがないよ?wと文句をいわれる。
必要なライブラリはyumでインストールできます。
yum install libaio
yum install compat-libstdc++-33
libstdc++のインストールの際、yum install compa-libstdc++とやればOKだろう、と思っていましたが、これではDB2が求めているライブラリはインストールされないみたいです(エラーメッセージで、具体的に「〜〜のライブラリがないよ!」と文句をいってくる)。
なので、yum install compat-libstdc++-33 とやらないと、求められているライブラリははいらない様子です。

ちなみに、ウィザード中には、3つのアカウント&グループの作成を行います。
それぞれの、アカウント&グループの存在意義は

DAS : DB2 Administration Serverの略。管理サーバーのこと。リモート経由で管理作業が行えるようにするためのサーバー。その管理アカウント。
fencedユーザー : ストアドプロシージャなどを実行する際の、実行ユーザ(隔離ユーザだとか、分離ユーザだとかいうらしい)。
db2inst1 : データベースのインスタンス用のアカウント(インスタンスオーナー)。こいつで、ログインてSQLを発行してみたりなどします。

という感じの三つのアカウントを作成します。

テスト用のDBを作成し、接続してみる

 インストールが完了したならば、テスト用のDBを作成し、接続・問い合わせを行い、正常に動くかどうかを調べます。

なぜなのか、私は理由がよくわかってないのですが、VNCを経由して、コンソールで su - db2inst1 でユーザを変更して、db2fsコマンドを打っても、反応がないため(rootの権限でvncserverが実行されている状態)、いったんvncserverを停止し、db2inst1ユーザで、vncserverを起動します。そして、db2inst1ユーザになり、db2fsコマンドを実行しました。

[db2inst1@db2_server ~]$ db2fs

すると、以下のよーな、画面が現れます。

Yesを選択した状態で、「OK」ボタンを押すと、FireFoxが立ち上がります。

ここで、左のページの「Database Creation」を選択し、右のページの「Create SAMPLE Database」を押すと、

↑のような、ダイアログがでてくるので、「XML and SQL objects and data」のところのラジオボタンを選択します(クイックインストール のマニュアルに、こーしろ、と書いてあるので、とりあえず、これを選んでみました)。

そして、「OK」ボタンを押します。
そして、しばらく待つと(私の環境(Xen上のCentOS5.1にてCore2Quadの2CPU割り当ての状態)で、1分かからないぐらい)データベースの作成が完了します。


 次にデータベースへ、接続を行います。
WindowsのクライアントからLinux上のDB2へ接続を行います(IBMのサイトにて、Windows用のクライアントもDLできる)。
 WindowsVistaの場合、DB2のクライアントのツールを使う際、管理者の権限で実行してください(プログラムのアイコンを右クリックして、でてくるメニューの中の「管理者として実行」ってなってるやつ)。そうしないと、ちゃんと動作しません(全部動作しないのか、調べてませんが、とりあえず、私が普段使うツールについては、動作しませんでした)。

 とりあえず、今作ったインスタンスは、TCPで50000のポートを使うようなので、ファイヤーオールの設定をしておきます。
ちなみに、DB2のインストール後、/etc/service の中でdb2でgrepしてみると以下のような感じです。

[root@db2_server ~]# cat /etc/services | grep db2
ibm-db2         523/tcp                         # IBM-DB2
ibm-db2         523/udp                         # IBM-DB2
questdb2-lnchr  5677/tcp                        # Quest Central DB2 Launchr
questdb2-lnchr  5677/udp                        # Quest Central DB2 Launchr
db2c_db2inst1   50000/tcp
[root@db2_server ~]#

構成アシスタントで、先ほどのDBへ接続をする設定を作成したら、コマンド行プロセッサで、接続してみます(データベース名前は「SAMPLE」)。

とりあえず、こんな感じで、接続ができます。

db2 => connect to SAMPLE user db2inst1
 db2inst1 の現行パスワードを入力してください:

   データベース接続情報

 データベース・サーバー                                   = DB2/LINUXX8664 9.5.0

 SQL 許可 ID                                              = DB2INST1
 ローカル・データベース別名                               = SAMPLE

db2 =>

どんなテーブルがあるのか、調べてみます。

db2 => list tables

Table/View
                                                 Schema

                  Type  Creation time
------------------------------- --------------- ----- --------------------------

ACT                             DB2INST1        T     2008-05-06-01.21.33.126186

ADEFUSR                         DB2INST1        S     2008-05-06-01.21.35.437298

CATALOG                         DB2INST1        T     2008-05-06-01.21.43.316278

CL_SCHED                        DB2INST1        T     2008-05-06-01.21.31.400886

CUSTOMER                        DB2INST1        T     2008-05-06-01.21.42.687929

DEPARTMENT                      DB2INST1        T     2008-05-06-01.21.31.700526

DEPT                            DB2INST1        A     2008-05-06-01.21.32.088508

EMP                             DB2INST1        A     2008-05-06-01.21.32.304306

EMPACT                          DB2INST1        A     2008-05-06-01.21.33.125408

EMPLOYEE                        DB2INST1        T     2008-05-06-01.21.32.088968

EMPMDC                          DB2INST1        T     2008-05-06-01.21.36.847065

EMPPROJACT                      DB2INST1        T     2008-05-06-01.21.32.978732

EMP_ACT                         DB2INST1        A     2008-05-06-01.21.33.125859

EMP_PHOTO                       DB2INST1        T     2008-05-06-01.21.32.304663

EMP_RESUME                      DB2INST1        T     2008-05-06-01.21.32.470839

INVENTORY                       DB2INST1        T     2008-05-06-01.21.42.579775

IN_TRAY                         DB2INST1        T     2008-05-06-01.21.33.220944

ORG                             DB2INST1        T     2008-05-06-01.21.33.250811

PRODUCT                         DB2INST1        T     2008-05-06-01.21.42.191394

PRODUCTSUPPLIER                 DB2INST1        T     2008-05-06-01.21.44.044253

PROJ                            DB2INST1        A     2008-05-06-01.21.32.835405

PROJACT                         DB2INST1        T     2008-05-06-01.21.32.835810

PROJECT                         DB2INST1        T     2008-05-06-01.21.32.646744

PURCHASEORDER                   DB2INST1        T     2008-05-06-01.21.42.924017

SALES                           DB2INST1        T     2008-05-06-01.21.33.319009

STAFF                           DB2INST1        T     2008-05-06-01.21.33.282863

STAFFG                          DB2INST1        T     2008-05-06-01.21.34.822486

SUPPLIERS                       DB2INST1        T     2008-05-06-01.21.43.899739

VACT                            DB2INST1        V     2008-05-06-01.21.33.480416

VASTRDE1                        DB2INST1        V     2008-05-06-01.21.33.544637

VASTRDE2                        DB2INST1        V     2008-05-06-01.21.33.563832

VDEPMG1                         DB2INST1        V     2008-05-06-01.21.33.537050

VDEPT                           DB2INST1        V     2008-05-06-01.21.33.346952

VEMP                            DB2INST1        V     2008-05-06-01.21.33.473479

VEMPDPT1                        DB2INST1        V     2008-05-06-01.21.33.540807

VEMPLP                          DB2INST1        V     2008-05-06-01.21.33.639676

VEMPPROJACT                     DB2INST1        V     2008-05-06-01.21.33.529075

VFORPLA                         DB2INST1        V     2008-05-06-01.21.33.603292

VHDEPT                          DB2INST1        V     2008-05-06-01.21.33.462520

VPHONE                          DB2INST1        V     2008-05-06-01.21.33.635986

VPROJ                           DB2INST1        V     2008-05-06-01.21.33.476597

VPROJACT                        DB2INST1        V     2008-05-06-01.21.33.500968

VPROJRE1                        DB2INST1        V     2008-05-06-01.21.33.580013

VPSTRDE1                        DB2INST1        V     2008-05-06-01.21.33.584004

VPSTRDE2                        DB2INST1        V     2008-05-06-01.21.33.592884

VSTAFAC1                        DB2INST1        V     2008-05-06-01.21.33.628183

VSTAFAC2                        DB2INST1        V     2008-05-06-01.21.33.631802


  47 レコードが選択されました。

db2 =>

まぁ、いろいろある様子です。次はSQLを投げてみます。

db2 => select count(*) from EMP

1
-----------
         42

  1 レコードが選択されました。

db2 =>

こんな感じで、データが取得できます。

インスタンスの起動・停止

 まず、インスタンスの管理ユーザーでログインします。

起動の場合
db2 db2start
停止の場合
db2 db2stop

とします。

停止の際、以下のようなメッセージが現れた場合

[db2inst1@db2_server ~]$ db2 db2stop
SQL1025N  The database manager was not stopped because databases are still
active.
[db2inst1@db2_server ~]$

データベースに接続しているプログラムなど、すべて終了させてください。それでもだめな場合、面倒なので、こちらから接続を無くします(あくまでも、最終手段)。

[db2inst1@db2_server ~]$ db2 force applications all
DB20000I  The FORCE APPLICATION command completed successfully.
DB21024I  This command is asynchronous and may not be effective immediately.

[db2inst1@db2_server ~]$

という感じになり、再び、db2 db2stopとすれば、インスタンスは停止するハズです。

ただし、force applications all で、現在の接続を切ったとしても、接続を行っているアプリケーションが、接続がなくなったら、再接続を行うような動作をする場合、再び接続が確立してしまい、データベースを停止できない状態になってしまいます。
なので、DB側でなんとかなるものではなく、アプリケーションの停止をちゃんと行う必要があります。

インスタンスの追加

 インスタンスの追加を行います。
rootにて、db2icrtというコマンドを使用します(ただ、IBMのクイックインストールのガイドなどには、db2isetupを使うのをお勧めしています。ただし、これはGUIが必要)。

(1) Linuxのユーザを作成します(adduserとかで)。
これは、インスタンスの管理ユーザーとして使うため必要です。とりあえず、db2inst2という名前にしてみました。

(2) インスタンスを作成します

[root@db2_server ~]# /opt/ibm/db2/V9.5/instance/db2icrt -u db2fenc1 db2inst2
DBI1070I  Program db2icrt completed successfully.




[root@db2_server ~]#

 db2icrtのある場所は、デフォルトのインストール場所だと、/opt/ibm/db2/V9.5/instance/にあるようです。db2icrtコマンドの必須オプションであるfencedユーザを指定し(このdb2fenc1というユーザはインストールの際、作成されたユーザ。とりあえず、このユーザを指定してみました)、そして、その後ろは、インスタンスの管理者アカウントを指定します(ほか、いくつかオプションがありますので、IBMのサイトなどを参照してください)。

(3) 外部から接続できるようにTCPの設定をします

DB2の環境変数の設定を行います。

[db2inst2@db2_server ~]$ db2set -all
[i] DB2PROCESSORS=0,1
[g] DB2SYSTEM=db2_server.localdomain
[g] DB2INSTDEF=db2inst1
[g] DB2ADMINSERVER=dasusr1
[db2inst2@db2_server ~]$ db2set DB2COMM=TCPIP  ←DB2COMM=TCPIPを追加している
[db2inst2@db2_server ~]$ db2set -all
[i] DB2PROCESSORS=0,1
[i] DB2COMM=TCPIP
[g] DB2SYSTEM=db2_server.localdomain
[g] DB2INSTDEF=db2inst1
[g] DB2ADMINSERVER=dasusr1
[db2inst2@db2_server ~]$

上の、「(2)」で指定した、管理ユーザで、ログインし、「db2set DB2COMM=TCPIP」とコマンドをうち、設定すればOKらしい(なんでこれでいいのかは、知らないw)。
dbset -all は設定を表示させているだけです。

 そして、Linux側の設定をします。
/etc/servicesファイルの中に、今回追加したインスタンスの通信用ポートを追加します。

[root@db2_server ~]# su - db2inst2
[db2inst2@db2_server ~]$ cat /etc/services | grep db2
ibm-db2         523/tcp                         # IBM-DB2
ibm-db2         523/udp                         # IBM-DB2
questdb2-lnchr  5677/tcp                        # Quest Central DB2 Launchr
questdb2-lnchr  5677/udp                        # Quest Central DB2 Launchr
db2c_db2inst1   50000/tcp
db2c_db2inst2   50001/tcp
[db2inst2@db2_server ~]$ db2 update dbm cfg using svcename db2c_db2inst2
DB20000I  The UPDATE DATABASE MANAGER CONFIGURATION command completed
successfully.
[db2inst2@db2_server ~]$ db2 db2start
DB20000I  The DB2START command completed successfully.
[db2inst2@db2_server ~]$

db2c_db2inst1(これはDB2のインストーラが作成したもの)に、ならって、 db2c_db2inst2 50001/tcp を追加しました。
正常にインスタンスが起動することがわかったので、次にDBを作成します。

(4) データベースの作成

 データベースを作成するには、db2のコマンドを使用します。

[db2inst2@db2_server ~]$ db2 create db testDB
DB20000I  The CREATE DATABASE command completed successfully.
[db2inst2@db2_server ~]$

testDBというデータベースを作成しました。接続する際の、パスワードは何も設定していいませんが、どうやら、デフォルトで、db2inst2のログインパスワードと同じになる様子です。

(5) 外部から接続してみる

 データベースの作成まで完了したため、とりあえず、クライアントから接続してみます。

WindowsからLinux上のDB2に接続してみる
db2 => connect to testDB user db2inst2
 db2inst2 の現行パスワードを入力してください:

   データベース接続情報

 データベース・サーバー                                   = DB2/LINUXX8664 9.5.0

 SQL 許可 ID                                              = DB2INST2
 ローカル・データベース別名                               = TESTDB

db2 =>

次に、SQLでぐだぐだ・・・。

db2 => create table productTbl(pId integer primary key not null ,pName varchar(1
00),available integer)
DB20000I  SQL コマンドが正常に完了しました。
db2 => insert into productTbl(pId,pName,available) values(1,'テストの商品です',1
)
DB20000I  SQL コマンドが正常に完了しました。
db2 => select * from productTbl

PID         PNAME
                                 AVAILABLE
----------- --------------------------------------------------------------------
-------------------------------- -----------
          1 テストの商品です
                                           1

  1 レコードが選択されました。

db2 =>

という感じで、一応動く感じになりました。