DB2 on Mac for DBFlute

DBFluteでのDB2サポートをより強化するために、
最前線戦闘用の MacBook Air (Lion) にDB2を
インストールしました。

今までは Leapard 上の VMWare2 の WindowsXPDB2環境にてテストを行っていたのですが、
やはり「遅い、手軽じゃない」というところで、
ちょっと距離が遠かったのですが、Macで動けばテストも楽チン。

さて、いきなり結論から言うと、苦労しました、でも、できました。
ただ、この苦労というのは自分がDB2に慣れてないからかもですね。
自分のような目的でインストールする人は珍しいかもしれませんので。

MacDB2をインストールするような方は、普段も業務でもDB2に
触れ合う機会が多いのではないかと勝手に想像しているのですが、
自分はなかなかそういう機会がなかったので。
そんな状態で、いきなり DB2 on Mac ! (無謀!?)
Mac DB2」でぐぐったり、「インストールマニュアルっぽいPDF」
を参考に、インストールの概要をまとめてみました。

o コマンドラインGUIでの二種類のインストールがある
o rootユーザーと通常ユーザーでの二種類のインストールがある
o 事前に、/etc/sysctl.conf を設定する必要がある (by root)
o 事前に、otoolコマンドが利用可能である必要がある (Xcode)

そして、これは実体験からの恐らくこういうことかな?ってポイント。

o DB2管理専用のOSユーザーが必要!?
o rootユーザーでのインストールが推奨!?
o アンインストールバッチは全く動かない!?
まずは、事前準備。

「インストールマニュアルっぽいPDF」の通りに、
「/etc/sysctl.conf」を修正。
このファイルはroot権限じゃないと編集不可。
「$ sudo vi /etc/sysctl.conf」って感じで編集。

引用:
kern.sysv.shmmax=1073741824
kern.sysv.shmmin=1
kern.sysv.shmmni=4096
kern.sysv.shmseg=32
kern.sysv.shmall=1179648
kern.maxfilesperproc=65536
kern.maxfiles=65536

そして、otoolコマンド。
ターミナルで「$ otool ...」と叩けるように。
DB2インストーラーが利用するので必要です。
Xcodeのインストールが必要という情報を見かけたのですが、
Xcodeのダウンロードページで、Xcodeのコマンドだけを
ダウンロードができたので、それだけをインストール。

DB2管理用のMacOSユーザー「db2inst1」を作成。
管理者権限ではありません。
なんかそういう名前をつけてる人がいたので真似。
(名前はなんでもいいはず)
そして、ダウンロードしてインストール。

もちろん、ダウンロードサイトはこちらのブログから辿る辿る。

// 無料のDB2 Express-C for Mac OS Xが正式にリリース!
http://db2.jugem.cc/?eid=2464

「db2exc_952_MAC_x86_64.tar.gz」を解凍して、
expディレクトリ配下にインストールに関するファイルがあります。

o db2_deinstall // スクリプトでのアンインストール
o db2_install   // スクリプトでのインストール
o db2setup      // GUIでのインストール

「$ sudo sh db2_install」と叩けばスクリプトでのrootインストール。
sudoなしで叩けばスクリプトでの通常ユーザーインストール。

「$ sudo sh db2setup」と叩けばGUIによるrootインストール。
Finder から起動すれば、GUIによる通常ユーザーインストール。
(Mac上にJava6がインストールされている必要あり)

自分が最終的にうまくDB2が動かすことができたのは、
GUIでのrootインストール。

DASユーザーには、ログインしている管理者権限のあるOSユーザー。
インストールの過程でDB2インスタンスを作ることができるので、
インスタンスユーザーは作成したOSユーザー「db2inst1」を。

【追記: 2013/08/11】
ここら辺でMacBookを再起動。sysctl.conf が反映されるように!?
でないとDB2コマンドで、SQL1032NやSQL1220Nあたりのエラーが...
(もっと前のタイミングで再起動してもいいのかもだけど)

終わった後に「$ su db2inst1」でDB2管理ユーザーに化けて、
「$ . ~/sqllib/db2profile」と bash 用の環境セットアップを
叩いて「$ db2」コマンドを叩けば、接続できました。
(db2profile を叩くことでDB2関連のコマンドが利用可能に)
そして、DB2コマンドライン上にてデータベースを作成。

create database dfexdb using codeset UTF-8 territory JP

そのDB2管理ユーザーのまま「$ db2start」とすることでDB2起動。
DBFluteからポート番号「50002」で接続できました。

【追記: 2013/08/11】
新しいMacBook(Mountain Lion)でやったら、
GUIのrootインストールで 50001 になりました。

【追記: 2013/08/11】
新しいMacBook(Mountain Lion)でやったら、
ReplaceSchemaの実行で SQLSTATE=57011 が発生。
でも、三回目の実行でうまくいきました...!?!?!?
とはいえ、その後も続くので、
db2 get db cfg for DFEXDB
で確認。(DB2の色々なコンフィグ値が見られる)
そして、(LOGFILSIZ) = 1024 となっていた。
増やしても問題は解決しなかった...

【追記: 2013/08/12】
その後、SQLSTATE じゃなくて SQLCODE の方で
調べていったら、バッファープールの不足っぽい。
今回は SQLCODE=-1218 でしたが、
db2 ? SQL1218
という感じでコマンドで調べられるようです。
(したら、SQLSTATEはあまり意味ない!?)

