Dirk deRoos (dderoos@ca.ibm.com), DB2 Information Development, IBM Toronto Lab
2003年 5月 DB2モニタリング・データへのSQLアクセス:スナップショットの収集
はじめに
IBM® DB2® Universal DatabaseTM(UDB)インスタンスのステータスをモニターする方法の1つとして、データベース・システム・モニター・データのスナップショットの収集が挙げられます。モニター・データのスナップショットは、スナップショットを取った特定時点のデータベース・アクティビティーの状態を示します。この方法によるデータベース・システムのモニタリングは、データベース・システムのパフォーマンスの評価、また、起こりうる問題の検出にきわめて効果的です。
DB2 UDB Version 8.1 for UNIX® , Linux and Windows® の特長の1つは、SQLテーブル関数を使ってスナップショットを収集する機能です。従来よりも操作がきわめて簡単になり、スナップショットを収集し、保存し、高速かつ柔軟に取り出しを行うことができます。
スナップショットのタイプ
スナップショット・モニターSQLテーブル関数(以下「スナップショット・テーブル関数」)がいくつかあり、それぞれ、特定のタイプのモニター・データの収集を行います。表1は、一般的に使用されるスナップショット・テーブル関数のリストです。
注記:
個々のスナップショット・テーブル関数の詳細(返される列、およびそのデータ・タイプなど)については、スナップショット・テーブル関数名にリンクされたDB2マニュアルの項を参照してください。完全なリストについては、DB2マニュアルの「Snapshot
monitor SQL table functions」の項目をご覧ください。
表1.スナップショット・テーブル関数
| スナップショット・テーブル関数
| 返される情報
|
|---|
|
SNAPSHOT_DBM
| データベース・マネージャーの情報 | |
SNAPSHOT_DATABASE
| データベース情報。最低1つのアプリケーションがデータベースに接続されている場合にのみ情報が返されます。 | |
SNAPSHOT_APPL
| 区画上のデータベースに接続されている各アプリケーションについて、一般的なアプリケーション情報。これには、累計カウンター、ステータス情報、最近実行されたSQLステートメント(ステートメント・モニター・スイッチがセットされている場合)が含まれます。 | |
SNAPSHOT_APPL_INFO
| 区画上のデータベースに接続されている各アプリケーションについて、一般的なアプリケーション識別情報。 | |
SNAPSHOT_LOCKWAIT
| 区画上のデータベースに接続されている各アプリケーションについて、ロック待ちに関するアプリケーション情報。 | |
SNAPSHOT_STATEMENT
| 区画上のデータベースに接続されているアプリケーションについて、ステートメントに関するアプリケーション情報。これには、最近実行されたSQLステートメントが含まれます(ステートメント・モニター・スイッチがセットされている場合)。 | |
SNAPSHOT_TABLE
| データベースに接続されたアプリケーションからアクセスされた各テーブルについて、テーブル・アクティビティー情報。テーブル・モニター・スイッチが必要です。 | |
SNAPSHOT_LOCK
| データベース・レベル、およびデータベースに接続された各アプリケーションについてアプリケーション・レベルでのロック情報。ロック・モニター・スイッチが必要です。 | |
SNAPSHOT_TBS
| データベース・レベル、データベースに接続された各アプリケーションについてアプリケーション・レベル、およびデータベースに接続されたアプリケーションからアクセスされた各テーブルスペースについてテーブルスペース・レベルでのテーブルスペース・アクティビティーに関する情報。バッファー・プール・モニター・スイッチが必要です。 | |
SNAPSHOT_BP
| 指定したデータベースについてのバッファー・プール・アクティビティー・カウンター。バッファー・プール・モニター・スイッチが必要です。 | |
SNAPSHOT_DYN_SQL
| データベース用SQLステートメント・キャッシュからのポイントインタイムのステートメント情報 |

 |
