db2look を使用したデータベースの模造

あるデータベースと構造が類似した別のデータベースを作成できると便利な場合がよくあります。 例えば、新しいアプリケーションやリカバリー・プランを実動システムでテストするより、ほぼ同じ構造とデータを持つテスト・システムを作成して、代わりにそのテスト・システムでテストする方が理にかなっています。

こうすることにより、実動システムの方は、テストによってパフォーマンス低下の影響を受けたり、エラーがあるアプリケーションによって誤ってデータを破壊されたりする心配がなくなります。 また、問題 (無効な結果やパフォーマンスの問題など) を調査する際には、実動システムとまったく同じテスト・システムを使った方が問題をデバッグしやすい場合もあります。

db2look ツールを使用すると、あるデータベースのデータベース・オブジェクトを別のデータベースに複製するのに必要な DDL ステートメントを抽出することができます。 このツールはまた、あるデータベースから別のデータベースに統計情報を複製するのに必要な SQL ステートメントや、データベース構成、データベース・マネージャー構成、およびレジストリー変数の複製に必要なステートメントを生成することもできます。 これは重要なことです。 なぜなら、これにより、新しいデータベースに元のデータベースとまったく同じデータ集合が含まれていなくても、2 つのシステムで同じアクセス・プランが選択されるようにすることができるからです。 db2look コマンドは、 Db2® バージョン 10.5 以降のリリースで実行されているデータベースに対してのみ発行してください。

db2look ツールの詳細については、「Db2 コマンド・リファレンス」を参照してください。オプションのリストについては、何もパラメーターを指定せずにこのツールを実行すると表示されます。 -h オプションを使用すると、より詳しい使い方が表示されます。

db2look によるデータベース内の表の模造

データベース内の表の DDL を抽出するには、-e オプションを使用します。 例として、SAMPLE2 という SAMPLE データベースのコピーを作成してみます。最初のデータベース内のすべてのオブジェクトが新しいデータベースに作成されるようにします。

C:\>db2 create database sample2
DB20000I The CREATE DATABASE command completed successfully.
C:\>db2look -d sample -e > sample.ddl
-- USER is:
-- Creating DDL for table(s)
-- Binding package automatically ...
-- Bind is successful
-- Binding package automatically ...
-- Bind is successful
注: ユーザー定義スペース、データベース・パーティション・グループ、およびバッファー・プールの DDL も生成する場合は、前のコマンドで -e の後に-l フラグを追加します。 デフォルトのデータベース・パーティション・グループ、バッファー・プール、および表スペースは抽出されません。 なぜなら、それらはすでにデフォルトで、すべてのデータベースに存在しているからです。 これらを模造する場合には、それらを手動で変更する必要があります。

sample.ddl ファイルをテキスト・エディターで開きます。 このファイルの DDL を新しいデータベースに対して実行するには、CONNECT TO SAMPLE ステートメントを CONNECT TO SAMPLE2 に変更する必要があります。 -l オプションを使用した場合には、表スペース・コマンドに関連したパスも、適切なパスを指すように変更する必要があるかもしれません。 この作業の間に、ファイルの内容の残りの部分を見てください。 サンプル・データベース内のすべてのユーザー表について、CREATE TABLE、ALTER TABLE、および CREATE INDEX ステートメントがあるはずです。

...
------------------------------------------------
-- DDL Statements for table "DB2"."ORG"
------------------------------------------------
 
 CREATE TABLE "DB2"."ORG"  (
		  "DEPTNUMB" SMALLINT NOT NULL , 
		  "DEPTNAME" VARCHAR(14) , 
		  "MANAGER" SMALLINT , 
		  "DIVISION" VARCHAR(10) , 
		  "LOCATION" VARCHAR(13) )   
		 IN "USERSPACE1" ;
...

接続ステートメントを変更したら、以下のように、そのステートメントを実行します。

C:\>db2 -tvf sample.ddl > sample2.out

出力ファイル sample2.out で、すべてが正しく実行されていることを確認します。 エラーが発生した場合は、エラー・メッセージで問題を確認できます。 それらの問題を修正したら、もう一度ステートメントを実行します。

出力を見るとわかるように、すべてのユーザー表の DDL がエクスポートされています。 これはデフォルトの動作ですが、操作に含める表を細かく指定するためのオプションもあります。 例えば、STAFF 表と ORG 表のみを含めるには、以下のように -t オプションを使用します。

C:\>db2look -d sample -e -t staff org > staff_org.ddl

スキーマ Db2 を持つ表だけを含めるには、以下のように -z オプションを使用します。

C:\>db2look -d sample -e -z db2 > db2.ddl

