takt@Wiki

DB2

最終更新:

匿名ユーザー

- view
メンバー限定 登録/ログイン

DBのカタログ

#catalog tcpip node HOST_NAME remote 192.168.0.159 server 50000;
#catalog db LOCALDB at node NODE_NAME;
#connect to LOCALDB user USER using PASS;

EXPORT/INPORT

  • export
#cd EXPORT_FILE_PATH
#db2move LOCALDB export -u USER -p PASS
  • import
#db2 -tvf INPORT_FILE.DDL
#db2move LOCALDB import -u USER -p PASS

DB2の接続を強制切断

#db2 force application ( 41408, 55458 )
                     application-handle

DBバックアップ/リストア

  • バックアップ
#db2 stop (force)
#db2 start dbm
#db2 backup db LOCALDB to FILE_PATH
  • リストア
#db2 stop (force)
#db2 start dbm
#db2 restore db LOCALDB from FILE_PATH

Cygwin環境で、DB2 9のコマンドを使う方法

Windows上のCygwin環境から直接DB2コマンドを実行してもうまく実行できません。それはDB2のコマンドを実行するために必要な環境変数の、DB2CLPとDB2PATHが設定されていないからです。

DB2PATHの方は、DB2を導入したディレクトリなので、SQLLIB¥の在るディレクトリを指定すれば良いのですが、DB2CLPの方はクライアントを区別するための値が入る変数で、何を指定すれば良いか分からずにいました。

  • 「/.bashrc」に以下の設定を記述
#export DB2CLP=**$$**
#export DB2PATH=C:¥¥SQLLIB

(この方法は、V9でしかちゃんと動かないようです)


DB2の文字コード設定


DB2の文字コードの扱いについて基本的なところを列挙してみます。

まず、DB2はデータベース作成時に"USING CODESET"で文字コードを指定します。表毎には変更できません(例外としてUTF-8以外で作成したデータベースの中にUnicodeの表を作成できる機能があります)。データは必ずそのコードページに変換されて格納されます。つまりSJISを指定して作成されたデータベースにはSJISのコードページで文字が格納されます。

例)
#CREATE DATABASE test USING CODESET IBM-943 TERRITORY JP COLLATE USING SYSTEM

クライアント環境のコードページがデータベースのコードページと異なる場合はDB2クライアントによってコードページ変換が行われます。そのためあまりクライアントはデータベースのコードページを意識する必要はありません。(もちろん変換できない文字などがある場合に問題が出るのですが)

クライアント環境のコードページはDB2クライアントによって自動判別されますが、基本的にOSの設定を継承します(たとえば最近のLinuxだとja_JP.UTF-8であるケースが多い)。それを変更したい場合はレジストリ変数のDB2CODEPAGEで上書きできます。

例)
#db2set DB2CODEPAGE=IBM-943

クライアントがJavaの場合は(JDBCドライバを使用している場合は)クライアントOSに関係なく、クライアントの文字コードはUTF-8と認識されます。

もし、クライアントのコードページがデータベースのコードページを表現できない場合(例:日本語EUCで作成したデータベースに、英語OS環境からアクセスした場合)、接続ができません。

例外として、UTF-8(Unicode)で作成したデータベースは、クライアントがどんなコードページでも接続できる事が保障されます。

以上を踏まえて、データベース作成時のコードページ選択基準をまとめると、

基本的に文字コード変換は起こらないのが一番なので、データベースを作成時に文字コードをクライアントのコードページに合わせるのが無難です。

Javaから利用するなら、UTF-8がお勧めです。

クライアント環境が特定できない、もしくは今後どうなるか分からない場合にはとりあえずUTF-8というのが汎用的に使えるので無難な選択です。ただし、日本語1文字あたり3バイト消費するので列サイズが問題になるケースでは別の文字コードを考慮すべきです。

説明を省略しているCOLLATEは文字のソート順の規定なのですが、UTF-8の場合はUCA400_NOが、それ以外ではSYSTEMがお勧めです。

  • UTF-8での作成例:
#CREATE DATABASE mydb AUTOMATIC STORAGE YES
#ON '/mydbpath/'
#USING CODESET UTF-8 TERRITORY JP
#COLLATE USING UCA400_NO
#PAGESIZE 4096

  • MS-SJIS(=IBM-943)での作成例:
#CREATE DATABASE TEST AUTOMATIC STORAGE YES 
#ON '/mydbpath/'
#USING CODESET IBM-943 TERRITORY JP 
#COLLATE USING SYSTEM 
#PAGESIZE 4096

あと、このあたりの情報も参考になりそうです。

※8/8追記: この資料 (DM-03-037)も非常に参考になります。


実行回数が多いSQLをカタログキャッシュから読み出す


SYSIBMADM.TOP_DYNAMIC_SQL表(VIEW)は、V9から新しく追加されたもので、その名前の通り、パッケージキャッシュ上のデータから、実行したSQLの情報を表示させるためのものです。概念は簡単ですが非常に使い勝手が良いVIEWですね。たとえばNUM_EXECUTIONS列にはSQLを実行した回数が入っているので、

#SELECT SUBSTR(STMT_TEXT,1,50), NUM_EXECUTIONS
#FROM SYSIBMADM.TOP_DYNAMIC_SQL
#ORDER BY NUM_EXECUTIONS DESC

とするだけで、実行回数の多いSQLが順に表示できます。

目安箱バナー