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しか推奨ディストリビューションの欄に無い。)。
仮想化した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を作成し、接続・問い合わせを行い、正常に動くかどうかを調べます。
なぜなのか、私は理由がよくわかってないのですが、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 => |
こんな感じで、データが取得できます。
まず、インスタンスの管理ユーザーでログインします。
とします。
停止の際、以下のようなメッセージが現れた場合
[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 => |
という感じで、一応動く感じになりました。