スナップショット・モニター・データの構成
スナップショット・テーブル関数はすべて、モニター・データのテーブルを返します。テーブルの各行は、モニタリング対象データベース・オブジェクトのインスタンスを表し、各列はモニター・エレメントを表しています。モニター・エレメントは、データベース・システムの状態に関する特定の属性に相当します。
スナップショット・モニタリングに利用可能なすべてのモニター・エレメントは、DB2マニュアルの「Snapshot
monitor logical data groups and monitor elements」の項目に記載されています。スナップショット・テーブル関数の列名は、この項目に記載されているモニター・エレメント名に直接対応しています。
モニター・スイッチ
スナップショット・テーブル関数を使って収集可能なモニター・エレメントのいくつかは、モニター・スイッチで制御されます。一部の関数の説明で具体的なモニター・スイッチについて言及があるときは、スナップショット・テーブル関数の表にその旨示されています。DB2に内蔵されているモニター・スイッチは、データベース・パフォーマンスが最適化されるようにモニター・エレメントのセットの収集を抑止するオプションをDBAに提供することを目的としています。スイッチで制御されないモニター・エレメントも多数あります。
表2は、モニター・スイッチの一覧です。データベース・マネージャー・レベルとデータベース・レベルの識別子が併記されています。
|
データベース・マネージャー・スイッチ
|
データベース・スイッチ
|
提供される情報
|
|---|
| BUFFERPOOL | DFT_MON_BUFFERPOOL | 読み出し、書き込みの数、所要時間 | | LOCK | DFT_MON_LOCK | ロック待ち時間、デッドロック | | SORT | DFT_MON_SORT | 使用ヒープの数、ソート・パフォーマンス | | STATEMENT | DFT_MON_STMT | 開始/終了時間、ステートメント識別 | | TABLE | DFT_MON_TABLE | アクティビティーの測定値(読み出し/書き込み行数) | | UOW | DFT_MON_UOW | 開始/終了時間、完了ステータス | | TIMESTAMP | DFT_MON_TIMESTAMP | タイムスタンプ |
モニター・スイッチは、データベース・マネージャー・レベルでは、dft_monswitchesデータベース・マネージャー構成パラメーターを使ってセットします。すべてのモニター・スイッチの設定を確認するには、GET
DATABASE MANAGER MONITOR SWITCHESコマンドを使用します。データベース・マネージャー・レベルでモニター・スイッチの設定を有効化、無効化するには、UPDATE
DBM CFGコマンドを使用し、設定を変更するモニター・スイッチを個別に指定します。たとえば、次のコマンドは、DFT_MON_TIMESTAMPモニター・スイッチを無効化して、タイムスタンプ・モニター・データの収集を終了させます。
db2 update dbm cfg
using DFT_MON_TIMESTAMP off
|
データベースに接続された各アプリケーションには、データベース・マネージャー、その他のアプリケーションから独立した、そのアプリケーション専用のモニター・スイッチのセットがあります。アプリケーションは、データベースに接続した時点で、そのモニター・スイッチ設定をデータベース・マネージャーから継承します。アプリケーションについてすべてのモニター・スイッチ設定を確認するには、GET
MONITOR SWITCHESコマンドを使用します。また、アプリケーションについてモニター・スイッチ設定を変更するには、UPDATE MONITOR
SWITCHESコマンドを使用します。たとえば、次のコマンドは、LOCKモニター・スイッチをオンにし、SNAPSHOT_LOCKスナップショット・テーブル関数の使用するモニター・エレメントの収集を有効化します。
スナップショット・データへのアクセス方法
スナップショット・テーブル関数を使ってモニター・データにアクセスする方法としては、ダイレクト・アクセスとファイル・アクセスの2つがあります。
スナップショット・データへのダイレクト・アクセスでは、アクセスを許可されたユーザーが、スナップショット・テーブル関数の入った照会を実行し、モニター・データの格納された結果セットを受け取ります。許可ユーザー(スナップショット・モニタリング・タスクについて)になるには、SYSADM、SYSCTRLまたはSYSMAINT権限が必要です。
ファイル・アクセスでは、許可ユーザーは、特定のスナップショット・データの集合をすべてのユーザーに提供することができます。具体的には、許可ユーザーが、スナップショット要求タイプおよび関係する区画とデータベースを特定して、SNAPSHOT_FILEWストアード・プロシージャーを呼び出します。SNAPSHOT_FILEWストアード・プロシージャーにより、モニター・データがデータベース・サーバー上のファイルに保存されます。そのあと任意のデータベース・ユーザーは、対応するスナップショット・テーブル関数の入った照会を(ファイル・アクセスを指示するパラメーターを使って)実行することができます。ユーザーの受け取るモニター・データは、SNAPSHOT_FILEWストアード・プロシージャーにより生成されたファイルからpullされます。つまり、ユーザーは、許可ユーザーがSNAPSHOT_FILEWストアード・プロシージャーを使用したスナップショット・テーブル関数の結果を受け取るだけです。
ダイレクト・アクセスによるモニター・データ・スナップショットのキャプチャリング
スナップショット・テーブル関数を使ってダイレクト・アクセス・スナップショットをキャプチャーするには、次の手順を実行します。
-
データベースに接続します。モニターする必要のある、インスタンス上のデータベースです。スナップショット・テーブル関数を使ったSQL照会を実行するには、データベースへの接続が必要です。
例:
注記:このセクションに示す例は、sampleデータベースが作成済みであることを想定しています。まだ作成していない場合は、db2samplユーティリティーを使って作成することができます。
-
キャプチャーする必要のあるスナップショットのタイプ、モニターする必要のあるデータベースと区画を特定します。この情報を収集し、さらに、該当するモニター・スイッチをオンにします(「表1.
スナップショット・テーブル関数」で、スナップショット・テーブル関数の説明を確認してください)。
たとえば、(SNAPSHOT_TABLE関数を使って)テーブル・アクティビティー・データのスナップショットをキャプチャーしたいときは、TABLEモニター・スイッチを有効化する必要があります。
db2 update dbm cfg using
DFT_MON_TABLE on
|
-
希望するスナップショット・テーブル関数を使った照会を実行します。
たとえば、下記は、現在の接続先区画上のSAMPLEデータベースについてテーブル・アクティビティー情報を取得する照会です。
db2 "select * from table
(SNAPSHOT_TABLE('sample',
-1)) as T"
|
スナップショット・テーブル関数には、2つの入力パラメーターがあります。
- データベース名を指定するVARCHAR(255)。NULLを入力すると、現在接続しているデータベースの名前が使用されます。
注記1:このパラメーターは、データベース・マネージャーの情報のみを返すスナップショット・テーブル関数(たとえばSNAPSHOT_DBM)には適用されません。そのタイプのスナップショット・テーブル関数には、区画番号のパラメーターしかありません。
注記2:次のスナップショット・テーブル関数については、現在接続されているデータベースにNULLを入力すると、インスタンス上のすべてのデータベースについてのスナップショット情報(SNAPSHOT_DATABASE、SNAPSHOT_APPL、SNAPSHOT_APPL_INFO、SNAPSHOT_LOCKWAIT、SNAPSHOT_STATEMENT、SNAPSHOT_BP)が返されます。
- 区画番号を指定するSMALLINT。区画番号パラメーターについては、モニターする必要のある区画番号に対応する整数(0〜999の値)を入力します。現在接続している区画のスナップショットを収集するには、-1またはNULLの値を入力します。グローバル・スナップショットを収集するには、-2の値を入力します。
次の例で、上記のステップを説明します。このシナリオでは、3つのアプリケーションがSampleデータベースに接続しています。2つはローカル接続、1つはリモート・クライアントからの接続です。ローカル・アプリケーションの1つは、SampleデータベースのSTAFFテーブルのレコードに対して更新を実行します。一方、リモート・アプリケーションは、SampleデータベースのSALESテーブルにレコードを挿入します。2つ目のローカル・アプリケーションを使って、スナップショット・モニタリング・アクティビティーを実行します。
次は、この3つのアプリケーションそれぞれのコマンドとステートメントのシーケンスです。
モニタリング・アプリケーション:
DFT_MON_TABLEモニター・スイッチをセットします。
db2 update dbm cfg using
DFT_MON_TABLE on
|
アプリケーション1(リモート・アプリケーション):
SALESテーブルにレコードを挿入します。
db2 "insert into sales values
('03/20/2003','LEE', 'Atlantic',
5)"
|
アプリケーション2(ローカル・アプリケーション):
STAFFテーブルの12個のレコードを更新します。
db2 "update staff set salary =
salary * 1.1 where JOB =
'Clerk'"
|
モニタリング・アプリケーション:
Sampleデータベースのテーブルについての情報のスナップショットを収集します。
db2 connect to sample
db2 "select * from table
(SNAPSHOT_TABLE('sample',-1))
as T"
|
上記照会の結果セットには多数の列があります。そのため、場合によっては、コマンド行から読み出すのが困難な場合があります。特定のいくつかのモニター・エレメントのみを扱う場合には、そのモニター・エレメントの列にselectステートメントを限定することができます。たとえば、下記は、そのタイプの照会と、それに対応する結果セットです。
モニタリング・アプリケーション:
db2 "select snapshot_timestamp,
table_name, rows_written,
rows_read from table
(SNAPSHOT_TABLE('sample',
-1))as T"
SNAPSHOT_TIMESTAMP TABLE_NAME ROWS_WRITTEN ROWS_READ
-------------------------- --------------- ------------ ---------
2003-04-07-09.33.27.468598 SYSROUTINES 0 4
2003-04-07-09.33.27.468598 STAFF 12 47
2003-04-07-09.33.27.468598 SALES 1 0
2003-04-07-09.33.27.468598 SYSTABLES 0 2
2003-04-07-09.33.27.468598 SYSPLAN 0 1
2003-04-07-09.33.27.468598 SYSEVENTMONITORS 0 1
2003-04-07-09.33.27.468598 SYSDBAUTH 0 5
2003-04-07-09.33.27.468598 SYSBUFFERPOOLS 0 1
2003-04-07-09.33.27.468598 SYSTABLESPACES 0 3
2003-04-07-09.33.27.468598 SYSVERSIONS 0 1
10 record(s) selected.
|
周期的に収集したモニター・スナップショットの結果を保存することによって、DBMSのステータスと動作のトレンドを確認する上で有用な情報を得ることができます。モニタリングするインスタンスのデータベースにモニター・データ用の表を作成することによって、これを間単に行うことができます。たとえば、次の例では、表を作成して、インスタンス上のデータベースに接続されるアプリケーションの数についてモニター・データをこのテーブルに保存します。
モニタリング・アプリケーション:
db2 "create table instance_snap
(snap_time timestamp NOT NULL,
local_cons bigint,
rem_cons_in bigint)"
|
次のステートメントは、インスタンス上のデータベースへの接続数のスナップショットと併せてタイムスタンプを収集し、このデータを上記で作成したINSTANCE_SNAPテーブルに挿入します。
モニタリング・アプリケーション:
db2 "insert into instance_snap
select snapshot_timestamp,
local_cons, rem_cons_in from
table (snapshot_dbm
(-1))as snapshot_dbm"
db2 "select * from instance_snap"
SNAP_TIME LOCAL_CONS REM_CONS_IN
-------------------------- ------------- ------------
2003-04-07-09.40.49.867659 2 1
1 record(s) selected.
|
上記の出力は、2つのローカル・アプリケーションと1つのリモート・アプリケーションがSampleデータベースに接続されていることを示しています。
ファイル・アクセスによるモニター・データ・スナップショットの収集
ファイル・アクセスによるスナップショット・テーブル関数の使用は、スナップショット・モニター・データへのアクセスをすべてのユーザーに提供する安全な方法です。この方法には、いくつかの制約があります。
- SNAPSHOT_FILEWファイルから得られるスナップショット・モニター・データは、最新性の点からみると、許可ユーザーが前回SNAPSHOT_FILEWストアード・プロシージャーを呼び出したときのデータにすぎません。周期的にSNAPSHOT_FILEWストアード・プロシージャーを呼び出すようにすれば、最新のスナップショット・モニター・データが提供されることになります。たとえば、SNAPSHOT_FILEWストアード・プロシージャーを呼び出すDB2
CLPスクリプトを作成し、DB2のTask Centerツールを使って、このスクリプトを毎週日曜日の深夜に実行するように予約することができます。
- スナップショット・テーブル関数を使った照会を実行するユーザーが、モニターするデータベースまたは区画を特定することはできません。スナップショット・テーブル関数のアクセスするファイルの内容を特定するのは、SNAPSHOT_FILEWの呼び出しを実行する許可ユーザーが指定したデータベース名と区画番号です。
- スナップショット・モニター・データへのオープン・アクセスを提供することで、接続ユーザーのリスト、ユーザーがデータベースに送信したSQLステートメントなどのセンシティブ情報が、スナップショット・テーブル関数の実行権限(この権限はデフォルトでPUBLICに割り当てられる)のあるすべてのユーザーに提供されます。スナップショット・モニター・テーブル関数を使って、データベースからの実際のデータやパスワードなどをエクスポーズすることはできません。
SNAPSHOT_FILEWストアード・プロシージャーを呼び出すときは、モニターするデータベースと区画を特定し、さらに、スナップショット要求タイプ番号を指定する必要があります。これらの番号はそれぞれ、1つまたは複数のスナップショット・テーブル関数からアクセス可能なスナップショット・モニター情報のセットに対応しています。表3は、スナップショット・テーブル関数とそれに対応するスナップショット要求タイプ番号のリストです。
表3.スナップショット要求タイプ
| スナップショット・テーブル 関数
| スナップショット要求タイプ 番号 | スナップショット要求タイプ 番号
|
|---|
| SNAPSHOT_DBM | - | 1 | | SNAPSHOT_DATABASE | すべて | 9 | | SNAPSHOT_DATABASE | 特定 | 2 | | SNAPSHOT_APPL | すべて | 10 | | SNAPSHOT_APPL | 特定 | 6 | | SNAPSHOT_APPL_INFO | すべて | 10 | | SNAPSHOT_APPL_INFO | 特定 | 6 | | SNAPSHOT_LOCKWAIT | すべて | 10 | | SNAPSHOT_LOCKWAIT | 特定 | 6 | | SNAPSHOT_STATEMENT | すべて | 10 | | SNAPSHOT_STATEMENT | 特定 | 6 | | SNAPSHOT_TABLE | 特定 | 5 | | SNAPSHOT_LOCK | 特定 | 8 | | SNAPSHOT_TBS | 特定 | 13 | | SNAPSHOT_BP | すべて | 23 | | SNAPSHOT_BP | 特定 | 22 | | SNAPSHOT_DYN_SQL | 特定 | 36 |
SNAPSHOT_FILEWストアード・プロシージャーを使ってスナップショットをファイルに収集するには、次の手順を実行します。
-
データベースに接続します。モニターする必要のある、インスタンス上のデータベースです。スナップショット・テーブル関数を使ったSQL照会を実行するには、データベースへの接続が必要です。
例:
注記:このセクションに示す例は、sampleデータベースが作成済みであることを想定しています。まだ作成していない場合は、db2samplユーティリティーを使って作成することができます。
-
データベース・ユーザーが収集する必要のあるスナップショットのタイプ、モニターする必要のあるデータベースと区画を特定します。この情報を収集し、さらに、該当するモニター・スイッチをオンにします(表1.
スナップショット・テーブル関数で、スナップショット・テーブル関数の説明を確認してください)。
- スナップショット要求タイプ、データベース、区画を指定するスナップショット・パラメーター設定を付けて、SNAPSHOT_FILEWストアード・プロシージャーを呼び出します。
たとえば、下記は、現在接続している区画上のSAMPLEデータベースについてアプリケーション情報のスナップショットを収集する呼び出しです。
db2 "call SNAPSHOT_FILEW(6,
'sample',-1)"
|
SNAPSHOT_FILEWストアード・プロシージャには3つの入力パラメーターがあります。
- スナップショット要求タイプを指定するSMALLINT(表3. スナップショット要求タイプを参照してください。スナップショット・テーブル関数とそれに対応するスナップショット要求タイプ番号のクロスリファレンスが提供されています。)
- データベース名を指定するVARCHAR(128)。NULLを入力すると、現在接続しているデータベースの名前が使用されます。
注記:このパラメーターは、データベース・マネージャーの情報のみを返すスナップショット・テーブル関数(たとえばSNAPSHOT_DBM)には適用されません。そのタイプのスナップショット・テーブル関数には、スナップショット要求タイプ番号と区画番号のパラメーターしかありません。
- 区画番号を指定するSMALLINT。区画番号パラメーターについては、モニターする必要のある区画番号に対応する整数(0〜999の値)を入力します。現在接続している区画のスナップショットをキャプチャーするには、-1またはNULLの値を入力します。グローバル・スナップショットをキャプチャーするには、-2の値を入力します。

 |
