...

[Lab 4] Oracle からの

by user

on
Category: Documents
120

views

Report

Comments

Transcript

[Lab 4] Oracle からの
[Lab 4]
Oracle からのデータベース
からのデータベース
移行
2009 年 12 月
日本アイ
日本アイ・
アイ・ビー・
ビー・エム株式会社
エム株式会社
Contents
CONTENTS ..........................................................................................................2
1.
はじめに ........................................................................................................3
2.
データベース作成
データベース作成..........................................................................................3
作成
2.1
2.2
2.3
2.4
3.
IBM DATA MOVEMENT TOOL で作成された
作成された DDL......................................9
3.1
3.2
3.3
3.4
3.5
4.
IBM Data Movement Tool によるオブジェクト作成...............................14
スクリプトによるオブジェクト作成 ......................................................18
データ移行
データ移行...................................................................................................25
移行
5.1
5.2
5.3
6.
コマンドや構成ファイル..........................................................................9
オブジェクト作成のスクリプト .............................................................11
データ投入のためのスクリプト .............................................................11
PL/SQL のロジックを含むオブジェクトを作成するスクリプト ............12
その他のファイル...................................................................................12
オブジェクト作成
オブジェクト作成........................................................................................14
作成
4.1
4.2
5.
Oracle 互換機能の有効化 .........................................................................4
データベースパスのディレクトリー作成.................................................5
データベース LABDB を作成 ......................................................................6
作成したデータベースの確認...................................................................7
データの LOAD.........................................................................................25
整合性チェック ......................................................................................26
統計情報の収集 ......................................................................................28
CLPPLUS .....................................................................................................29
6.1
6.2
CLPPlus の開始......................................................................................29
CLPPlus を使用した SQL の実行 ...........................................................30
2
1.
はじめに
このハンズオンでは、Oracle データベースのオブジェクトを、DB2V9.7 のデータベースに作
成し、データ移行を行います。
本ハンズオンは以下のタスクを含みます。
Oracle から移行するデータベースを作成する
IBM Data Movement Tool で抽出した DDL ファイルを確認する
物理設計に沿って DDL ファイルを編集する
IBM Data Movement Tool で、Interactive deployment を実行する
スクリプトで DB オブジェクトを作成する
なお、この章のハンズオンは、db2inst1 で OS にログインして下さい。root ユーザーなどで
ログインしている場合は、一度ログオフし、再度入りなおしてください。
_仮想マシンに以下のユーザーでログイン
User: db2inst1
Password: db2inst1
2.
データベース作成
データベース作成
この章では、DB2 のデータベースに、Oracle から移行したオブジェクトを作成します。
インスタンス名:db2inst1 データベース名:LABDB
DB2V9.7 の Oracle 互換機能 (DB2_COMPATIBILITY_VECTOR) を使用
データベースは自動ストレージ機能を使用
3
2.1
Oracle 互換機能の
互換機能の有効化
_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 の処理が正常に終了しました。
4
2.2
データベースパスの
データベースパスのディレクトリー作成
ディレクトリー作成
データベースのストレージは、データベースが作成される前に、作成してある必要がありま
す。この環境では既にディレクトリーを作成してありますので、ディレクトリーが存在するか
どうか確認してください。
_2.データベースのディレクトリー確認
_データベース・ディレクトリー:/db2system
_表スペースディレクトリー
/db2data1
/db2data2
/db2data3
/db2data4
_ディレクトリーの確認
$ls –l / | grep db2
確認例
db2inst1@DB2V97onSLES10:/workshop/lab4> ls
drwxr-xr-x
3 db2inst1 root
72 Sep
drwxr-xr-x
2 db2inst1 root
48 Sep
drwxr-xr-x
2 db2inst1 root
48 Sep
drwxr-xr-x
2 db2inst1 root
48 Sep
drwxr-xr-x
2 db2inst1 root
48 Sep
drwxr-xr-x
2 db2inst1 root
48 Sep
drwxr-xr-x 12 db2inst1 root
344 Sep
5
-l / | grep db2
8 23:52 db2
9 05:31 db2data1
9 05:31 db2data2
9 05:31 db2data3
9 05:31 db2data4
9 05:31 db2system
8 23:57 workshop
2.3
データベース LABDB を作成
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 コマンドが正常に完了しました。
6
2.4
作成した
作成したデータベース
したデータベースの
データベースの確認
データベース作成が成功したことを、いくつかの方法で確認することが出来ます。
<データベースへの接続>
データベースへの接続はインスタンスオーナーで接続します。
_4. LABDB へ接続し、DUAL 表から SYSDATE を SELECT する
$db2 connect to labdb
$db2 select sysdate from dual
$db2 connect reset
実行例
db2inst1@DB2V97onSLES10:/workshop/lab4> db2 connect to labdb
データベース接続情報
= DB2/LINUX 9.7.0
= DB2INST1
= LABDB
データベース・サーバー
SQL 許可 ID
ローカル・データベース別名
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 コマンドが正常に完了しました。
<ローカル・データベース・ディレクトリーの確認>
ローカル・データベース・ディレクトリーは、データベース名、エイリアス、データベース・
パスなどの情報のエントリーです。このエントリーは、アプリケーションから接続するとき
に指定するエントリーになります。データベース・ディレクトリーの内容を表示するために
は、以下のコマンドを実行します。
$db2 list db directory
_5. ローカル・データベース・ディレクトリーを確認し、以下を記入してください
データベース別名 ________________________________________________________________________
データベース・ディレクトリー___________________________________________________________________
ディレクトリー項目タイプ_________________________________________________________________________
7
実行例
db2inst1@DB2V97onSLES10:/workshop/lab4> db2 list db directory
システム・データベース・ディレクトリー
ディレクトリー中の項目数 = 1
データベース 1 項目:
= LABDB
データベース別名
データベース名
ローカル・データベース・ディレクトリー
データベース・リリース・レベル
コメント
ディレクトリー項目タイプ
カタログ・データベース・パーティション番号
代替サーバー・ホスト名
代替サーバーのポート番号
= LABDB
= /db2
= d.00
=
= 間接
= 0
=
=
<データベース構成パラメーターの確認>
DB2V9.7 では Oracle 互換機能に関連した 3 つのデータベース構成パラメーターが提
供されています。構成パラメーターは、NUMBER,VARCHAR2,DATE の新しいデータタイ
プを制御します。
_6. 作成した LABDB で Oracle 互換の構成パラメーターを確認
データベース構成パラメーターの現在の設定を確認するためには、以下のコマンドを実
行します。
$db2 get db cfg for LABDB
実行例
db2inst1@DB2V97onSLES10:/workshop/lab4> db2 get db cfg for LABDB
データベースのデータベース構成
データベース構成リリース・レベル
データベース・リリース・レベル
LABDB
= 0x0d00
= 0x0d00
データベース・テリトリー
= JP
データベース・コード・ページ
= 1208
データベース・コード・セット
= UTF-8
データベース国/地域コード
= 81
データベース照合順序
= IDENTITY
代替照合シーケンス
(ALT_COLLATE)
NUMBER データ・
データ・タイプの
タイプの互換性
VARCHAR2 データ・
データ・タイプの
タイプの互換性
データ・
データ・タイプ DATE の TIMESTAMP(0) への互換性
への互換性
・・・
8
= ON
= ON
= ON
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: 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 が使用できない環境
では、役に立ちます。
9
ファイル名
ファイル名
説明
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(もしく
は両方)の抽出操作をすると作成されます。
10
<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 を使用して、ファイル経由ではなく、直接接続して移行すること
11
が出来ます。この方法は、移行元のディスクに十分な一時領域が確保できない場合に有
用です。
ファイル名
ファイル名
説明
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
は、ユーティリティーを実行するためのスクリプトも適用しています。
12
ファイル名
ファイル名
説明
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 作成とデータ移行後に行うことをお勧めし
ます。
13
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 にログインしなおしてください。
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'
_2. 以下の情報を使用して DB2 に接続する
IBM Data Movement Tool は、データベースに接続する情報を表示します。このハンズオ
ンでは、Oracle データベースは導入されていないので、DB2 のデータベースのみがありま
す。
パラメーター
設定値
Server Name
Localhost
Port Number
60000
Database Name
LABDB
14
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」タブを選択し、左上のフォルダのアイコンを選択してください。
15
b. Select output directory ウィンドウが開いたら、/workshop/lab4/ddl を選択してください。
以下のように、オブジェクトのツリーが表示されます。オブジェクトの前に表示されているア
イコンは、まだオブジェクトが作成されていないことを示します。
c.BP32 のバッファプールを作成します。BP32 を選択し、右クリックで「Deploy Selected
objects in DB2」を選択します。
16
デプロイ結果は、下のペインにも表示されています。以下のように BP32 のデプロイに成
功したことが確認できます。
一度に複数のオブジェクトを選択することも可能です。残りの全てのバッファプールを複数
選択し、同じように、右クリックで「Deploy Selected objects in DB2」を選択します。以下の
ように、デプロイが終了したことが確認できます。
_4. Interactive Deploy の GUI を使用して、先ほどのバッファプールのデプロイと同じよう
に、全ての表スペースをデプロイしてください。
以下の SQL を実行することで、作成された表スペースについて確認できます。
SELECT
substr(TBSP_NAME,1,15) TBSP,
17
TBSP_TYPE,
TBSP_PAGE_SIZE
FROM table(MON_GET_TABLESPACE ('',-1));
上記の SQL は、/workshop/lab4 配下の 02.check_tbsp.sql スクリプトでも実行できます。
この SQL またはスクリプトを実行することで、LABDB に作成された表スペースについて確
認してください。
db2inst1@DB2V97onSLES10:/workshop/lab4> db2 -tvf 02.check_tbsp.sql
CONNECT TO LABDB
データベース接続情報
= DB2/LINUX 9.7.0
= DB2INST1
= LABDB
データベース・サーバー
SQL 許可 ID
ローカル・データベース別名
SELECT substr(TBSP_NAME,1,15) TBSP, TBSP_TYPE, TBSP_PAGE_SIZE FROM
table(MON_GET_TABLESPACE ('',-1))
TBSP
--------------SYSCATSPACE
TEMPSPACE1
USERSPACE1
SYSTOOLSPACE
TS32
TS8
TSSTMP32
TSU8
TSUTMP32
TBSP_TYPE TBSP_PAGE_SIZE
---------- -------------------DMS
32768
SMS
32768
DMS
32768
DMS
32768
DMS
32768
DMS
8192
SMS
32768
SMS
8192
SMS
32768
9 レコードが選択されました。
4.2
スクリプトによ
スクリプトによる
によるオブジェクト作成
オブジェクト作成
このセクションでは、IBM Data Movement Tool が作成したスクリプトを使用してオブジェク
トを作成します。いくつかのオブジェクトは依存関係があるため、データベース・オブジェク
トをスクリプトで作成するためには、以下の手順で実行して下さい。
1. バッファプール、表スペースを作成
2. ユーザー定義関数を作成
3. 表を作成
18
4. 表のカラムにデフォルトの属性を定義
5. シーケンスの作成
6. シノニムの定義
7. プライマリーキー制約とユニーク索引の追加
8. チェック制約
9. 外部キー制約の追加
バッファプールと表スペースは、前章のハンズオンで作成しました。今回はユーザー定義
関数(UDF)はないため、表作成に入ります。
なお、このハンズオンで使用するスクリプトは、/workshop/lab4/ddl 配下にあります。
_1. 表作成
db2tables.sql を以下のように実行して下さい。
$db2 –tvf db2tables.sql
実行後、7 つの表が作成に成功し、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) )
DB21034E コマンドが、有効なコマンド行プロセッサー・コマ
ンドでないため、 SQL
ステートメントとして処理されました。 SQL
処理中に、そのコマンドが返されました。
SQL0670N 表の行の長さが "32677"
バイトの制限を超えています。 (表スペースは ""。)
SQLSTATE=54010
上記のメッセージから、VARCHAR2 のカラム長が長すぎるため、エラーになっていることが
分かります。もし実際のデータが 32677 バイトよりも短い場合には、表定義を変更するこ
とも出来ます。加えて DB2V9.7 では、LOB インライン格納の新機能が提供されています。
このインライン機能により、LOB データもバッファプールを使用することが出来るようになる
ため、LOB データへのアクセスのパフォーマンスが向上されています。このハンズオンで
は、WAREHOUSES 表の VARCHAR2 列をインライン格納の CLOB に変更します。
db2tables.sql を編集するか、もしくは新しく DDL ファイルを作成してください。
19
WAREHOUSES 表の DDL(変更前)
--#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) );
修正した WAREHOUSES 表の DDL
--#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
"WH_DESCRIPTION2" CLOB(4000) INLINE LENGTH
"WH_DESCRIPTION3" CLOB(4000) INLINE LENGTH
"WH_DESCRIPTION4" CLOB(4000) INLINE LENGTH
"WH_DESCRIPTION5" CLOB(4000) INLINE LENGTH
"WH_DESCRIPTION6" CLOB(4000) INLINE LENGTH
"WH_DESCRIPTION7" CLOB(4000) INLINE LENGTH
"WH_DESCRIPTION8" CLOB(4000) INLINE LENGTH
"WH_DESCRIPTION9" CLOB(4000) INLINE LENGTH
)
;
3000
3000
3000
3000
3000
3000
3000
3000
3000
,
,
,
,
,
,
,
,
修正後の warehouse.clp は/workshop/lab4/ddl_modified にあります。
warehouse.clp の実行の前に、LABDB に接続して下さい。
実行例
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 コマンドが正常に完了しました。
20
_2. 表のカラムにデフォルトの属性を定義
db2default.sql スクリプトを使用して属性を定義します。このスクリプトは ACCOUNTS 表と
EMPLOYEES 表の 3 列に属性を定義します
$db2 –tvf db2default.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
SYSDATE
DB20000I SQL コマンドが正常に完了しました。
WITH DEFAULT
以下の SQL を実行することで、設定されたかどうか確認することが出来ます。
TERMINATE
/workshop/lab4
ディレクトリに 03.check_defaults.sql スクリプトでも実行する
DB20000I TERMINATE コマンドが正常に完了しました。
ことが出来ます。
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 がありますので、必要に応じてご利用下さい。
確認例
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
--------------ACCOUNTS
ACCOUNTS
EMPLOYEES
COLUMN
-------------------CREATE_DATE
CLOSED_DATE
CREATE_DATE
DEFAULT
-------------------------------------------"SYSIBM"."TIMESTAMP"(CURRENT TIMESTAMP)
"SYSIBM"."TIMESTAMP"(CURRENT TIMESTAMP)
"SYSIBM"."TIMESTAMP"(CURRENT TIMESTAMP)
3 レコードが選択されました。
_3. シーケンスの作成
シーケンスの作成は、db2sequences.sql を実行します。
21
$db2 –tvf db2sequences.sql
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 コマンドが正常に完了しました。
ここでは、表定義の別の確認方法を紹介します。DB2 の DB から DDL を抽出する
db2look ユーテリティです。db2look の出力結果から、シーケンスが作成されたかどう
か確認してください。db2look は以下のコマンドで実行することが出来ます。
$db2look –d LABDB –e –o db2look.e.log
デフォルトでは、db2look は標準出力で結果を表示するため、上記のように-o オプショ
ンで出力先のファイルを指定するか、もしくはファイルにリダイレクトすることをお勧めしま
す。
実行例
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 ,
22
_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 の以下の出力結果から分かります。
出力例
-- 表のチェック制約の DDL ステートメント "SALES
"."EMPLOYEES"
ALTER TABLE "SALES
"."EMPLOYEES"
ADD CONSTRAINT "CK1_EMPLOYEES" CHECK
(BAND IN ('1', '2', '3', '4', '5'))
ENFORCED
ENABLE QUERY OPTIMIZATION;
_7. 外部キー制約の追加
以下のように、db2fkeys.sql スクリプトを実行する。
$db2 -tvf db2fkeys.sql
Note: オブジェクトをスクリプトで一度に作成する場合、db2ddl.sh スクリプトを使用するこ
とも出来ます。今回のハンズオンのようにオブジェクトごとにスクリプトを実行する場合は、
次の段階に行く前に、それぞれのエラーを修正することが可能です。
23
そしてもし、データ移行とオブジェクトの作成を一緒に実行したい場合は、db2gen.sh を使
用してください。db2ddl.sh と db2gen.sh はほぼ同じスクリプトです。違いとしては、
db2gen.sh はデータの投入スクリプトも含まれていることです。
24
5.
データ移行
データ移行
この章では、Oracle から抽出したデータを DB2 に移行します。
5.1
データの
データの LOAD
IBM Data Movement Tool が抽出したデータの LOAD のスクリプト、db2load.sql を使用し
ます。
LOAD コマンドは以下の 3 つのファイルを使用します。
データファイル
ダンプファイル(デフォルトではコメントアウトされている)
メッセージファイル
これらのファイルは、絶対パスで指定されています。そのた、別のディレクトリーに移動し
たような場合には、パスを変更する必要があります。
db2load.sql の内容
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"
)
_1. 以下の通り、db2load.sql スクリプトを実行して下さい。今回のハンズオンでは、パスを
変更する必要はありません。
$db2 -tvf db2load.sql
7 つの表にデータを LOAD します。CUSTOMER 表は 0 件になっています。
25
5.2
整合性チェック
整合性チェック
参照制約やチェック制約などを持つ表に、データを 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 ペンディング・アクセスなし状態でない親表ま
たは基礎表に対する操作も、このエラーを受け取る可能性がありま
す。
(省略)
26
_3.db2checkRemoval.sh の実行
./db2checkRemoval.sh
シェルの実行が完了したら、再度 SELECT ステートメントを実行して下さい。
$db2 “select count(*) from SALES.EMPLOYEES”
実行例
db2inst1@DB2V97onSLES10:/workshop/lab4/data> ./db2checkRemoval.sh
データベース接続情報
= DB2/LINUX 9.7.0
= DB2INST1
= LABDB
データベース・サーバー
SQL 許可 ID
ローカル・データベース別名
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 レコードが選択されました。
_4.各表の件数確認
db2tabcount.sql スクリプトを使用して、LOAD した表のレコード件数を確認します。
$db2 –tvf db2tabcount.sql
以下の表に、件数を書き込んでください。
表名
件数
ACOUNTS
CUSTOMER
WAREHOUSES
DEPARTMENTS
EMPLOYEES
EMP_DETAILS
27
5.3
統計情報の
統計情報の収集
統計情報とは、表のレコード件数や、索引の情報などの情報です。DB2 はアクセス・プラン
を決定する際に、統計情報をもとに判断します。より良いアクセス・プランを選択させるた
めに、統計情報を Update しておくことは重要なことです。
統計情報の収集をするためには、RUNTSATS コマンドを実行します。Data Movement Too
lは、RUNSTATS を実行するための、db2runstas.sql を用意しています。
$db2 –tvf db2runstats.sql
実行例
db2inst1@DB2V97onSLES10:/workshop/lab4/data> db2 -tvf db2runstats.sql
CONNECT TO LABDB
データベース接続情報
= DB2/LINUX 9.7.0
= DB2INST1
= LABDB
データベース・サーバー
SQL 許可 ID
ローカル・データベース別名
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 コマンドが正常に完了しました。
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 "select substr(tabname,1,20)
tabname,stats_time from syscat.tables where tabschema='SALES'"
TABNAME
-------------------WAREHOUSES
DEPARTMENTS
CUSTOMERS
ACCOUNTS
OFFICES
EMPLOYEES
EMP_DETAILS
STATS_TIME
-------------------------2009-09-14-10.04.03.349199
2009-09-14-10.04.03.384440
2009-09-14-10.04.03.329179
2009-09-14-10.04.03.193782
2009-09-14-10.04.03.364467
2009-09-14-10.04.03.406776
2009-09-14-10.04.03.434095
7 レコードが選択されました。
28
6.
CLPPlus
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
SQL 許可 ID = db2inst1
ローカル・データベース別名 = LABDB
ポート = 60000
SQL09070
CLPPlus: バージョン 1.0
Copyright (c) 2009, IBM CORPORATION.
SQL>
29
All rights reserved.
_2.CLPPlus セッションを切断するためには、quit または exit を入力します。
実行例
SQL> exit
db2inst1@DB2V97onSLES10:/workshop/lab4>
_3.以下のコマンドで CLPPlus セッションを開始することも出来ます。
cd /workshop/lab4
clpplus db2inst1/db2inst1@labdb
これは、/workshop/lab4/login.sql でホスト定義をしているため、ホスト名、ポート番号、DB
名が省略されています。
login.sql の内容
define labdb=localhost:60000/labdb
6.2
CLPPlus を使用した
使用した SQL の実行
CLPPlus で SQL ステートメントのスクリプトを実行することが出来ます。
以下の例は、CLPPlus コマンドや SQL ステートメントを実行している例になります。これは、
/workshop/lab4 に 01.check_tables.clp というファイルがあります。
SET PAGESIZE コマンドは、1 ページに収まる表示行の数を設定します。また SET
LINESIZE コマンドは、行の幅を制限します。
01.check_tables.clp の内容
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;
_4.ファイルの内容をバッファーに取り出し、実行するために、START コマンドを実行して
下さい。
30
cd /workshop/lab4
clpplus db2inst1/db2inst1@labdb
SQL> start /workshop/lab4/01.check_tables.clp
実行例
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 個の行が取り出されました。
CLPPlus は、インメモリー領域の SQL バッファーに、直近で実行された SQL ステートメント
や、PL/SQL のブロックを保持しています。LIST コマンドを使用することで、SQL バッファー
内にある情報を取得することが出来ます。
_5 以下のように LIST コマンドを実行します。
実行例
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
_6.CHANGE コマンドを使用することで、バッファーの内容を変更することが出来ます。
以下のように、ORDER BY を指定して、CHANGE コマンドを実行して下さい。
change /ORDER BY table_name/ORDER BY card
31
LIST
RUN
実行例
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 個の行が取り出されました。
_7.CLPPlus の出力結果は、SPOOL コマンドを使用することでファイルに出力させること
が出来ます。以下のコマンドを実行して下さい。
SPOOL talbe_size
show SPOOL
host ls -l
SPOOL コマンドを実行することで、CLPPlus 出力をエコーし、ファイルにログを記録します。
HOST コマンドは、CLPPlus インタフェースで OS コマンドを実行します。ここでは SPOOL
によって出力された talbe_size.lst ファイルがあることを確認しています。
32
実行例
SQL> spool table_size
SQL> show spool
spool ON
SQL> host ls -l
合計 31
-rw-r--r-- 1 db2inst1
-rw-r--r-- 1 db2inst1
-rw-r--r-- 1 db2inst1
-rw-r--r-- 1 db2inst1
-rw-r--r-- 1 db2inst1
drwxr-xr-x 7 db2inst1
-rw-r--r-- 1 db2inst1
-rw-r--r-- 1 db2inst1
-rw-r--r-- 1 db2inst1
drwxr-xr-x 3 db2inst1
drwxr-xr-x 2 db2inst1
-rw-r--r-- 1 db2inst1
-rw-r--r-- 1 db2inst1
-rw-r--r-- 1 db2inst1
staff 129 2009-09-08 23:52 01.CreateDatabase.clp
staff 332 2009-09-14 10:39 01.check_tables.clp
staff 133 2009-06-08 10:44 02.check_tbsp.sql
staff 178 2009-08-22 21:45 03.check_defaults.sql
staff
0 2009-09-14 10:15 clpplus.log
staff 600 2009-09-09 06:26 data
staff
0 2009-09-09 05:33 db2set
staff
0 2009-09-09 05:33 db2start
staff
0 2009-09-09 05:33 db2stop
staff 1336 2009-09-14 06:03 ddl
staff 1224 2009-09-08 23:50 ddl_modified
staff
73 2009-09-14 10:28 login.sql
staff 145 2009-09-14 10:57 table_size.lst
staff 700 2009-09-14 05:19 warehouse.clp
_8.SQL バッファーの内容を保存する。
CLPPlus の便利な機能の一つとして、SQL バッファーをファイルに保存し、再利用が出来
ることである。以下の通り、SAVE コマンドを実行し、SQL バッファーの内容をファイルに保
存します。
SAVE new_table_size.clp
host ls –l
host cat new_table_size.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
/
33
_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
SQL 許可 ID = db2inst1
ローカル・データベース別名 = LABDB
ポート = 60000
SQL09070
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
----------------- ------------------ACCOUNTS
2009-09-14 10:04:03
CUSTOMERS
2009-09-14 10:04:03
DEPARTMENTS
2009-09-14 10:04:03
EMPLOYEES
2009-09-14 10:04:03
EMP_DETAILS
2009-09-14 10:04:03
OFFICES
2009-09-14 10:04:03
WAREHOUSES
2009-09-14 10:04:03
7 個の行が取り出されました。
SQL>
QUIT;
以上です。
34
CARD
DATA_KB INDEX_KB
----------- ---------- ----------8
512
512
0
512
512
8
512
512
42
512
512
8
512
512
2
512
512
3
2048
2048
© Copyright IBM Corporation 2009
All Rights Reserved.
本書に含まれている情報は、正式なIBMのテストを受けていません。また、明記にしろ、暗黙的にしろ、なんらの保証もなしに配布され
るものです。
この情報の使用またはこれらの技術の実施は、いずれも、使用先の責任において行われるべきものであり、それらを評価し、実際に使用
する環境に統合する使用先の判断に依存しています。それぞれの項目は、ある特定の状態において正確であることがIBMによって調べら
れていますが、他のところで同じまたは同様の結果が得られる保証はありません。これらの技術を自身の環境に適用することを試みる使
用先は、自己の責任において行う必要があります。
35
Fly UP