[Lab 4] [Lab 4] [Lab 4] [Lab 4] Oracle Oracle Oracle Oracle からの からの からの からのデータベース データベース データベース データベース 移行 移行 移行 移行 2009 2009 2009 2009 年 12 12 12 12 月 日本 日本 日本 日本アイ アイ アイ アイ・ビー ビー ビー ビー・エム エム エム エム株式会社 株式会社 株式会社 株式会社
[Lab 4][Lab 4][Lab 4][Lab 4]
OracleOracleOracleOracle からのからのからのからのデータベースデータベースデータベースデータベース
移行移行移行移行
2009200920092009 年年年年 12121212 月月月月
日本日本日本日本アイアイアイアイ・・・・ビービービービー・・・・エムエムエムエム株式会社株式会社株式会社株式会社
2
Contents
CONTENTS ..........................................................................................................2
1. はじめにはじめにはじめにはじめに ........................................................................................................3
2. データベースデータベースデータベースデータベース作成作成作成作成 ..........................................................................................3
2.1 Oracle 互換機能の有効化 .........................................................................4
2.2 データベースパスのディレクトリー作成.................................................5
2.3 データベース LABDB を作成 ......................................................................6
2.4 作成したデータベースの確認...................................................................7
3. IBM DATA MOVEMENT TOOL でででで作成作成作成作成されたされたされたされた DDL......................................9
3.1 コマンドや構成ファイル..........................................................................9
3.2 オブジェクト作成のスクリプト .............................................................11
3.3 データ投入のためのスクリプト .............................................................11
3.4 PL/SQL のロジックを含むオブジェクトを作成するスクリプト ............12
3.5 その他のファイル...................................................................................12
4. オブジェクトオブジェクトオブジェクトオブジェクト作成作成作成作成 ........................................................................................14
4.1 IBM Data Movement Tool によるオブジェクト作成...............................14
4.2 スクリプトによるオブジェクト作成 ......................................................18
5. データデータデータデータ移行移行移行移行...................................................................................................25
5.1 データの LOAD.........................................................................................25
5.2 整合性チェック ......................................................................................26
5.3 統計情報の収集 ......................................................................................28
6.6.6.6. CLPPLUSCLPPLUSCLPPLUSCLPPLUS .....................................................................................................29
6.1 CLPPlus の開始......................................................................................29
6.2 CLPPlus を使用した SQL の実行 ...........................................................30
3
1. はじめにはじめにはじめにはじめに
このハンズオンでは、Oracle データベースのオブジェクトを、DB2V9.7 のデータベースに作
成し、データ移行を行います。
本ハンズオンは以下のタスクを含みます。
� Oracle から移行するデータベースを作成する
� IBM Data Movement Tool で抽出した DDL ファイルを確認する
� 物理設計に沿って DDL ファイルを編集する
� IBM Data Movement Tool で、Interactive deployment を実行する
� スクリプトで DB オブジェクトを作成する
なお、この章のハンズオンは、db2inst1 で OS にログインして下さい。root ユーザーなどで
ログインしている場合は、一度ログオフし、再度入りなおしてください。
_仮想マシンに以下のユーザーでログイン
User:User:User:User: db2inst1db2inst1db2inst1db2inst1
Password:Password:Password:Password: db2inst1db2inst1db2inst1db2inst1
2. データベースデータベースデータベースデータベース作成作成作成作成
この章では、DB2 のデータベースに、Oracle から移行したオブジェクトを作成します。
� インスタンス名:db2inst1 データベース名:LABDB
� DB2V9.7 の Oracle 互換機能 (DB2_COMPATIBILITY_VECTOR) を使用
� データベースは自動ストレージ機能を使用
4
2.1 OracleOracleOracleOracle 互換機能互換機能互換機能互換機能のののの有効化有効化有効化有効化
_1.以下の 2 つのレジストリー変数を設定して、Oracle 互換機能を有効にします。
� DB2_COMPATIBILITY_VECTOR
� DB2_DEFERRED_PREPARE_SEMANTICS
上記のレジストリー変数を以下の手順で設定してください。
a. 現在の設定値を db2set コマンドで確認 既に設定されている場合は、この設定手順
は必要ありません。次項に進んでください。
$db2set
b. db2set コマンドでレジストリー変数を設定
$db2set DB2_COMPATIBILITY_VECTOR=ORA
$db2set DB2_DEFERRED_PREPARE_SEMANTICS=YES
c. 変更後の設定値を db2set コマンドで取得
$db2set
d. 設定を有効にするために、DB2 インスタンスを再起動
$db2stop force
$db2start
実行例
db2inst1@DB2V97onSLES10:/workshop/lab4> db2set
DB2COMM=TCPIP
db2inst1@DB2V97onSLES10:/workshop/lab4> db2set DB2_COMPATIBILITY_VECTOR=ORA
db2inst1@DB2V97onSLES10:/workshop/lab4> db2set DB2_DEFERRED_PREPARE_SEMANTICS
=YES
db2inst1@DB2V97onSLES10:/workshop/lab4> db2set
DB2_DEFERRED_PREPARE_SEMANTICS=YES
DB2_COMPATIBILITY_VECTOR=ORA
DB2COMM=TCPIP
db2inst1@DB2V97onSLES10:/workshop/lab4> db2stop force
SQL1064N DB2STOP の処理が正常に終了しました。
db2inst1@DB2V97onSLES10:/workshop/lab4> db2start
09/05/2009 06:50:04 0 0 SQL1063N DB2START の処理が正常に終了しました。
SQL1063N DB2START の処理が正常に終了しました。
5
2222....2222 データベースパスデータベースパスデータベースパスデータベースパスののののディレクトリーディレクトリーディレクトリーディレクトリー作成作成作成作成
データベースのストレージは、データベースが作成される前に、作成してある必要がありま
す。この環境では既にディレクトリーを作成してありますので、ディレクトリーが存在するか
どうか確認してください。
_2.データベースのディレクトリー確認
_データベース・ディレクトリー:/db2system
_表スペースディレクトリー
/db2data1
/db2data2
/db2data3
/db2data4
_ディレクトリーの確認
$ls –l / | grep db2
確認例
db2inst1@DB2V97onSLES10:/workshop/lab4> ls -l / | grep db2
drwxr-xr-x 3 db2inst1 root 72 Sep 8 23:52 db2
drwxr-xr-x 2 db2inst1 root 48 Sep 9 05:31 db2data1
drwxr-xr-x 2 db2inst1 root 48 Sep 9 05:31 db2data2
drwxr-xr-x 2 db2inst1 root 48 Sep 9 05:31 db2data3
drwxr-xr-x 2 db2inst1 root 48 Sep 9 05:31 db2data4
drwxr-xr-x 2 db2inst1 root 48 Sep 9 05:31 db2system
drwxr-xr-x 12 db2inst1 root 344 Sep 8 23:57 workshop
6
2222....3333 データベースデータベースデータベースデータベース LABDBLABDBLABDBLABDB をををを作成作成作成作成
IBM Optim Data Studio Administrator を使用して GUI でデータベースを作成することが
出来ます。または、CLP を使用して SQL ステートメントやスクリプトを実行することでデ
ータベースを作成することも出来ます。
_3.前ステップで作成したディレクトリーに“LABDB”という名前のデータベースを作成し
ます。DB 作成にあたっては、デフォルトのページサイズと自動ストレージ機能を使用し
ます。
データベースの作成のステートメントは以下になります。
CREATE DB LABDB AUTOMATIC STORAGE YES
ON /db2data1,
/db2data2,
/db2data3,
/db2data4
DBPATH ON /db2system
PAGESIZE 32K;
上記のステートメントは、/workshop/lab4 ディレクトリーに”01.CreateDatabase.clp”とい
う名前のスクリプトが用意してあります。スクリプトを以下のように、db2 –tvf コマンドで
実行することが出来ます。
_/workshop/lab4 ディレクトリーに移動
$cd /workshop/lab4
_データベース作成スクリプトの内容を確認
$cat 01.CreateDatabase.clp
_データベース作成スクリプトを実行
$db2 –tvf 01.CreateDatabase.clp
db2inst1@DB2V97onSLES10:~> cd /workshop/lab4
db2inst1@DB2V97onSLES10:/workshop/lab4> cat 01.CreateDatabase.clp
CREATE DB LABDB AUTOMATIC STORAGE YES
ON /db2data1,
/db2data2,
/db2data3,
/db2data4
DBPATH ON /db2
PAGESIZE 32 K;
db2inst1@DB2V97onSLES10:/workshop/lab4> db2 -tvf 01.CreateDatabase.clp
CREATE DB LABDB AUTOMATIC STORAGE YES ON /db2data1, /db2data2, /db2data3,
/db2data4 DBPATH ON /db2 PAGESIZE 32 K
DB20000I CREATE DATABASE コマンドが正常に完了しました。
7
2222....4444 作成作成作成作成したしたしたしたデータベースデータベースデータベースデータベースのののの確認確認確認確認
データベース作成が成功したことを、いくつかの方法で確認することが出来ます。
<データベースへの接続>
データベースへの接続はインスタンスオーナーで接続します。
_4. LABDB へ接続し、DUAL 表から SYSDATE を SELECT する
$db2 connect to labdb
$db2 select sysdate from dual
$db2 connect reset
実行例
<ローカル・データベース・ディレクトリーの確認>
ローカル・データベース・ディレクトリーは、データベース名、エイリアス、データベース・
パスなどの情報のエントリーです。このエントリーは、アプリケーションから接続するとき
に指定するエントリーになります。データベース・ディレクトリーの内容を表示するために
は、以下のコマンドを実行します。
$db2 list db directory
_5. ローカル・データベース・ディレクトリーを確認し、以下を記入してください
データベース別名 ________________________________________________________________________
データベース・ディレクトリー___________________________________________________________________
ディレクトリー項目タイプ_________________________________________________________________________
db2inst1@DB2V97onSLES10:/workshop/lab4> db2 connect to labdb
データベース接続情報
データベース・サーバー = DB2/LINUX 9.7.0
SQL 許可 ID = DB2INST1
ローカル・データベース別名 = LABDB
db2inst1@DB2V97onSLES10:/workshop/lab4> db2 select sysdate from dual
1
-------------------
2009-09-09-05.40.41
1 レコードが選択されました。
db2inst1@DB2V97onSLES10:/workshop/lab4> db2 connect reset
DB20000I SQL コマンドが正常に完了しました。
8
実行例
<データベース構成パラメーターの確認>
DB2V9.7 では Oracle 互換機能に関連した 3 つのデータベース構成パラメーターが提
供されています。構成パラメーターは、NUMBER,VARCHAR2,DATE の新しいデータタイ
プを制御します。
_6. 作成した LABDB で Oracle 互換の構成パラメーターを確認
データベース構成パラメーターの現在の設定を確認するためには、以下のコマンドを実
行します。
$db2 get db cfg for LABDB
実行例
db2inst1@DB2V97onSLES10:/workshop/lab4> db2 list db directory
システム・データベース・ディレクトリー
ディレクトリー中の項目数 = 1
データベース 1 項目:
データベース別名 = LABDB
データベース名 = LABDB
ローカル・データベース・ディレクトリー = /db2
データベース・リリース・レベル = d.00
コメント =
ディレクトリー項目タイプ = 間接
カタログ・データベース・パーティション番号 = 0
代替サーバー・ホスト名 =
代替サーバーのポート番号 =
db2inst1@DB2V97onSLES10:/workshop/lab4> db2 get db cfg for LABDB
データベースのデータベース構成 LABDB
データベース構成リリース・レベル = 0x0d00
データベース・リリース・レベル = 0x0d00
データベース・テリトリー = JP
データベース・コード・ページ = 1208
データベース・コード・セット = UTF-8
データベース国/地域コード = 81
データベース照合順序 = IDENTITY
代替照合シーケンス (ALT_COLLATE)
NUMBER データデータデータデータ・・・・タイプタイプタイプタイプのののの互換性互換性互換性互換性 = ON
VARCHAR2 データデータデータデータ・・・・タイプタイプタイプタイプのののの互換性互換性互換性互換性 = ON
データデータデータデータ・・・・タイプタイプタイプタイプ DATE のののの TIMESTAMP(0) へのへのへのへの互換性互換性互換性互換性 = ON
・・・
9
3. IBM Data Movement Tool でででで作成作成作成作成されたされたされたされた DDL
IBM Data Movement Tool では、Oracle データベースへ接続し、移行先の DB2デー
タベースへオブジェクトやデータを移行するためにの DDL ファイルやスクリプトを作
成することが出来ます。このハンズオンの目的は、IBM Data Movement Tool で作成
された DDL ファイルやスクリプトを理解してもらうことです。
IBM Data Movement Tool で作成された DDL ファイルは、/workshop/ddl 配下に配置
してあります。/workshop/ddl には以下のサブディレクトリーがあります。
� ddl_and_data
このディレクトリは、IBM Data Movement Tool で ”DDL and Data Movement” オプシ
ョンを指定した場合に生成される全てファイル DDL とデータのファイルが配置されて
います。
� ddl_only
このディレクトリには、“DDL”オプションのみを指定した場合に生成されるファイルが
あります。
� data_only
このディレクトリには、“Data”オプションのみを指定した場合に生成されるファイルが
あります。
Note:Note:Note:Note: IBM Data Movement Tool は UNIX/Linux、Windows でスクリプトファイルを作
成することが出来ます。スクリプトは、プラットフォームによって異なる拡張子になりま
す。(例 UNIX/Linux では db2gen.sh というファイルに対し、Windows では
db2get.cmd というファイルが作成される。)IBM Data Movement Tool では自動的にプ
ラットフォームを検知します。今回のハンズオンでは、UNIX/Linux プラットフォームに
しています。
3.1 コマンドコマンドコマンドコマンドやややや構成構成構成構成ファイルファイルファイルファイル
以下の表は、DDL/Data の抽出を GUI、またはコマンドラインから実行した場合に、作成さ
れるコマンドのファイルの一覧になります。コマンドファイルを使用することで、タスクをコマ
ンドラインから実行することが出来ます。例えば、”unload”コマンドファイルは、インプットフ
ァイルでリストされた表からデータを抽出します。このコマンドは GUI が使用できない環境
では、役に立ちます。
10
ファイルファイルファイルファイル名名名名 説明説明説明説明
geninput <SID>.tables で使用される表のリストを作成するコマンドファイ
ルです。
<SID>.tables このファイルは、DDL や Data を抽出した場合や、geninput コ
マンドを手動で実行したときに、作成されます。このファイルは
オブジェクト作成やデータ移行のために使用される表名のリス
トファイルになります。移行が必要ない表があるような場合は、
手動でこのファイルを修正し、除外することが出来ます。“SID”
は Oracle のシステム ID です。SID は通常データベース名と同
様の場合が多いです。
unload このスクリプトは、データベースオブジェクト(表、ビュー、シー
ケンスなど)をデプロイするためのスクリプトを生成します。この
スクリプトは、各表からデータをファイルに抽出する際にも使用
されます。
rowcount <SID>.tables ファイルでリストされている表の行数をカウントし
ます。作成した表データの整合性を確認するために使用するこ
とが出来ます。
db2ddl.sh ターゲット DB に DDL ファイルを実行するスクリプトです。この
ファイルは、DDL の抽出を選択した場合に作成されます。
db2load.sh ターゲット DB にデータを投入するスクリプトです。
db2checkRemoval.sh や rowcount、RUNSTATS などの処理を
含みます。このファイルは Data の抽出を選択した場合に作成
されます。”DDL and Data” を選択した場合、db2gen.sh を実行
する場合と同じになります。
db2gen.sh このスクリプトは、ターゲット DB に DDL を実行し、データを投
入します。
db2checkRemoval.sh Set integrity pending (整合性チェック待ち)状態を解消しま
す。このスクリプトは、set integrity pending 状態の表への set
integrity ステートメントを作成し、実行します。
db2dropobjects.sh このコマンドファイルは、データベース・オブジェクトを削除しま
す。削除するオブジェクトは、表やシーケンス、表スペース、バ
ッファプールを含みます。
IBMExtract.properties IBM Data Movement Tool の設定や接続情報が格納されたプ
ロパティファイルです。このファイルは、DDL または Data(もしく
は両方)の抽出操作をすると作成されます。
11
<DDL ディレクトリーを確認>
_7. db2tables.sql ファイルにはいくつの表が含まれていますか?_______________________________
_8. orcl.tables ファイルにはいくつの表が含まれていますか?__________________________________
3.2 オブジェクトオブジェクトオブジェクトオブジェクト作成作成作成作成ののののスクリプトスクリプトスクリプトスクリプト
以下の表は、データベースオブジェクトを作成するための DDL ファイルの一覧になりま
す。もし以下の表を使用して手動でオブジェクトを作成する場合には、オブジェクト間の
依存関係に注意して実行して下さい。これらのスクリプトは、db2ddl.sh というシェルスク
リプトにも含まれています。db2ddl.sh を実行することで、一度に作成することが出来ま
す。
また、DDL をデータベース設計にあわせて修正することが出来ます。
ファイルファイルファイルファイル名名名名 説明説明説明説明
db2tsbp.sql バッファプールと表スペース作成のための DDL
db2udf.sql ユーザー定義関数を作成するための DDL
db2tables.sql 表作成のための DDL
db2default.sql 列のデフォルト値を定義するための DDL
db2sequences.sql シーケンスオブジェクトを作成するための DDL
db2synonyms.db2 シノニム(DB2 ではエイリアスという)を作成するための DDL
db2check.sql 制約チェックのための DDL
db2cons.sql ユニーク制約(プライマリー・キー制約やユニークインデックス
の定義を含む)のための DDL
db2fkeys.sql 外部キー制約のための SQL
3.3 データデータデータデータ投入投入投入投入のためののためののためののためのスクリプトスクリプトスクリプトスクリプト
IBM Data Movement Tool は、データ移行のためのデータファイルを作成します。通常、移
行先のデータベースと、移行元のデータベースは別サーバーにあることが多いです。その
ため、移行先のデータベースで、これらのスクリプトを実行し、データを移行する必要があ
ります。高速ネットワークで移行元と移行先のサーバーを接続することが出来る場合は、
IBM Data Movement Tool を使用して、ファイル経由ではなく、直接接続して移行すること
12
が出来ます。この方法は、移行元のディスクに十分な一時領域が確保できない場合に有
用です。
ファイルファイルファイルファイル名名名名 説明説明説明説明
db2load.sql LOAD のための DDL です。このスクリプトとデータは、移行先
のサーバーにある必要があります。
db2loadterminate.db このコマンドファイルは、Load Pending 状態を解消するために
使用します。LOAD処理が途中で中断されたような場合には、
ターゲットの表は Load Pending 状態になります。その状態を
解消するためにこのスクリプトを使用してください。
3.4 PL/SQL ののののロジックロジックロジックロジックをををを含含含含むむむむオブジェクトオブジェクトオブジェクトオブジェクトをををを作成作成作成作成
するするするするスクリプトスクリプトスクリプトスクリプト
以下の表は、プロシージャーや、パッケージ、トリガー、ビューなどのオブジェク
トを作成する DDL のリストになります。
ファイルファイルファイルファイル名名名名 説明説明説明説明
db2plsql_function.db2 PL/SQL 関数を有効にする DDL
db 2plsql_package.db2 PL/SQL パッケージを有効にする DDL
db 2plsql_package_body.db2 PL/SQL パッケージ本体を有効にする DDL
db 2plsql_procedure.db2 PL/SQL プロシージャーを有効にする DDL
db 2plsql_trigger.db2 トリガーを有効にする DDL
db 2plsql_type.db2 データ・タイプを有効にする DDL
db 2plsql_type_body.db2 データ・タイプ本体を有効にする DDL
db 2plsql_views.db2 ビューを有効にする DDL
3.5 そのそのそのその他他他他ののののファイルファイルファイルファイル
オブジェクト作成やデータ移行を実行するスクリプトに加えて、IBM Data Movement Tool
は、ユーティリティーを実行するためのスクリプトも適用しています。
13
ファイルファイルファイルファイル名名名名 説明説明説明説明
db2tabcount.sql 表の行数をカウントするスクリプトです。表のリストは、DDL の
抽出の段階で決まります。<SID>.tables の表のリストを参照
しているわけではありません。
db2tabstatus.sql 制約の状況を調べるスクリプトです。
db2checkpending.sql SET INTEGRITY を実行するスクリプトです。対象の表は抽出
の段階で決まり、表のリストファイルから選んでいるわけでは
ありません。
db2droptables.db2 表を削除するスクリプトです。対象の表は抽出の段階で決ま
り、表のリストファイルから選んでいるわけではありません。
db2fkdrop.sql 外部キー制約を削除するスクリプトです。もしデータ投入前に
このスクリを実行した場合、データの投入順序を考慮する必要
がなくなります。外部キー制約は、データ投入後に、
db2fkeys.sql や db2checkpending.sql で再定義することが出来
ます。
db2objprivs.db2 オブジェクトの特権を与えるスクリプトです。
db2roleprivs.db2 ロールを付与するスクリプトです。
db2runstats.sql RUNSTATS ステートメントを含んだステートメントです。
RUNSTATS は DDL 作成とデータ移行後に行うことをお勧めし
ます。
14
4. オブジェクトオブジェクトオブジェクトオブジェクト作成作成作成作成
4.1 IBM Data Movement Tool によるによるによるによるオブジェオブジェオブジェオブジェ
クトクトクトクト作成作成作成作成
このハンズオンでは、IBM Data Movement Tool の GUI インターフェースで、オブジェクトを
作成します。
_1. IBM Data Movement Tool を開始する
a. セッションを開始し、/workshop/IBMDataMovementToolのディレクトリーに移動する
b. start スクリプトを開始する
$cd /workshop/IBMDataMovementTool
$./IBMDataMovementTool.sh
*Data Movement Tool が GUI で起動しない場合には、一度ログオフし、db2inst1 で
OS にログインしなおしてください。
_2. 以下の情報を使用して DB2 に接続する
IBM Data Movement Tool は、データベースに接続する情報を表示します。このハンズオ
ンでは、Oracle データベースは導入されていないので、DB2 のデータベースのみがありま
す。
パラメーターパラメーターパラメーターパラメーター 設定値設定値設定値設定値
Server Name Localhost
Port Number 60000
Database Name LABDB
db2inst1@DB2V97onSLES10:/workshop> cd IBMDataMovementTool/
db2inst1@DB2V97onSLES10:/workshop/IBMDataMovementTool> ls
IBMDataMovementTool.cmd IBMDataMovementTool.jar IBMDataMovementTool.sh
db2inst1@DB2V97onSLES10:/workshop/IBMDataMovementTool> ./IBMDataMovementTool.sh
[2009-09-14 02.16.59.745] INPUT Directory = .
[2009-09-14 02.16.59.749] Configuration file loaded: 'jdbcdriver.properties'
[2009-09-14 02.16.59.752] appJar :
'/workshop/IBMDataMovementTool/IBMDataMovementTool.jar'
15
User ID db2inst1
Password db2inst1
JDBC Drivers /opt/ibm/db2/V9.7/java/db2jcc.jar:/opt/ibm/db2/V9.7/java/db2jcc_licen
se_cu.jar
以下のように DB2 の接続情報を記入し、DB2 に接続してください。
*ここでは、defect_ruondingの設定が、RUOUND_HALF_UP ではないという Warningが出
力されていますが、このハンズオンのシナリオを進めていくうえで、問題はありません。
defect_ruondingは 10 進浮動小数点 (DECFLOAT) の丸めモードを指定するデータベース
構成パラメーターです。DB2 のデフォルトでは、ROUND_HALF_EVEN(最も近い値に丸め込
み、等距離の場合は、結果の数字が偶数になるように丸める)の設定になっていますが、
今回のハンズオンで移行してきた Oracle の設定は、ROUND_HALF_UP(最も近い値に丸
め込み、等距離の場合は、1 に切り上げる)になっています。
_3. Interactive Deploy の GUI を使用してバッファプールを作成する
a. 「Interactive Deploy」タブを選択し、左上のフォルダのアイコンを選択してください。
16
b. Select output directoryウィンドウが開いたら、/workshop/lab4/ddl を選択してください。
以下のように、オブジェクトのツリーが表示されます。オブジェクトの前に表示されているア
イコンは、まだオブジェクトが作成されていないことを示します。
c.BP32 のバッファプールを作成します。BP32 を選択し、右クリックで「Deploy Selected
objects in DB2」を選択します。
17
デプロイ結果は、下のペインにも表示されています。以下のように BP32 のデプロイに成
功したことが確認できます。
一度に複数のオブジェクトを選択することも可能です。残りの全てのバッファプールを複数
選択し、同じように、右クリックで「Deploy Selected objects in DB2」を選択します。以下の
ように、デプロイが終了したことが確認できます。
_4. Interactive Deploy の GUI を使用して、先ほどのバッファプールのデプロイと同じよう
に、全ての表スペースをデプロイしてください。
以下の SQL を実行することで、作成された表スペースについて確認できます。
SELECT
substr(TBSP_NAME,1,15) TBSP,
18
TBSP_TYPE,
TBSP_PAGE_SIZE
FROM table(MON_GET_TABLESPACE ('',-1));
上記の SQL は、/workshop/lab4 配下の 02.check_tbsp.sql スクリプトでも実行できます。
この SQL またはスクリプトを実行することで、LABDB に作成された表スペースについて確
認してください。
4.2 スクリプトスクリプトスクリプトスクリプトによによによによるるるるオブジェクトオブジェクトオブジェクトオブジェクト作成作成作成作成
このセクションでは、IBM Data Movement Tool が作成したスクリプトを使用してオブジェク
トを作成します。いくつかのオブジェクトは依存関係があるため、データベース・オブジェク
トをスクリプトで作成するためには、以下の手順で実行して下さい。
1. バッファプール、表スペースを作成
2. ユーザー定義関数を作成
3. 表を作成
db2inst1@DB2V97onSLES10:/workshop/lab4> db2 -tvf 02.check_tbsp.sql
CONNECT TO LABDB
データベース接続情報
データベース・サーバー = DB2/LINUX 9.7.0
SQL 許可 ID = DB2INST1
ローカル・データベース別名 = LABDB
SELECT substr(TBSP_NAME,1,15) TBSP, TBSP_TYPE, TBSP_PAGE_SIZE FROM
table(MON_GET_TABLESPACE ('',-1))
TBSP TBSP_TYPE TBSP_PAGE_SIZE
--------------- ---------- --------------------
SYSCATSPACE DMS 32768
TEMPSPACE1 SMS 32768
USERSPACE1 DMS 32768
SYSTOOLSPACE DMS 32768
TS32 DMS 32768
TS8 DMS 8192
TSSTMP32 SMS 32768
TSU8 SMS 8192
TSUTMP32 SMS 32768
9 レコードが選択されました。
19
4. 表のカラムにデフォルトの属性を定義
5. シーケンスの作成
6. シノニムの定義
7. プライマリーキー制約とユニーク索引の追加
8. チェック制約
9. 外部キー制約の追加
バッファプールと表スペースは、前章のハンズオンで作成しました。今回はユーザー定義
関数(UDF)はないため、表作成に入ります。
なお、このハンズオンで使用するスクリプトは、/workshop/lab4/ddl 配下にあります。
_1. 表作成
db2tables.sql を以下のように実行して下さい。
$db2 –tvf db2tables.sql
実行後、7 つの表が作成に成功し、WAREHOUSES の表が以下のようなエラーで失敗しま
す。
上記のメッセージから、VARCHAR2 のカラム長が長すぎるため、エラーになっていることが
分かります。もし実際のデータが 32677 バイトよりも短い場合には、表定義を変更するこ
とも出来ます。加えて DB2V9.7 では、LOB インライン格納の新機能が提供されています。
このインライン機能により、LOB データもバッファプールを使用することが出来るようになる
ため、LOB データへのアクセスのパフォーマンスが向上されています。このハンズオンで
は、WAREHOUSES 表の VARCHAR2 列をインライン格納の CLOB に変更します。
db2tables.sql を編集するか、もしくは新しく DDL ファイルを作成してください。
CREATE TABLE "SALES"."WAREHOUSES" ( "WAREHOUSE_ID" NUMBER(5) NOT NULL ,
"LOCATION_ID" NUMBER(5) NOT NULL , "LOCATION_SEQ" NUMBER(5) NOT NULL ,
"SEQUENCE1" NUMBER(22) NOT NULL , "SEQUENCE2" NUMBER(22) , "WH_DESCRIPTION1"
VARCHAR2(4000) , "WH_DESCRIPTION2" VARCHAR2(4000) , "WH_DESCRIPTION3"
VARCHAR2(4000) , "WH_DESCRIPTION4" VARCHAR2(4000) , "WH_DESCRIPTION5"
VARCHAR2(4000) , "WH_DESCRIPTION6" VARCHAR2(4000) , "WH_DESCRIPTION7"
VARCHAR2(4000) , "WH_DESCRIPTION8" VARCHAR2(4000) , "WH_DESCRIPTION9"
VARCHAR2(4000) )
DB21034E コマンドが、有効なコマンド行プロセッサー・コマ
ンドでないため、 SQL
ステートメントとして処理されました。 SQL
処理中に、そのコマンドが返されました。
SQL0670N 表の行の長さが "32677"
バイトの制限を超えています。 (表スペースは ""。)
SQLSTATE=54010
20
WAREHOUSES 表の DDL(変更前)
修正した WAREHOUSES 表の DDL
修正後の warehouse.clp は/workshop/lab4/ddl_modified にあります。
warehouse.clp の実行の前に、LABDB に接続して下さい。
実行例
--#SET :TABLE:SALES:WAREHOUSES
CREATE TABLE "SALES"."WAREHOUSES"
(
"WAREHOUSE_ID" NUMBER(5) NOT NULL ,
"LOCATION_ID" NUMBER(5) NOT NULL ,
"LOCATION_SEQ" NUMBER(5) NOT NULL ,
"SEQUENCE1" NUMBER(22) NOT NULL ,
"SEQUENCE2" NUMBER(22) ,
"WH_DESCRIPTION1" VARCHAR2(4000) ,
"WH_DESCRIPTION2" VARCHAR2(4000) ,
"WH_DESCRIPTION3" VARCHAR2(4000) ,
"WH_DESCRIPTION4" VARCHAR2(4000) ,
"WH_DESCRIPTION5" VARCHAR2(4000) ,
"WH_DESCRIPTION6" VARCHAR2(4000) ,
"WH_DESCRIPTION7" VARCHAR2(4000) ,
"WH_DESCRIPTION8" VARCHAR2(4000) ,
"WH_DESCRIPTION9" VARCHAR2(4000) );
--#SET :TABLE:SALES:WAREHOUSES
CREATE TABLE "SALES"."WAREHOUSES"
(
"WAREHOUSE_ID" NUMBER(5) NOT NULL ,
"LOCATION_ID" NUMBER(5) NOT NULL ,
"LOCATION_SEQ" NUMBER(5) NOT NULL ,
"SEQUENCE1" NUMBER(22) NOT NULL ,
"SEQUENCE2" NUMBER(22) ,
"WH_DESCRIPTION1" CLOB(4000) INLINE LENGTH 3000 ,
"WH_DESCRIPTION2" CLOB(4000) INLINE LENGTH 3000 ,
"WH_DESCRIPTION3" CLOB(4000) INLINE LENGTH 3000 ,
"WH_DESCRIPTION4" CLOB(4000) INLINE LENGTH 3000 ,
"WH_DESCRIPTION5" CLOB(4000) INLINE LENGTH 3000 ,
"WH_DESCRIPTION6" CLOB(4000) INLINE LENGTH 3000 ,
"WH_DESCRIPTION7" CLOB(4000) INLINE LENGTH 3000 ,
"WH_DESCRIPTION8" CLOB(4000) INLINE LENGTH 3000 ,
"WH_DESCRIPTION9" CLOB(4000) INLINE LENGTH 3000
)
;
db2inst1@DB2V97onSLES10:/workshop/lab4> db2 -tvf warehouse.clp
CREATE TABLE "SALES"."WAREHOUSES" ( "WAREHOUSE_ID" NUMBER(5) NOT NULL ,
"LOCATION_ID" NUMBER(5) NOT NULL , "LOCATION_SEQ" NUMBER(5) NOT NULL ,
"SEQUENCE1" NUMBER(22) NOT NULL , "SEQUENCE2" NUMBER(22) , "WH_DESCRIPTION1"
CLOB(4000) INLINE LENGTH 3000 , "WH_DESCRIPTION2" CLOB(4000) INLINE LENGTH
3000 , "WH_DESCRIPTION3" CLOB(4000) INLINE LENGTH 3000 , "WH_DESCRIPTION4"
CLOB(4000) INLINE LENGTH 3000 , "WH_DESCRIPTION5" CLOB(4000) INLINE LENGTH
3000 , "WH_DESCRIPTION6" CLOB(4000) INLINE LENGTH 3000 , "WH_DESCRIPTION7"
CLOB(4000) INLINE LENGTH 3000 , "WH_DESCRIPTION8" CLOB(4000) INLINE LENGTH
3000 , "WH_DESCRIPTION9" CLOB(4000) INLINE LENGTH 3000 )
DB20000I SQL コマンドが正常に完了しました。
21
_2. 表のカラムにデフォルトの属性を定義
db2default.sql スクリプトを使用して属性を定義します。このスクリプトは ACCOUNTS 表と
EMPLOYEES 表の 3 列に属性を定義します
$db2 –tvf db2default.sql
以下の SQL を実行することで、設定されたかどうか確認することが出来ます。
/workshop/lab4 ディレクトリに 03.check_defaults.sql スクリプトでも実行する
ことが出来ます。
SELECT SUBSTR(TABNAME,1,15) TABLE,
SUBSTR(COLNAME,1,20) COLUMN,
DEFAULT
FROM SYSCAT.COLUMNS
WHERE TABSCHEMA='SALES' AND
LENGTH(DEFAULT)>0
/workshop/lab4 配下にある 03.check_defaults.sql のスクリプトに上記の
SQL がありますので、必要に応じてご利用下さい。
確認例
_3. シーケンスの作成
シーケンスの作成は、db2sequences.sql を実行します。
db2inst1@DB2V97onSLES10:/workshop/lab4/ddl> db2 -tvf db2default.sql
CONNECT TO LABDB
(省略)
ALTER TABLE "SALES"."ACCOUNTS" ALTER COLUMN "CLOSED_DATE" SET WITH DEFAULT
SYSDATE
DB20000I SQL コマンドが正常に完了しました。
ALTER TABLE "SALES"."EMPLOYEES" ALTER COLUMN "CREATE_DATE" SET WITH DEFAULT
SYSDATE
DB20000I SQL コマンドが正常に完了しました。
TERMINATE
DB20000I TERMINATE コマンドが正常に完了しました。
db2inst1@DB2V97onSLES10:/workshop/lab4> db2 -tvf 03.check_defaults.sql
CONNECT TO LABDB
(省略)
SELECT SUBSTR(TABNAME,1,15) TABLE, SUBSTR(COLNAME,1,20) COLUMN, DEFAULT FROM
SYSCAT.COLUMNS WHERE TABSCHEMA='SALES' AND LENGTH(DEFAULT)>0
TABLE COLUMN DEFAULT
--------------- -------------------- --------------------------------------------
ACCOUNTS CREATE_DATE "SYSIBM"."TIMESTAMP"(CURRENT TIMESTAMP)
ACCOUNTS CLOSED_DATE "SYSIBM"."TIMESTAMP"(CURRENT TIMESTAMP)
EMPLOYEES CREATE_DATE "SYSIBM"."TIMESTAMP"(CURRENT TIMESTAMP)
3 レコードが選択されました。
22
$db2 –tvf db2sequences.sql
ここでは、表定義の別の確認方法を紹介します。DB2 の DB から DDL を抽出する
db2look ユーテリティです。db2look の出力結果から、シーケンスが作成されたかどう
か確認してください。db2look は以下のコマンドで実行することが出来ます。
$db2look –d LABDB –e –o db2look.e.log
デフォルトでは、db2look は標準出力で結果を表示するため、上記のように-o オプショ
ンで出力先のファイルを指定するか、もしくはファイルにリダイレクトすることをお勧めしま
す。
実行例
db2inst1@DB2V97onSLES10:/workshop/lab4/ddl> db2 -tvf db2sequences.sql
CONNECT TO LABDB
(省略)
CREATE SEQUENCE "SALES"."EMPLOYEE_SEQUENCE" MINVALUE 2 MAXVALUE 2147483647
INCREMENT BY 1 CACHE 20 NOCYCLE NOORDER
DB20000I SQL コマンドが正常に完了しました。
TERMINATE
DB20000I TERMINATE コマンドが正常に完了しました。
db2inst1@DB2V97onSLES10:/workshop/lab4/ddl> db2look -d LABDB -e -o db2look.e.log
-- ユーザー ID が指定されていません。db2look は環境変数 USER の使用を試行します
-- USER は以下のとおりです: DB2INST1
-- 表の DDL の作成
-- 出力がファイルに送信されます: db2look.e.log
-- パッケージを自動的にバインドしています ...
-- バインドは正常に終了しました
-- パッケージを自動的にバインドしています ...
-- バインドは正常に終了しました
db2inst1@DB2V97onSLES10:/workshop/lab4/ddl> head -100 db2look.e.log
-- この CLP ファイルの作成に使用した DB2LOOK のバージョン: "9.7"
-- タイム・スタンプ: 2009 年 09 月 14 日 05 時 48 分 32 秒
(省略)
CONNECT TO LABDB;
---------------------------------
-- シーケンスの DDL ステートメント
---------------------------------
CREATE SEQUENCE "SALES "."EMPLOYEE_SEQUENCE" AS DECIMAL(27, 0)
MINVALUE 2 MAXVALUE 2147483647
START WITH 2 INCREMENT BY 1
CACHE 20 NO CYCLE NO ORDER;
------------------------------------------------
-- 表の DDL ステートメント "SALES "."WAREHOUSES"
------------------------------------------------
CREATE TABLE "SALES "."WAREHOUSES" (
"WAREHOUSE_ID" DECIMAL(5,0) NOT NULL ,
23
_4. シノニムの定義
db2synonymus.db2 を使用して、シノニムを作成します。
$db2 -tvf db2synonyms.db2
IBM Data Movement Tool は、全てのスキーマのシノニムを抽出するため、もし移行
先で定義する必要のないシノニムは db2synonyms.db2 から削除してから実行してくd
さい。
シノニムの作成の確認は、先ほどの db2look でも確認することが出来ます。db2look
の出力結果から CREATE ALIAS ステートメントを確認してください。
_5. プライマリーキー制約とユニーク索引の追加
以下のように、db2cons.sql のスクリプトを実行して下さい。
$db2 -tvf db2cons.sql
追加処理が正常に完了したかどうか、db2look を取得し確認してください。
_6. チェック制約
以下のように、db2check.sql のスクリプトを実行して下さい。
$db2 -tvf db2check.sql
チェック制約の定義 db2look の以下の出力結果から分かります。
出力例
_7. 外部キー制約の追加
以下のように、db2fkeys.sql スクリプトを実行する。
$db2 -tvf db2fkeys.sql
Note:Note:Note:Note: オブジェクトをスクリプトで一度に作成する場合、db2ddl.sh スクリプトを使用するこ
とも出来ます。今回のハンズオンのようにオブジェクトごとにスクリプトを実行する場合は、
次の段階に行く前に、それぞれのエラーを修正することが可能です。
-- 表のチェック制約の DDL ステートメント "SALES "."EMPLOYEES"
ALTER TABLE "SALES "."EMPLOYEES"
ADD CONSTRAINT "CK1_EMPLOYEES" CHECK
(BAND IN ('1', '2', '3', '4', '5'))
ENFORCED
ENABLE QUERY OPTIMIZATION;
24
そしてもし、データ移行とオブジェクトの作成を一緒に実行したい場合は、db2gen.sh を使
用してください。db2ddl.sh と db2gen.sh はほぼ同じスクリプトです。違いとしては、
db2gen.sh はデータの投入スクリプトも含まれていることです。
25
5. データデータデータデータ移行移行移行移行
この章では、Oracle から抽出したデータを DB2 に移行します。
5555....1111 データデータデータデータのののの LOADLOADLOADLOAD
IBM Data Movement Tool が抽出したデータの LOAD のスクリプト、db2load.sql を使用し
ます。
LOAD コマンドは以下の 3 つのファイルを使用します。
� データファイル
� ダンプファイル(デフォルトではコメントアウトされている)
� メッセージファイル
これらのファイルは、絶対パスで指定されています。そのた、別のディレクトリーに移動し
たような場合には、パスを変更する必要があります。
db2load.sql の内容
_1. 以下の通り、db2load.sql スクリプトを実行して下さい。今回のハンズオンでは、パスを
変更する必要はありません。
$db2 -tvf db2load.sql
7 つの表にデータを LOAD します。CUSTOMER 表は 0件になっています。
db2inst1@DB2V97onSLES10:/workshop/lab4/data> cat db2load.sql
CONNECT TO LABDB;
--#SET :LOAD:SALES:ACCOUNTS
LOAD FROM
"/workshop/ddl/data_only/data/sales_accounts.txt"
OF DEL
MODIFIED BY CODEPAGE=1208 COLDEL~ ANYORDER USEDEFAULTS CHARDEL""
DELPRIORITYCHAR NOROWWARNINGS
--DUMPFILE="/workshop/ddl/data_only/dump/sales_accounts.txt"
METHOD P (1,2,3,4,5,6,7,8)
MESSAGES "/workshop/ddl/data_only/msg/sales_accounts.txt"
REPLACE INTO "SALES"."ACCOUNTS"
(
"ACCT_ID",
"DEPT_CODE",
"ACCT_DESC",
"MAX_EMPLOYEES",
"CURRENT_EMPLOYEES",
"NUM_PROJECTS",
"CREATE_DATE",
"CLOSED_DATE" )
26
5555....2222 整合性整合性整合性整合性チェックチェックチェックチェック
参照制約やチェック制約などを持つ表に、データを LOAD した場合、LOAD コマンド実行
後、表は SET INTEGRITY PENDING状態となり、アクセスすることが出来ません。データ
の LOAD完了後、該当表に対して、SET INTEGRITY コマンドを実行する必要があります。
IBM Data Movement Tool は、db2checkpending.sql という、SET INTEGRITY コマンドを全
表に実行するスクリプトを作成します。db2checkRemoval.sh も提供されています。
db2checkRemoval.sh は、SET INTEGIRITY PENDING状態の表に対し、SET INTEGRITY
コマンドを実行します。
_2. EMPLOYEE 表にアクセスし、アクセスできないことを確かめます。
$db2 connect to LABDB
$db2 “select count(*) from SALES.EMPLOYEES”
$db2 ? SQL****N
SELECT ステートメントが返した SQL エラーコードは何でしたか?______________
実行例
db2inst1@DB2V97onSLES10:/workshop/lab4/data> db2 connect to labdb
(省略)
db2inst1@DB2V97onSLES10:/workshop/lab4/data> db2 "select count(*) from
sales.employees"
1
-----------
SQL0668N 理由コード "1" のため、表 "SALES.EMPLOYEES"
に対する操作は許可されません。 SQLSTATE=57016
このコマンドは、OS プロンプトから db2ic としても実行できます。
db2inst1@DB2V97onSLES10:/workshop/lab4/data> db2 ? SQL0668N
SQL0668N 理由コード "<reason-code>" のため、表 "<table-name>"
に対する操作は許可されません。
説明:
表 "<table-name>" へのアクセスは制限されています。原因は、次の理由コード
"<reason-code>" に基づいています。
1
表は、SET INTEGRITY ペンディング・アクセスなし状態です。表の整
合性が強制されておらず、表の内容が無効である可能性があります。
従属表が SET INTEGRITY ペンディング・アクセスなし状態である場
合は、SET INTEGRITY ペンディング・アクセスなし状態でない親表ま
たは基礎表に対する操作も、このエラーを受け取る可能性がありま
す。
(省略)
27
_3.db2checkRemoval.sh の実行
./db2checkRemoval.sh
シェルの実行が完了したら、再度 SELECT ステートメントを実行して下さい。
$db2 “select count(*) from SALES.EMPLOYEES”
実行例
_4.各表の件数確認
db2tabcount.sql スクリプトを使用して、LOAD した表のレコード件数を確認します。
$db2 –tvf db2tabcount.sql
以下の表に、件数を書き込んでください。
表名表名表名表名 件数件数件数件数
ACOUNTS
CUSTOMER
WAREHOUSES
DEPARTMENTS
EMPLOYEES
EMP_DETAILS
db2inst1@DB2V97onSLES10:/workshop/lab4/data> ./db2checkRemoval.sh
データベース接続情報
データベース・サーバー = DB2/LINUX 9.7.0
SQL 許可 ID = DB2INST1
ローカル・データベース別名 = LABDB
SET INTEGRITY FOR
SALES.DEPARTMENTS,SALES.ACCOUNTS,SALES.OFFICES,SALES.EMPLOYEES,SALES.EMP_DETAILS
IMMEDIATE CHECKED
DB20000I SQL コマンドが正常に完了しました。
db2inst1@DB2V97onSLES10:/workshop/lab4/data> db2 "select count(*) from
sales.employees"
1
-----------
42
1 レコードが選択されました。
28
5.3 統計情報統計情報統計情報統計情報のののの収集収集収集収集
統計情報とは、表のレコード件数や、索引の情報などの情報です。DB2 はアクセス・プラン
を決定する際に、統計情報をもとに判断します。より良いアクセス・プランを選択させるた
めに、統計情報を Update しておくことは重要なことです。
統計情報の収集をするためには、RUNTSATS コマンドを実行します。Data Movement Too
lは、RUNSTATS を実行するための、db2runstas.sql を用意しています。
$db2 –tvf db2runstats.sql
実行例
RUNTSATS のタイムスタンプは、SYSCAT.TABLES カタログビューに格納されます。
以下の SQL を実行し、SYSCAT.TABLES の stats_time列の値を取得してください。
db2 "select substr(tabname,1,20) tabname,stats_time from
syscat.tables where tabschema='SALES'"
実行例
db2inst1@DB2V97onSLES10:/workshop/lab4/data> db2 -tvf db2runstats.sql
CONNECT TO LABDB
データベース接続情報
データベース・サーバー = DB2/LINUX 9.7.0
SQL 許可 ID = DB2INST1
ローカル・データベース別名 = LABDB
RUNSTATS ON TABLE "SALES"."ACCOUNTS" ON ALL COLUMNS WITH DISTRIBUTION ON ALL
COLUMNS AND DETAILED INDEXES ALL ALLOW WRITE ACCESS
DB20000I RUNSTATS コマンドが正常に完了しました。
(省略)
TERMINATE
DB20000I TERMINATE コマンドが正常に完了しました。
db2inst1@DB2V97onSLES10:/workshop/lab4/data> db2 "select substr(tabname,1,20)
tabname,stats_time from syscat.tables where tabschema='SALES'"
TABNAME STATS_TIME
-------------------- --------------------------
WAREHOUSES 2009-09-14-10.04.03.349199
DEPARTMENTS 2009-09-14-10.04.03.384440
CUSTOMERS 2009-09-14-10.04.03.329179
ACCOUNTS 2009-09-14-10.04.03.193782
OFFICES 2009-09-14-10.04.03.364467
EMPLOYEES 2009-09-14-10.04.03.406776
EMP_DETAILS 2009-09-14-10.04.03.434095
7 レコードが選択されました。
29
6666.... CLPPlusCLPPlusCLPPlusCLPPlus
CLPPlus は DB2V9.7 で提供されているコマンド行インタフェースです。
Oracle の SQL*Plus と互換性のあるフィチャーを提供しています。ここでは
CLPPlus を使用したデータベースへの接続、SQL の実行を行います
6.1 CLPPlus のののの開始開始開始開始
CLPPlus のセッションは、以下のパラメーターを使用します。
� User:db2inst1
� Password:db2inst1
� Host:localhost
� Port:60000
� Database name:labdb
CLPPlus の開始方法は様々あります。Oracle の SQL*Plus での「sqlplus
userid/password@ host[:port][/service_name]」と似た形式で接続することが出来ます。以
下は対話式での SQL の実行例になります。
まず DB 接続時に開始する方法で行います。
_1.ターミナルウィンドウで以下のコマンドを実行します。
clpplus db2inst1/db2inst1@localhost:60000/labdb
実行例
db2inst1@DB2V97onSLES10:/workshop/lab4> clpplus
db2inst1/db2inst1@localhost:60000/labdb
データベース接続情報
ホスト名 = localhost
データベース・サーバー = DB2/LINUX SQL09070
SQL 許可 ID = db2inst1
ローカル・データベース別名 = LABDB
ポート = 60000
CLPPlus: バージョン 1.0
Copyright (c) 2009, IBM CORPORATION. All rights reserved.
SQL>
30
_2.CLPPlusセッションを切断するためには、quit または exit を入力します。
実行例
_3.以下のコマンドで CLPPlusセッションを開始することも出来ます。
cd /workshop/lab4
clpplus db2inst1/db2inst1@labdb
これは、/workshop/lab4/login.sql でホスト定義をしているため、ホスト名、ポート番号、DB
名が省略されています。
login.sql の内容
6.2 CLPPlus をををを使用使用使用使用したしたしたした SQL のののの実行実行実行実行
CLPPlus で SQL ステートメントのスクリプトを実行することが出来ます。
以下の例は、CLPPlus コマンドや SQL ステートメントを実行している例になります。これは、
/workshop/lab4 に 01.check_tables.clp というファイルがあります。
SET PAGESIZE コマンドは、1 ページに収まる表示行の数を設定します。また SET
LINESIZE コマンドは、行の幅を制限します。
01.check_tables.clp の内容
_4.ファイルの内容をバッファーに取り出し、実行するために、START コマンドを実行して
下さい。
SQL> exit
db2inst1@DB2V97onSLES10:/workshop/lab4>
SET PAGESIZE 9999
SET LINESIZE 1000
SET ECHO ON
SELECT
substr(tb.tabname,1,20) table_name,
tb.stats_time, int(tb.card) card,
tbinfo.data_object_p_size data_kb, tbinfo.index_object_l_size index_kb
FROM syscat.tables tb, sysibmadm.admintabinfo tbinfo
WHERE tb.tabschema='SALES' and
tb.tabname=tbinfo.tabname
ORDER BY table_name;
define labdb=localhost:60000/labdb
31
cd /workshop/lab4
clpplus db2inst1/db2inst1@labdb
SQL> start /workshop/lab4/01.check_tables.clp
実行例
CLPPlus は、インメモリー領域の SQLバッファーに、直近で実行された SQL ステートメント
や、PL/SQL のブロックを保持しています。LIST コマンドを使用することで、SQLバッファー
内にある情報を取得することが出来ます。
_5 以下のように LIST コマンドを実行します。
実行例
_6.CHANGE コマンドを使用することで、バッファーの内容を変更することが出来ます。
以下のように、ORDER BY を指定して、CHANGE コマンドを実行して下さい。
change /ORDER BY table_name/ORDER BY card
SQL> start /workshop/lab4/01.check_tables.clp
SQL>
SELECT
substr(tb.tabname,1,20) table_name,
tb.stats_time, int(tb.card) card,
tbinfo.data_object_p_size data_kb, tbinfo.index_object_l_size
index_kb
FROM syscat.tables tb, sysibmadm.admintabinfo tbinfo
WHERE tb.tabschema='SALES' and
tb.tabname=tbinfo.tabname
ORDER BY table_name;
TABLE_NAME STATS_TIME CARD DATA_KB INDEX_KB
----------------- -------------------------- ----------- ----------- --------
ACCOUNTS 2009-09-14 10:04:03 8 512 512
CUSTOMERS 2009-09-14 10:04:03 0 512 512
DEPARTMENTS 2009-09-14 10:04:03 8 512 512
EMPLOYEES 2009-09-14 10:04:03 42 512 512
EMP_DETAILS 2009-09-14 10:04:03 8 512 512
OFFICES 2009-09-14 10:04:03 2 512 512
WAREHOUSES 2009-09-14 10:04:03 3 2048 2048
7 個の行が取り出されました。
SQL> LIST
1 SELECT
2 substr(tb.tabname,1,20) table_name,
3 tb.stats_time, int(tb.card) card,
4 tbinfo.data_object_p_size data_kb, tbinfo.index_object_l_size
index_kb
5 FROM syscat.tables tb, sysibmadm.admintabinfo tbinfo
6 WHERE tb.tabschema='SALES' and
7 tb.tabname=tbinfo.tabname
8* ORDER BY table_name
32
LIST
RUN
実行例
_7.CLPPlus の出力結果は、SPOOL コマンドを使用することでファイルに出力させること
が出来ます。以下のコマンドを実行して下さい。
SPOOL talbe_size
show SPOOL
host ls -l
SPOOL コマンドを実行することで、CLPPlus 出力をエコーし、ファイルにログを記録します。
HOST コマンドは、CLPPlus インタフェースで OS コマンドを実行します。ここでは SPOOL
によって出力された talbe_size.lst ファイルがあることを確認しています。
SQL> change /ORDER BY table_name/ORDER BY card
8* ORDER BY card
SQL> list
1 SELECT
2 substr(tb.tabname,1,20) table_name,
3 tb.stats_time, int(tb.card) card,
4 tbinfo.data_object_p_size data_kb, tbinfo.index_object_l_size
index_kb
5 FROM syscat.tables tb, sysibmadm.admintabinfo tbinfo
6 WHERE tb.tabschema='SALES' and
7 tb.tabname=tbinfo.tabname
8* ORDER BY card
SQL> run
1 SELECT
2 substr(tb.tabname,1,20) table_name,
3 tb.stats_time, int(tb.card) card,
4 tbinfo.data_object_p_size data_kb, tbinfo.index_object_l_size
index_kb
5 FROM syscat.tables tb, sysibmadm.admintabinfo tbinfo
6 WHERE tb.tabschema='SALES' and
7 tb.tabname=tbinfo.tabname
8* ORDER BY card
TABLE_NAME STATS_TIME CARD DATA_KB INDEX_KB
----------------- ------------------- ----------- ------------ --------------
CUSTOMERS 2009-09-14 10:04:03 0 512 512
OFFICES 2009-09-14 10:04:03 2 512 512
WAREHOUSES 2009-09-14 10:04:03 3 2048 2048
DEPARTMENTS 2009-09-14 10:04:03 8 512 512
ACCOUNTS 2009-09-14 10:04:03 8 512 512
EMP_DETAILS 2009-09-14 10:04:03 8 512 512
EMPLOYEES 2009-09-14 10:04:03 42 512 512
7 個の行が取り出されました。
33
実行例
_8.SQLバッファーの内容を保存する。
CLPPlus の便利な機能の一つとして、SQLバッファーをファイルに保存し、再利用が出来
ることである。以下の通り、SAVE コマンドを実行し、SQLバッファーの内容をファイルに保
存します。
SAVE new_table_size.clp
host ls –l
host cat new_table_size.clp
実行例
SQL> spool table_size
SQL> show spool
spool ON
SQL> host ls -l
合計 31
-rw-r--r-- 1 db2inst1 staff 129 2009-09-08 23:52 01.CreateDatabase.clp
-rw-r--r-- 1 db2inst1 staff 332 2009-09-14 10:39 01.check_tables.clp
-rw-r--r-- 1 db2inst1 staff 133 2009-06-08 10:44 02.check_tbsp.sql
-rw-r--r-- 1 db2inst1 staff 178 2009-08-22 21:45 03.check_defaults.sql
-rw-r--r-- 1 db2inst1 staff 0 2009-09-14 10:15 clpplus.log
drwxr-xr-x 7 db2inst1 staff 600 2009-09-09 06:26 data
-rw-r--r-- 1 db2inst1 staff 0 2009-09-09 05:33 db2set
-rw-r--r-- 1 db2inst1 staff 0 2009-09-09 05:33 db2start
-rw-r--r-- 1 db2inst1 staff 0 2009-09-09 05:33 db2stop
drwxr-xr-x 3 db2inst1 staff 1336 2009-09-14 06:03 ddl
drwxr-xr-x 2 db2inst1 staff 1224 2009-09-08 23:50 ddl_modified
-rw-r--r-- 1 db2inst1 staff 73 2009-09-14 10:28 login.sql
-rw-r--r-- 1 db2inst1 staff 145 2009-09-14 10:57 table_size.lst
-rw-r--r-- 1 db2inst1 staff 700 2009-09-14 05:19 warehouse.clp
SQL> SAVE new_table_size.clp
DB250000I: コマンドは正常に完了しました。
SQL> host ls -l
(省略)
drwxr-xr-x 3 db2inst1 staff 1336 2009-09-14 06:03 ddl
drwxr-xr-x 2 db2inst1 staff 1224 2009-09-08 23:50 ddl_modified
-rw-r--r-- 1 db2inst1 staff 73 2009-09-14 10:28 login.sql
-rw-r--r-- 1 db2inst1 staff 277 2009-09-14 11:07 new_table_size.clp
-rw-r--r-- 1 db2inst1 staff 1136 2009-09-14 11:07 table_size.lst
-rw-r--r-- 1 db2inst1 staff 700 2009-09-14 05:19 warehouse.clp
SQL> host cat new_table_size.clp
SELECT
substr(tb.tabname,1,20) table_name,
tb.stats_time, int(tb.card) card,
tbinfo.data_object_p_size data_kb, tbinfo.index_object_l_size
index_kb
FROM syscat.tables tb, sysibmadm.admintabinfo tbinfo
WHERE tb.tabschema='SALES' and
tb.tabname=tbinfo.tabname
ORDER BY card /
34
_9.コマンドラインからスクリプトを実行させることが出来ます。CLPPlus ログイン時の“@”
以降に、スクリプト・ファイルを指定してください。
clpplus db2inst1/db2inst1@labdb @02.check_tables.batch.clp
実行例
以上です。
db2inst1@DB2V97onSLES10:/workshop/lab4> clpplus db2inst1/db2inst1@labdb
@02.check_tables.batch.clp
データベース接続情報
ホスト名 = localhost
データベース・サーバー = DB2/LINUX SQL09070
SQL 許可 ID = db2inst1
ローカル・データベース別名 = LABDB
ポート = 60000
SQL>
SELECT
substr(tb.tabname,1,20) table_name,
tb.stats_time, int(tb.card) card,
tbinfo.data_object_p_size data_kb, tbinfo.index_object_l_size
index_kb
FROM syscat.tables tb, sysibmadm.admintabinfo tbinfo
WHERE tb.tabschema='SALES' and
tb.tabname=tbinfo.tabname
ORDER BY table_name;
TABLE_NAME STATS_TIME CARD DATA_KB INDEX_KB
----------------- ------------------- ----------- ---------- -----------
ACCOUNTS 2009-09-14 10:04:03 8 512 512
CUSTOMERS 2009-09-14 10:04:03 0 512 512
DEPARTMENTS 2009-09-14 10:04:03 8 512 512
EMPLOYEES 2009-09-14 10:04:03 42 512 512
EMP_DETAILS 2009-09-14 10:04:03 8 512 512
OFFICES 2009-09-14 10:04:03 2 512 512
WAREHOUSES 2009-09-14 10:04:03 3 2048 2048
7 個の行が取り出されました。
SQL> QUIT;
35
© Copyright IBM Corporation 2009 All Rights Reserved.
本書に含まれている情報は、正式なIBMのテストを受けていません。また、明記にしろ、暗黙的にしろ、なんらの保証もなしに配布され
るものです。
この情報の使用またはこれらの技術の実施は、いずれも、使用先の責任において行われるべきものであり、それらを評価し、実際に使用
する環境に統合する使用先の判断に依存しています。それぞれの項目は、ある特定の状態において正確であることがIBMによって調べら
れていますが、他のところで同じまたは同様の結果が得られる保証はありません。これらの技術を自身の環境に適用することを試みる使
用先は、自己の責任において行う必要があります。