SNAPSHOT_FILEWファイルからスナップショット・モニター・データへアクセスする手順
スナップショット・テーブル関数を使ってSNAPSHOT_FILEWファイルからスナップショット・データへアクセスするには、次の手順を実行します。
-
データベースに接続します。モニターする必要のある、インスタンス上のデータベースです。スナップショット・テーブル関数を使ったSQL照会を実行するには、データベースへの接続が必要です。
例:
db2 "select * from table
SNAPSHOT_APPL_INFO((CAST
(NULL AS VARCHAR(1)),
CAST (NULL AS INTEGER)))
AS as A"
|
-
収集する必要のあるスナップショットのタイプを指定します。データベース・ユーザーがSNAPSHOT_FILEWファイルにアクセスしようとするすべてのスナップショット・テーブル関数について、許可ユーザーにより、対応するスナップショット要求タイプ番号を指定したSNAPSHOT_FILEWストアード・プロシージャー呼び出しが実行されていなければなりません。また、データベース・ユーザーは、SNAPSHOT_FILEWの生成するファイルにアクセスするときに、データベース名と区画番号を特定することはできません。データベース名と区画番号は、SNAPSHOT_FILEWストアード・プロシージャー呼び出しを実行するユーザーにより指定されます。
-
希望するスナップショット・テーブル関数を使った照会を実行します。
下記は、現在の接続区画上のSAMPLEデータベースに接続しているアプリケーションについての情報のスナップショットを収集する照会の例です。
db2 "select * from table
SNAPSHOT_APPL_INFO((CAST
(NULL AS VARCHAR(1)),
CAST (NULL AS INTEGER)))
AS as A"
|
データベース名と区画番号は、SNAPSHOT_FILEWストアード・プロシージャーの呼び出しにより指定されているため、これらのパラメーターにはNULL値を入力することに留意してください。また、データベース名パラメーターは、データベース・マネージャー・レベルのスナップショット・テーブル関数には該当しません。このレベルでは、区画番号のパラメーターしかありません。項を参照してください。
結論
スナップショット・テーブル関数を利用すると、SQLを使ってデータベース・システム・モニター・データのスナップショットを簡単に収集することができます。SQLテーブルのモニター・データのセットを選択的に保存できる機能には、さまざまな利用方法があります。次のリストはその例の一部です。
- 選択したデータベース・システム・スナップショット・モニター・データのセットを、SYSADM、SYSMAINT、SYSCTRL特権のないユーザーが利用できるようにする
- データベース・システムのスナップショットを定期的な間隔で収集し保存する
- 特定期間にわたるデータベース・システムの使用状況とパフォーマンスについて統計分析を実施する
上記のいずれも、SQLとDB2 Task Center以外にはなにも必要とせずに簡単に実行することができます。これらを実際に行うことによって、データベース内で何が行われているかをよりよく理解し、データベースの管理能力を高め、最高のパフォーマンスを得られるようチューニングを行ってみてください。
参考文献
著者について  | |  | Dirk deRoosは、DB2情報開発チームのメンバーであり、データベース・モニタリングとDB2アプリケーション開発を専門に行っています。DB2認定ソリューション・エキスパート(アプリケーション開発、ビジネス・インテリジェンス)です。メールの宛先はdderoos_ibm at yahoo.caです。 |
記事の評価
|