表の統計の模造

テスト・データベースの目的がパフォーマンスのテストやパフォーマンスの問題のデバッグにある場合は、両方のデータベースで同一のアクセス・プランが生成されるようにすることが重要です。 最適化プログラムは、統計、構成パラメーター、レジストリー変数、および環境変数に基づいてアクセス・プランを生成します。 これらが 2 つのシステムで同一であれば、同じアクセス・プランが生成されると考えられます。

両方のデータベースにまったく同じデータをロードし、同じオプションを指定して runstats を実行すれば、統計は同じになるはずです。 しかし、データベースに格納されているデータが異なっていたり、データの一部しかテスト・データベースで使われていなかったりすると、まったく異なる統計になります。 このような場合は、db2look を使用すると、実動データベースから統計情報を収集して、それをテスト・データベースに追加することができます。 そのためには、更新可能なカタログ表の SYSSTAT セットに対する UPDATE ステートメントと、すべての表に対する RUNSTATS コマンドを作成します。

統計ステートメントを作成するためのオプションは -m です。 SAMPLE/SAMPLE2 の例に戻って、SAMPLE からの統計を収集し、それらを SAMPLE2 に追加します。

C:\>db2look -d sample -m > stats.dml
-- USER is:
-- Running db2look in mimic mode 

前と同様に、出力ファイルを編集して、CONNECT TO SAMPLE ステートメントを CONNECT TO SAMPLE2 に変更する必要があります。 ここでまたファイルの残りの部分を見て、RUNSTATS ステートメントや UPDATE ステートメントのいくつかに何が含まれているのかを確認します。

...
-- Mimic table ORG
RUNSTATS ON TABLE "DB2"."ORG" ; 

UPDATE SYSSTAT.INDEXES
SET NLEAF=-1,
    NLEVELS=-1,
    FIRSTKEYCARD=-1,
    FIRST2KEYCARD=-1,
    FIRST3KEYCARD=-1,
    FIRST4KEYCARD=-1,
    FULLKEYCARD=-1,
    CLUSTERFACTOR=-1,
    CLUSTERRATIO=-1,
    SEQUENTIAL_PAGES=-1,
    PAGE_FETCH_PAIRS='',
    DENSITY=-1,
    AVERAGE_SEQUENCE_GAP=-1,
    AVERAGE_SEQUENCE_FETCH_GAP=-1,
    AVERAGE_SEQUENCE_PAGES=-1,
    AVERAGE_SEQUENCE_FETCH_PAGES=-1,
    AVERAGE_RANDOM_PAGES=-1,
    AVERAGE_RANDOM_FETCH_PAGES=-1,
    NUMRIDS=-1,
    NUMRIDS_DELETED=-1,
    NUM_EMPTY_LEAFS=-1
WHERE TABNAME = 'ORG' AND TABSCHEMA = 'DB2   ';
...

DDL を抽出する -e オプションの場合と同様、-t および -z オプションを使用して、表集合を指定できます。

構成パラメーターと環境変数の抽出

最適化プログラムは、統計、構成パラメーター、レジストリー変数、および環境変数に基づいてプランを選択します。 統計の場合と同様に、必要な構成更新ステートメントや構成設定ステートメントも、db2look を使って生成できます。 そのためには、-f オプションを使用します。 以下に例を示します。

c:\>db2look -d sample -f>config.txt
-- USER is: DB2INST1
-- Binding package automatically ...
-- Bind is successful
-- Binding package automatically ...
-- Bind is successful
config.txt には、以下の例のような出力が含まれます。
-- This CLP file was created using DB2LOOK Version 9.1
-- Timestamp: 2/16/2006 7:15:17 PM
-- Database Name: SAMPLE         
-- Database Manager Version: DB2/NT Version 9.1.0          
-- Database Codepage: 1252
-- Database Collating Sequence is: UNIQUE


CONNECT TO SAMPLE;

--------------------------------------------------------
-- Database and Database Manager configuration parameters
--------------------------------------------------------

UPDATE DBM CFG USING cpuspeed 2.991513e-007;
UPDATE DBM CFG USING intra_parallel NO;
UPDATE DBM CFG USING comm_bandwidth 100.000000;
UPDATE DBM CFG USING federated NO;

...

---------------------------------
-- Environment Variables settings
---------------------------------


COMMIT WORK;

CONNECT RESET;
注: Db2 コンパイラーに影響を与えるパラメーターと変数のみが組み込まれます。 コンパイラーに影響を与えるレジストリー変数がデフォルト値に設定されている場合、それは "Environment Variables settings" の下に表示されません。