Comments
Description
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