// バッファープール、大きくしていますか?
http://db2.jugem.cc/?eid=143

を参考に、
db2 "SELECT char(bpname,20) bpname ,pagesize,npages FROM SYSCAT.BUFFERPOOLS"
で確認できた。NPAGES が -2 になっていた。
db2 "ALTER BUFFERPOOL ibmdefaultbp SIZE 10000"
で増やしたら、ReplaceSchema してもOKになった。
(特に再起動もせず)
でも、前のMacBookも -2 なんだけどなぁ...

【追記: 2013/08/12 続き】
STMM (セルフ・チューニング・メモリー・マネージャー)
という機能がDB2にはあるらしく、
cd ~/sqllib/db2dump
db2diag -g "message:=Altering bufferpool" db2diag.log
したら、インストールした直後の時間と思われるログが、
前のMacは :: From: "1000" To: "65013"
今のMacは :: From: "1000" To: "174057"
と、STMMは動いてる!? デカ過ぎ!?
というかこの値は...何、NPAGES ???
めっちゃ失敗もしました。

otoolコマンドが「絶対に」必要という情報は見つからなかったので、
(どうやら必要そう、みたいな記事はありましたが...)
Xcodeをインストールするのがいやだったので、無視して突っ込みました。
すると、コマンドラインインストールにて、
「sh: otool: command not found」というエラーが出まくり。
インストールした後も、あるはずのディレクトリがないとかで、
うまく動作しなかったので、入れなきゃだめかと...

で、アンインストール...
db2_deinstallスクリプトを叩いてみたのですが、
「dyld: Library not loaded:
 /wsdb/db2_v95fp2/darwin64/v080811/INST/lib/libdb2locale.dylib」
...うーん、アンインストールできない
これは、otoolを入れた後も前も、そしてDB2が正常に動いている今も、
変わらずこのエラーで全く動作しません。Why?
もう、「rm」コマンドでDB2ディレクトリを豪快に削除。
インストール何度も失敗しては「rm」コマンドで削除。

DB2専用のOSユーザーを作るのがいやだったので、
ログインしているユーザーをそのままインスタンスオーナーに、
と思って、ユーザーを作らずにやろうとしたのですが、
GUIのインストールで「DASユーザー」を求められて、
DASユーザーってよくわからないがログインユーザーにして、
インスタンスオーナーも同じユーザーにしてみたら、
「"AWT-EventQueue-0" java.lang.NullPointerException」
ひー、ごめんなさい。

で、ちょっとあれこれ試行錯誤してたのと、
インストール直後に別件で忙しくしてしまったので、
試行錯誤の足跡がちょっとあやふやになってしまいました。

例えば、通常ユーザーでインストールうまくいったと思ったら、
DB2コマンドがうんともすんとも言わず帰ってこないとか...
スクリプトでのインストールだと...だっけかな...!?
DB2起動しても接続できないし落とすこともできない...!?

まあ細かく色々失敗してたのですが、
たぶん何かが間違ってたんだろうけど、
記憶が辿れずうまく文章にまとまらない...(><
とにかく、

o DB2管理専用のOSユーザーは作る
o otoolコマンドはインストールする
o /etc/sysctl.conf を設定する
o rootユーザーでインストールする

とすることで、なんとかDB2動いたという感じです。
最初からこうしていれば苦労しなかったかな。
まあ、根本的にDB2に詳しくないことが災いをしました。
今でも、よくわからないところあるので勉強しないとですね。

DASユーザーって何?
(インスタンスオーナーとの棲み分けは?)

db2inst1ユーザーの「$HOME/sqllib」と
「/opt/IBM/db2/V9.5」配下が似たような感じなんだけど、
その違いは?

「create database」で「on 'パス'」を省略したら、
どこにデータって配置されるの?
(そもそも create database のオプション大丈夫かな...)

とかとか、色々ありまくりで不安ですが、
まあ徐々にですね...
ちなみに、GUI。コンソールのログは文字化けぇー。
(エラーダイアログのメッセージも文字化けぇー)
「/tmp」のログファイル(db2setup.logなど)は大丈夫なので、
恐らく「MacのJava6のデフォルトエンコーディングSJIS」
であることの影響かなと。動作に問題はないようなので、
インストールの情報はターミナルから/tmpでviewコマンド。

あと、インストールの形式や権限次第で、
ポート番号が変わるようです(ログを見る限り)。
GUIのrootインストールだと 50002、
GUIの通常ユーザーインストールだと 48518、
スクリプトのどっちかだと 48409、とか...
他のDBMSだとデフォルトの固定のポートってあるけど、
DB2はわりとその辺は変動するのかな!?

【追記: 2013/08/11】
新しいMacBook(Mountain Lion)でやったら、
GUIのrootインストールで 50001 になりました。
まあ、とにもかくにもDBFluteの
「dbflute-db2-example」プロジェクト、
Macの上でしっかり動いてます!

DB接続情報ファイルにOSユーザーのパスワード書いて
世に公開したくないので、うまーく SVN-Ignore の
外だしファイルに出せるようにしました。
人によってポート番号も変わるかもなので、
そこも切り替えられるように。

DBFluteのExampleについてのページ:
DBFlute Example - データベース(DBMS)