■DB2のコマンド
DB2のコマンドは下記の2種類に分類できる
- システムコマンド
- CLPコマンド (Command Line Processor Command)
①システムコマンド
・特殊な操作用のコマンド
・すべて「db2」から始まる名前になっている。(例:db2start、db2stopなど)
※db2levelコマンドはDB2のバージョンやFix Pack(修正ファイル)の情報を画面に表示する。
②CLPコマンド
・コマンドラインプロセッサから実行するコマンドのこと。
・非常に種類が多い
・「db2」とタイプした後にスペースを空けて記述うsる。
※LIST APPLICATIONSコマンドはデータベースに接続中のクライアント一覧を表示する。
【例】
・クライアントがデータベースに接続してる場合
で> db2 'LIST APPLICATIONS'
db2: /usr/lib64/libxml2.so.2: no version information available (required by /home/db2inst1/sqllib/lib64/libdb2.so.1)
db2: /usr/lib64/libxml2.so.2: no version information available (required by /home/db2inst1/sqllib/lib64/libdb2.so.1)
Auth Id Application Appl. Application Id DB # of
Name Handle Name Agents
-------- -------------- ---------- -------------------------------------------------------------- -------- -----
DB2INST1 db2bp 105 *LOCAL.db2inst1.170910124728 MYDB2 1
・クライアントがデータベースに接続しない場合
で> db2 'connect reset'
db2: /usr/lib64/libxml2.so.2: no version information available (required by /home/db2inst1/sqllib/lib64/libdb2.so.1)
db2: /usr/lib64/libxml2.so.2: no version information available (required by /home/db2inst1/sqllib/lib64/libdb2.so.1)
DB20000I The SQL command completed successfully.
で> db2 'LIST APPLICATIONS'
db2: /usr/lib64/libxml2.so.2: no version information available (required by /home/db2inst1/sqllib/lib64/libdb2.so.1)
db2: /usr/lib64/libxml2.so.2: no version information available (required by /home/db2inst1/sqllib/lib64/libdb2.so.1)
SQL1611W No data was returned by Database System Monitor.
※SQL文をダブルクォーテーションで囲むのは、CLPをdb2コマンドに対するひと塊の第一として渡すようにbashに解釈させるため。
(CLP内にシングルクォーテーションが現れなければシングルクォーテーションでもいいはず。もし現れてもfindコマンドなどのように「\」でエスケープすればいいはず・・・)
■DB2コマンドを実行するのに必要な環境変数
DB2コマンドを実行するには、いくつか環境変数を設定する必要がある。
Linuxの場合、インスタンスユーザ(db2inst1)でログインすれば自動的に環境変数が設定されるため、そのままDB2のコマンドを実行できる。
インスタンスユーザ以外のユーザでログインした場合は、以下のようにインスタンスユーザのホームディレクトリの「sqlib/db2profile」を読み込むことで環境変数が設定できる。
【例】
source /home/db2inst1/sqllib/db2profile
【調査】
「はじめの3歩」で調べたように、db2inst1は初期状態で下記のようなPATHが通ってる。
https://ameblo.jp/dagyah/entry-12308973604.html
/home/db2inst1/bin ←初期状態では空っぽ
/home/db2inst1/sqllib/bin ←/opt/ibm/db2/V11.1/binのシンボリックリンク。db2コマンドもここにある。
/home/db2inst1/sqllib/adm ←db2startやdb2stopはここにいる。
/home/db2inst1/sqllib/misc ←/opt/ibm/db2/V11.1/miscのシンボリックリンク
他の環境変数の初期値も見てみるんご
で> whoami
db2inst1
で> env
LESSKEY=/etc/lesskey.bin
DB2INSTANCE=db2inst1
NNTPSERVER=news
MANPATH=/usr/lib64/mpi/gcc/openmpi/share/man:/usr/local/man:/usr/share/man
IBM_DB_LIB=/home/db2inst1/sqllib/lib
HOSTNAME=linux-x1fa
XKEYSYMDB=/usr/X11R6/lib/X11/XKeysymDB
HOST=linux-x1fa
SHELL=/bin/bash
TERM=xterm
PROFILEREAD=true
HISTSIZE=1000
IBM_DB_DIR=/home/db2inst1/sqllib
MORE=-sl
JRE_HOME=/usr/lib64/jvm/jre
USER=db2inst1
LS_COLORS=no=00:fi=00:di=01;34:ln=00;36:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=41;33;01:ex=00;32:*.cmd=00;32:*.exe=01;32:*.com=01;32:*.bat=01;32:*.btm=01;32:*.dll=01;32:*.tar=00;31:*.tbz=00;31:*.tgz=00;31:*.rpm=00;31:*.deb=00;31:*.arj=00;31:*.taz=00;31:*.lzh=00;31:*.lzma=00;31:*.zip=00;31:*.zoo=00;31:*.z=00;31:*.Z=00;31:*.gz=00;31:*.bz2=00;31:*.tb2=00;31:*.tz2=00;31:*.tbz2=00;31:*.xz=00;31:*.avi=01;35:*.bmp=01;35:*.fli=01;35:*.gif=01;35:*.jpg=01;35:*.jpeg=01;35:*.mng=01;35:*.mov=01;35:*.mpg=01;35:*.pcx=01;35:*.pbm=01;35:*.pgm=01;35:*.png=01;35:*.ppm=01;35:*.tga=01;35:*.tif=01;35:*.xbm=01;35:*.xpm=01;35:*.dl=01;35:*.gl=01;35:*.wmv=01;35:*.aiff=00;32:*.au=00;32:*.mid=00;32:*.mp3=00;32:*.ogg=00;32:*.voc=00;32:*.wav=00;32:
LD_LIBRARY_PATH=/usr/lib64/mpi/gcc/openmpi/lib64:/home/db2inst1/sqllib/lib64:/home/db2inst1/sqllib/lib64/gskit:/home/db2inst1/sqllib/lib32
XNLSPATH=/usr/share/X11/nls
HOSTTYPE=x86_64
IBM_DB_HOME=/home/db2inst1/sqllib
FROM_HEADER=
PAGER=less
CSHEDIT=emacs
XDG_CONFIG_DIRS=/etc/xdg
MINICOM=-c on
MAIL=/var/spool/mail/db2inst1
PATH=/usr/lib64/mpi/gcc/openmpi/bin:/home/db2inst1/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/X11R6/bin:/usr/games:/home/db2inst1/sqllib/bin:/home/db2inst1/sqllib/adm:/home/db2inst1/sqllib/misc
CPU=x86_64
JAVA_BINDIR=/usr/lib64/jvm/java/bin
INPUTRC=/home/db2inst1/.inputrc
PWD=/home/db2inst1
JAVA_HOME=/usr/lib64/jvm/java
LANG=ja_JP.UTF-8
PYTHONSTARTUP=/etc/pythonstart
SDK_HOME=/usr/lib64/jvm/java
DB2_HOME=/home/db2inst1/sqllib
GPG_TTY=/dev/pts/1
QT_SYSTEM_DIR=/usr/share/desktop-data
JDK_HOME=/usr/lib64/jvm/java
SHLVL=1
HOME=/home/db2inst1
IBM_DB_INCLUDE=/home/db2inst1/sqllib/include
LESS_ADVANCED_PREPROCESSOR=no
OSTYPE=linux
LS_OPTIONS=-N --color=tty -T 0
XCURSOR_THEME=
G_FILENAME_ENCODING=@locale,UTF-8,EUC-JP,EUC-JP,SHIFT_JIS,ISO-8859-1
LESS=-M -I -R
MACHTYPE=x86_64-suse-linux
LOGNAME=db2inst1
CVS_RSH=ssh
CLASSPATH=/home/db2inst1/sqllib/java/db2java.zip:/home/db2inst1/sqllib/function:/home/db2inst1/sqllib/java/db2jcc_license_cu.jar:/home/db2inst1/sqllib/tools/clpplus.jar:/home/db2inst1/sqllib/tools/jline-0.9.93.jar:/home/db2inst1/sqllib/java/db2jcc.jar:.
XDG_DATA_DIRS=/usr/share
MAN_KEEP_FORMATTING=yes
LESSOPEN=lessopen.sh %s
DB2LIB=/home/db2inst1/sqllib/lib
LESSCLOSE=lessclose.sh %s %s
G_BROKEN_FILENAMES=1
JAVA_ROOT=/usr/lib64/jvm/java
COLORTERM=1
_=/usr/bin/env
・LD_LIBRARY_PATH
db2inst1には下記が追記されていた。
/home/db2inst1/sqllib/lib64
/home/db2inst1/sqllib/lib64/gskit
/home/db2inst1/sqllib/lib32
・alias、umask、ulimit -a
普通のユーザのものと同じだった
・setコマンド
db2inst1に「AddRemoveString ()」という名のあやしいbash関数がsetされてたんご
■CREATE DATABASEのオプション
CREATE DATABASEにオプションをつけられる。
CREATE DATABASEのオプションのうちデータベース作成後に変更できないパラメータがある。具体的には下記の5つ
① データベースの文字コード
② 文字の並び順
③ (デフォルトの)ページサイズ
④ データベースパス
⑤ ストレージパス
①文字コードの選択
DB2では、ハードディスクにデータを書き込む際の文字コードを指定できる。たとえば、UTF-8を指定してデータベースを書きこむ。
ただし、アプリケーション側では文字コードを意識する必要がないようになっている。これはDB2クライアントがアプリケーション(クライアント)側の文字コードと、データベース側の文字コードの違いを認識して、透過的に変換してくれるため。
※CREATE DATABASEのデフォルトはUTF-8
※DB2はデータベースごとに文字コードを指定できる。
※MySQLの文字コード設定には下記の3種類がある
- テーブルに指定する文字コード設定
- カラムに指定する文字コード設定
- クライアントからサーバーに接続する文字コード設定
※JDBCドライバ経由の文字コードはまるっとUTF-8
・可能なら変換しないで済むように、クライアントで使用する文字コードとデータベースの文字コードを統一する。
※クライアントの文字コードが一種類の場合、それに合わせる。
例えば、開発言語がJavaならデータベース側もUTF-8にする。
・クライアント側の文字コードが一種類でない場合、UTF-8にする。
たとえば、ドイツ語や中国語のクライアントからアクセスされる場合、複数言語の文字を同時に格納できる文字コードはUTF-8が唯一の解。
・DB2に格納する文字コードをUTF-8にする場合は、CREATE DATABASEの引数は、
USING CODESET に 「UTF-8」、 COLLATE USING に 「IDENTITY」
文字コードをSHIFT-JISにする場合は、
USING CODESET に 「IBM-943」、 COLLATE USING に 「SYSTEM-943_JP」
にする。
【検証】 shift-jisのデータベース「SJISDB」を作成する
で> db2 "CREATE DATABASE SJISDB ON /tmp/SJISDB DBPATH ON /tmp \
USING CODESET IBM-943 TERRITORY JP COLLATE USING IDENTITY PAGESIZE 4 K"
db2: /usr/lib64/libxml2.so.2: no version information available (required by /home/db2inst1/sqllib/lib64/libdb2.so.1)
db2: /usr/lib64/libxml2.so.2: no version information available (required by /home/db2inst1/sqllib/lib64/libdb2.so.1)
DB20000I The CREATE DATABASE command completed successfully.
で> db2 "connect to SJISDB"
db2: /usr/lib64/libxml2.so.2: no version information available (required by /home/db2inst1/sqllib/lib64/libdb2.so.1)
db2: /usr/lib64/libxml2.so.2: no version information available (required by /home/db2inst1/sqllib/lib64/libdb2.so.1)
Database Connection Information
Database server = DB2/LINUXX8664 11.1.2.2
SQL authorization ID = DB2INST1
Local database alias = SJISDB
で> cat create_table.sql
DROP TABLE TEST_SJIS;
CREATE TABLE TEST_SJIS (
ID INT NOT NULL,
NAME VARCHAR(30)
);
で> db2 -tvf create_table.sql
db2: /usr/lib64/libxml2.so.2: no version information available (required by /home/db2inst1/sqllib/lib64/libdb2.so.1)
db2: /usr/lib64/libxml2.so.2: no version information available (required by /home/db2inst1/sqllib/lib64/libdb2.so.1)
DROP TABLE TEST_SJIS
DB21034E The command was processed as an SQL statement because it was not a
valid Command Line Processor command. During SQL processing it returned:
SQL0204N "DB2INST1.TEST_SJIS" is an undefined name. SQLSTATE=42704
CREATE TABLE TEST_SJIS ( ID INT NOT NULL, NAME VARCHAR(30) )
DB20000I The SQL command completed successfully.
・teratermの送信文字コードを「UTF-8」に設定
で> locale
LANG=ja_JP.UTF-8
LC_CTYPE="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_PAPER="ja_JP.UTF-8"
LC_NAME="ja_JP.UTF-8"
LC_ADDRESS="ja_JP.UTF-8"
LC_TELEPHONE="ja_JP.UTF-8"
LC_MEASUREMENT="ja_JP.UTF-8"
LC_IDENTIFICATION="ja_JP.UTF-8"
LC_ALL=
で> echo あいう |hexdump -C
00000000 e3 81 82 e3 81 84 e3 81 86 0a |..........|
0000000a
で> echo あいう > a;file a;rm a
a: UTF-8 Unicode text ←UTF-8
で> db2 "INSERT INTO TEST_SJIS VALUES (1,'あいう')"
db2: /usr/lib64/libxml2.so.2: no version information available (required by /home/db2inst1/sqllib/lib64/libdb2.so.1)
db2: /usr/lib64/libxml2.so.2: no version information available (required by /home/db2inst1/sqllib/lib64/libdb2.so.1)
DB20000I The SQL command completed successfully.
で> db2 "select * from TEST_SJIS"
db2: /usr/lib64/libxml2.so.2: no version information available (required by /home/db2inst1/sqllib/lib64/libdb2.so.1)
db2: /usr/lib64/libxml2.so.2: no version information available (required by /home/db2inst1/sqllib/lib64/libdb2.so.1)
ID NAME
----------- ------------------------------
1 あいう
1 record(s) selected.
で> db2 "select * from TEST_SJIS" 2> /dev/null|grep あいう|awk '{print $2}'
あいう
で> db2 "select * from TEST_SJIS" 2> /dev/null|grep あいう|awk '{print $2}'|hexdump -C
00000000 e3 81 82 e3 81 84 e3 81 86 0a |..........|
0000000a
・teratermの送受信文字コードを「shift-jis」に設定
縺ァ>echo あいう |hexdump -C
00000000 82 a0 82 a2 82 a4 0a |.......|
00000007
縺ァ>echo あいう > a;file a;rm a
a: Non-ISO extended-ASCII text
縺ァ> db2 "update TEST_SJIS set NAME='あいう' where ID=2"
db2: /usr/lib64/libxml2.so.2: no version information available (required by /home/db2inst1/sqllib/lib64/libdb2.so.1)
db2: /usr/lib64/libxml2.so.2: no version information available (required by /home/db2inst1/sqllib/lib64/libdb2.so.1)
DB20000I The SQL command completed successfully.
縺ァ> db2 "select * from TEST_SJIS""
db2: /usr/lib64/libxml2.so.2: no version information available (required by /home/db2inst1/sqllib/lib64/libdb2.so.1)
db2: /usr/lib64/libxml2.so.2: no version information available (required by /home/db2inst1/sqllib/lib64/libdb2.so.1)
ID NAME
----------- ------------------------------
1 縺ゅ>縺
2 ・ソス・ス・ス・ス・ス・ス ←化けてるんご
2 record(s) selected.
・teratermの送受信文字コードを「UTF-8」に戻す
で> db2 "select * from TEST_SJIS"
db2: /usr/lib64/libxml2.so.2: no version information available (required by /home/db2inst1/sqllib/lib64/libdb2.so.1)
db2: /usr/lib64/libxml2.so.2: no version information available (required by /home/db2inst1/sqllib/lib64/libdb2.so.1)
ID NAME
----------- ------------------------------
1 あいう
2 ?????? ←化けてるんご
2 record(s) selected.
・teratermの送受信文字コードを「shift-jis」に設定
縺ァ> LANG=ja_JP.sjis
縺ァ> locale
LANG=ja_JP.sjis
LC_CTYPE="ja_JP.sjis"
LC_NUMERIC="ja_JP.sjis"
LC_TIME="ja_JP.sjis"
LC_COLLATE="ja_JP.sjis"
LC_MONETARY="ja_JP.sjis"
LC_MESSAGES="ja_JP.sjis"
LC_PAPER="ja_JP.sjis"
LC_NAME="ja_JP.sjis"
LC_ADDRESS="ja_JP.sjis"
LC_TELEPHONE="ja_JP.sjis"
LC_MEASUREMENT="ja_JP.sjis"
LC_IDENTIFICATION="ja_JP.sjis"
LC_ALL=
縺ァ> db2 "insert into TEST_SJIS VALUES (3,'あいう')"
db2: /usr/lib64/libxml2.so.2: no version information available (required by /home/db2inst1/sqllib/lib64/libdb2.so.1)
db2: /usr/lib64/libxml2.so.2: no version information available (required by /home/db2inst1/sqllib/lib64/libdb2.so.1)
DB20000I The SQL command completed successfully.
縺ァ> db2 "select * from TEST_SJIS"
db2: /usr/lib64/libxml2.so.2: no version information available (required by /home/db2inst1/sqllib/lib64/libdb2.so.1)
db2: /usr/lib64/libxml2.so.2: no version information available (required by /home/db2inst1/sqllib/lib64/libdb2.so.1)
ID NAME
----------- ------------------------------
1 縺ゅ>縺
2 ・ソス・ス・ス・ス・ス・ス
3 ・ス・ス・ス・ス・ス・ス ←やっぱり文字化けしてる。なんでだろ
3 record(s) selected.
なんかうまくいかへん。 保留にすんべ
②文字の並び順
・DB2に格納する文字コードをUTF-8にする場合は、CREATE DATABASEの引数は、
COLLATE USING に 「IDENTITY」
文字コードをSHIFT-JISにする場合は、
COLLATE USING に 「SYSTEM-943_JP」
にする。
③ページサイズ
ページサイズとは、DB2がデータを操作する際にどのくらいのサイズを読み書きの最小単位とするかを表す値。
ページサイズは表領域ごとに設定できるが、データベースを作成するときにデフォルトのページサイズを指定する必要がある。
一般的にはページサイズが小さいほうがパフォーマンス面でメリットがある。許容可能な制限の範囲で、小さいページサイズを選ぶ。
一般的な用途では4KBページサイズの制限で困ることはあまりない。
④データベースパス
データベースの設定情報を格納する領域。サイズは小さく、アクセス頻度も低い。
データベース作成後に変更できない。
⑤ストレージパス
実際のデータが格納されるディスク領域。できるだけ高速で、容量に余裕があるストレージを指定する必要がある。データベース作成後に追加/削除できる。
■構成パラメータ
DB2には動作を調整するための設定パラメータが3種類ある。
これらのパラメータはコマンドで確認できるが、SQLで参照することもできる。
※パラメータをSQLでは変更できない。プログラムから参照する場合に便利
①レジストリー変数 SYSIBMADM.DBCFGテーブル
②データベースマネージャ構成パラメータ(DBM CFG) SYSIBMADM.DBMCFGテーブル
③データベース構成パラメータ(DB CFG) SYSIBMADM.REG_VARIABLESテーブル
③データベース構成パラメータ(DB CFG)
データベースごとに設定でき、そのデータベースにのみ影響を与えるパラメータ。もっとも種類が多く、パラメータチューニングはおもにDB CFGに対して行う。
設定されている値を確認するには、「GET DATABASE CONFIGURATION」コマンドを使う。
【例】
で> db2 "GET DATABASE CONFIGURATION FOR SJISDB2"
db2: /usr/lib64/libxml2.so.2: no version information available (required by /home/db2inst1/sqllib/lib64/libdb2.so.1)
db2: /usr/lib64/libxml2.so.2: no version information available (required by /home/db2inst1/sqllib/lib64/libdb2.so.1)
Database Configuration for Database SJISDB2
Database configuration release level = 0x1400
Database release level = 0x1400
Database territory = JP
Database code page = 943
Database code set = IBM-943
Database country/region code = 81
Database collating sequence = IDENTITY
Alternate collating sequence (ALT_COLLATE) =
Number compatibility = OFF
Varchar2 compatibility = OFF
Date compatibility = OFF
Database page size = 4096
Statement concentrator (STMT_CONC) = OFF
Discovery support for this database (DISCOVER_DB) = ENABLE
Restrict access = NO
Default query optimization class (DFT_QUERYOPT) = 5
・・・省略・・・
パラメータを更新するには、「UPDATE DATABASE CONFIG」コマンドを使う。
たとえば、「LOCKTIMEOUT」パラメータを「180」に変更する場合は、
db2 "UPDATE DATABASE CONFIGURATION FOR SJISDB USING LOCKTIMEOUT 180"
多くのパラメータはデータベースを稼働させたまま変更でき、結果も即時反映される。しかし、一部のパラメータは稼働中には変更できず、変更しようとすると「SQL1363W」というメッセージが返る場合、すべてのクライアントが接続を解除するまで新しい設定が反映されない。パラメータ反映させたい場合は、以下のいずれかの操作をする。
- 「FORCE APPLICATIONS」コマンドでクライアントをすべて切断する。
- 「db2stop force」コマンドでクライアントの接続を解除しつつインスタンスを停止し、
「db2start」で再起動させる。
②データベースマネージャ構成パラメータ(DBM CFG)
インスタンス全体に影響を与えるパラメータ。
DBM CFGが使用されることが多いのは、インスタンス全体の上限値を設定する場合。
設定されている値を確認するには、「GET DATABASE MANAGER CONFIGURATION」コマンドを使う。
【例】
で> db2 "GET DATABASE MANAGER CONFIGURATION"
db2: /usr/lib64/libxml2.so.2: no version information available (required by /home/db2inst1/sqllib/lib64/libdb2.so.1)
db2: /usr/lib64/libxml2.so.2: no version information available (required by /home/db2inst1/sqllib/lib64/libdb2.so.1)
Database Manager Configuration
Node type = Enterprise Server Edition with local and remote clients
Database manager configuration release level = 0x1400
CPU speed (millisec/instruction) (CPUSPEED) = 2.007463e-07
Communications bandwidth (MB/sec) (COMM_BANDWIDTH) = 1.000000e+02
Max number of concurrently active databases (NUMDB) = 32
Federated Database System Support (FEDERATED) = NO
Transaction processor monitor name (TP_MON_NAME) =
Default charge-back account (DFT_ACCOUNT_STR) =
Java Development Kit installation path (JDK_PATH) = /home/db2inst1/sqllib/java/jdk64
Diagnostic error capture level (DIAGLEVEL) = 3
Notify Level (NOTIFYLEVEL) = 3
Diagnostic data directory path (DIAGPATH) = /home/db2inst1/sqllib/db2dump/
Current member resolved DIAGPATH = /home/db2inst1/sqllib/db2dump/
Alternate diagnostic data directory path (ALT_DIAGPATH) =
・・・・省略・・・・
パラメータを更新するには、
UPDATE DATABASE MANAGER CONFIGURATION USING パラメータ名 値
①レジストリー変数
特殊な設定を行うためのパラメータ
レジストリー変数を変更する方法は下記の2通り。
- OSの環境変数で設定する
- 「プロファイルレジストリー」と呼ばれるDB2の管理領域に設定を保存する。
設定されている値を確認するには、
db2set -all
で現在のレジストリ変数の設定がすべて表示される。
【例】
で> db2set -all
db2set: /usr/lib64/libxml2.so.2: no version information available (required by /home/db2inst1/sqllib/lib64/libdb2.so.1)
db2set: /usr/lib64/libxml2.so.2: no version information available (required by /home/db2inst1/sqllib/lib64/libdb2.so.1)
[i] DB2COMM=TCPIP
[i] DB2AUTOSTART=YES
[g] DB2SYSTEM=linux-x1fa
インスタンスレベルに設定されている変数は[i]と表示される
グローバルレベル(DB2が導入されているシステム全体)に設定された変数は[g]と表示される。
両方で同じ変数が設定されている場合は、インスタンスレベルの方が使用される。
上記の他に[e]と表示されるものは、OSの環境変数で設定されている変数
・レジストリ変数の設定
インスタンスレベルで設定する場合は、
db2set 変数名=値
グローバルレベルで設定する場合は、
db2set -g 変数名=値
■本番環境で使用するための最低限の設定
本番環境で使用する際はログ(トランザクションログ)の設定をデフォルト値から変更する。
①ログ(トランザクションログ)のパスの変更
※ログはデフォルトではデータベースパス以下のディレクトリに設定されている。
データベースパス/インスタンス名/NODExxxx/SQLxxxxx/SQLOGDIR/
【例】/home/db2inst1/db2inst1/NODE0000/SQL00003/SQLOGDIR/
ログと表領域を同じ物理デバイス上に配置すると、故障したとき、ログと実データを同時に失うことになる。そのためログは、表領域とは別に用意されたRAIDディスクなどに書き込み性能が高いデバイスに格納する。
変更方法は下記の[ステップ1]~[ステップ4]
[ステップ1] トランザクションログの保存先の変更
db2 "UPDATE DB CFG FOR MYDB USING NEWLOGPATH /hoge1"
※「NEWLOGPATH」はトランザクションログを保存する新しいディレクトリを指定するDB CFGパラメータ
[ステップ2] アーカイブログの保存先の変更
db2 "UPDATE DB CFG FOR MYDB USING LOGARCHMETH1 DISK:/hoge2"
※「LOGARCHMETH1」はアーカイブログを保存するディレクトリを指定するDB CFGパラメータ
※[ステップ1] と[ステップ2] は表領域とは別の物理ディスクろマウントしたディレクトリを指定する
[ステップ3] 全クライアントの接続を解除
db2 "FORCE APPLICATIONS ALL"
※次回接続するときにログ設定が変更されるようにする
[ステップ4] データベースをバックアップ
db2 "BACKUP DATABASE MYDB TO /hoge3"
※ログのモード切り替え[ステップ2]をした場合には必ずバックアップを取得する必要がある
②ログ(トランザクション)の最大サイズの設定
ログのサイズは更新処理があるたびに増えていくので、何らかの方法で上限を管理しなければならない。 DB2ではDB CFGのイカの3つのパラメータの組み合わせでログの最大サイズが決定される。
意味 デフォルト値
- LOGFILSIZ ログファイルの1つのサイズを指定。単位は4KB 1024
- LOGPRIMARY LOGFILSIZをいくつ準備するかという値*1 8
- LOGSECOND 準備しておいた分が不足した場合に追加されるログの数*2 4
※1:最初に用意されるログは1次ログと呼ぶ
※2:2次ログと呼ぶ
ログがどのくらい必要かはアプリケーションによって大きく異なるため、一概には判断できないが、目安は「1トランザクションの更新データ量」。 基本的には更新トランザクションのデータ量が多い場合にはログを多く必要とする。
例えば、簡単な”DELETE FROM MYDB"だけを実行する場合でも、MYDB表のサイズが100GBもある場合は、その全データを記録しないといけないため、ログも100GB以上必要になる。
ログが不足すると、「SQLCODE -964」もしくは「SQL0964C」というメッセージが出る。その場合は、LOGPRIMARYの数を増やす。
③循環ロギングをアーカイブロギングに切り替える
ログサイズが制限されているので、そのままではいずれログファイルが一杯になるのを防ぐためにDB2はログを管理するメカニズムとして「循環ロギング」と「アーカイブロギング」の2つの仕組みが用意されている。
- 循環ロギング ログを保存しない
- アーカイブロギング 外部にログを保存する
循環ロギングは、名前の通り、ログを循環して再利用する。あるログファイルの上限まで書き込まれ、全データのコミットが完了した場合、そのログファイルは「再利用可能」とマークされる。
一方アーカイブロギングは、使い終わったログファイルをすぐには再利用せず、外部のアーカイブ・ログ用ディレクトリにコピーした後再利用する。
LOGARCHMETH1に「DISK:ディレクトリ名」という形式で記述すると、アーカイブロギングに設定される。
アーカイブ・ログを保存しておくと、ポイントインタイムリストアが利用できる。つまりログをバックアップの一部として利用できるようになる。
データベースを作成した直後は循環ロギングに設定されているが、本番用途では必ずLOGARCHMETH1を設定してアーカイブ・ロギングに変更する。
アーカイブログを置くディスクは、表のデータやNEWLOGPATHで指定s他ログパスとは別のディスクを使用するのが理想的。
■サーバとは別のマシン上のクライアントからサーバへ接続する方法
サーバとは別のマシンからdb2コマンド(CLP)を使用して操作したい場合は、まずDB2クライアントを導入する必要がある。DB2クライアントは、Fix Packと同じURLからダウンロードできる。
使用しているDB2のバージョンと一致したクライアントを使用する。
DB2クライアントは複数の種類があるが、IBM Data Server Clientを使うのが一般的。
DB2クライアントが導入された環境からサーバに接続するには、まず、サーバのDB2インスタンスを新たなノードとしてカタログ(登録)する。
db2 "CATALOG TCPIP NODE ノード名 REMOTE ホスト名 SERVER ポート番号"
続いて、そのインスタンス上にあるデータベースをカタログする。
db2 "CATALOG DATABASE db名 AS 別名 AT NODE ノード名"
例えば、ホスト「hoge」上のデータベース「fuga」に、クライアント側では「piyo」という名前で接続できるようになる。
db2 "CATALOG DATABASE fuga AS piyo AT hoge"
リモートサーバへ接続するには、以下のように必ず「USER」と「USING」でIDとパスワードを明示する。
db2 "CONNECT TO fuga USER db2inst1 USING p@ssw0rd"