[lab 4][lab 4] oracleoracle からの からのデータベース 移行 ·...

35
[Lab 4] [Lab 4] [Lab 4] [Lab 4] Oracle Oracle Oracle Oracle からの からの からの からのデータベース データベース データベース データベース 移行 移行 移行 移行 2009 2009 2009 2009 年 12 12 12 12 月 日本 日本 日本 日本アイ アイ アイ アイ・ビー ビー ビー ビー・エム エム エム エム株式会社 株式会社 株式会社 株式会社

Upload: others

Post on 11-Oct-2020

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: [Lab 4][Lab 4] OracleOracle からの からのデータベース 移行 · このハンズオンでは、Oracleデータベースのオブジェクトを、DB2V9.7のデータベースに作

[Lab 4][Lab 4][Lab 4][Lab 4]

OracleOracleOracleOracle からのからのからのからのデータベースデータベースデータベースデータベース

移行移行移行移行

2009200920092009 年年年年 12121212 月月月月

日本日本日本日本アイアイアイアイ・・・・ビービービービー・・・・エムエムエムエム株式会社株式会社株式会社株式会社

Page 2: [Lab 4][Lab 4] OracleOracle からの からのデータベース 移行 · このハンズオンでは、Oracleデータベースのオブジェクトを、DB2V9.7のデータベースに作

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

Page 3: [Lab 4][Lab 4] OracleOracle からの からのデータベース 移行 · このハンズオンでは、Oracleデータベースのオブジェクトを、DB2V9.7のデータベースに作

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) を使用

� データベースは自動ストレージ機能を使用

Page 4: [Lab 4][Lab 4] OracleOracle からの からのデータベース 移行 · このハンズオンでは、Oracleデータベースのオブジェクトを、DB2V9.7のデータベースに作

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 の処理が正常に終了しました。

Page 5: [Lab 4][Lab 4] OracleOracle からの からのデータベース 移行 · このハンズオンでは、Oracleデータベースのオブジェクトを、DB2V9.7のデータベースに作

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

Page 6: [Lab 4][Lab 4] OracleOracle からの からのデータベース 移行 · このハンズオンでは、Oracleデータベースのオブジェクトを、DB2V9.7のデータベースに作

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 コマンドが正常に完了しました。

Page 7: [Lab 4][Lab 4] OracleOracle からの からのデータベース 移行 · このハンズオンでは、Oracleデータベースのオブジェクトを、DB2V9.7のデータベースに作

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 コマンドが正常に完了しました。

Page 8: [Lab 4][Lab 4] OracleOracle からの からのデータベース 移行 · このハンズオンでは、Oracleデータベースのオブジェクトを、DB2V9.7のデータベースに作

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

・・・

Page 9: [Lab 4][Lab 4] OracleOracle からの からのデータベース 移行 · このハンズオンでは、Oracleデータベースのオブジェクトを、DB2V9.7のデータベースに作

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 が使用できない環境

では、役に立ちます。

Page 10: [Lab 4][Lab 4] OracleOracle からの からのデータベース 移行 · このハンズオンでは、Oracleデータベースのオブジェクトを、DB2V9.7のデータベースに作

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(もしく

は両方)の抽出操作をすると作成されます。

Page 11: [Lab 4][Lab 4] OracleOracle からの からのデータベース 移行 · このハンズオンでは、Oracleデータベースのオブジェクトを、DB2V9.7のデータベースに作

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 を使用して、ファイル経由ではなく、直接接続して移行すること

Page 12: [Lab 4][Lab 4] OracleOracle からの からのデータベース 移行 · このハンズオンでは、Oracleデータベースのオブジェクトを、DB2V9.7のデータベースに作

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

は、ユーティリティーを実行するためのスクリプトも適用しています。

Page 13: [Lab 4][Lab 4] OracleOracle からの からのデータベース 移行 · このハンズオンでは、Oracleデータベースのオブジェクトを、DB2V9.7のデータベースに作

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 作成とデータ移行後に行うことをお勧めし

ます。

Page 14: [Lab 4][Lab 4] OracleOracle からの からのデータベース 移行 · このハンズオンでは、Oracleデータベースのオブジェクトを、DB2V9.7のデータベースに作

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'

Page 15: [Lab 4][Lab 4] OracleOracle からの からのデータベース 移行 · このハンズオンでは、Oracleデータベースのオブジェクトを、DB2V9.7のデータベースに作

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」タブを選択し、左上のフォルダのアイコンを選択してください。

Page 16: [Lab 4][Lab 4] OracleOracle からの からのデータベース 移行 · このハンズオンでは、Oracleデータベースのオブジェクトを、DB2V9.7のデータベースに作

16

b. Select output directoryウィンドウが開いたら、/workshop/lab4/ddl を選択してください。

以下のように、オブジェクトのツリーが表示されます。オブジェクトの前に表示されているア

イコンは、まだオブジェクトが作成されていないことを示します。

c.BP32 のバッファプールを作成します。BP32 を選択し、右クリックで「Deploy Selected

objects in DB2」を選択します。

Page 17: [Lab 4][Lab 4] OracleOracle からの からのデータベース 移行 · このハンズオンでは、Oracleデータベースのオブジェクトを、DB2V9.7のデータベースに作

17

デプロイ結果は、下のペインにも表示されています。以下のように BP32 のデプロイに成

功したことが確認できます。

一度に複数のオブジェクトを選択することも可能です。残りの全てのバッファプールを複数

選択し、同じように、右クリックで「Deploy Selected objects in DB2」を選択します。以下の

ように、デプロイが終了したことが確認できます。

_4. Interactive Deploy の GUI を使用して、先ほどのバッファプールのデプロイと同じよう

に、全ての表スペースをデプロイしてください。

以下の SQL を実行することで、作成された表スペースについて確認できます。

SELECT

substr(TBSP_NAME,1,15) TBSP,

Page 18: [Lab 4][Lab 4] OracleOracle からの からのデータベース 移行 · このハンズオンでは、Oracleデータベースのオブジェクトを、DB2V9.7のデータベースに作

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 レコードが選択されました。

Page 19: [Lab 4][Lab 4] OracleOracle からの からのデータベース 移行 · このハンズオンでは、Oracleデータベースのオブジェクトを、DB2V9.7のデータベースに作

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

Page 20: [Lab 4][Lab 4] OracleOracle からの からのデータベース 移行 · このハンズオンでは、Oracleデータベースのオブジェクトを、DB2V9.7のデータベースに作

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 コマンドが正常に完了しました。

Page 21: [Lab 4][Lab 4] OracleOracle からの からのデータベース 移行 · このハンズオンでは、Oracleデータベースのオブジェクトを、DB2V9.7のデータベースに作

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 レコードが選択されました。

Page 22: [Lab 4][Lab 4] OracleOracle からの からのデータベース 移行 · このハンズオンでは、Oracleデータベースのオブジェクトを、DB2V9.7のデータベースに作

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 ,

Page 23: [Lab 4][Lab 4] OracleOracle からの からのデータベース 移行 · このハンズオンでは、Oracleデータベースのオブジェクトを、DB2V9.7のデータベースに作

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;

Page 24: [Lab 4][Lab 4] OracleOracle からの からのデータベース 移行 · このハンズオンでは、Oracleデータベースのオブジェクトを、DB2V9.7のデータベースに作

24

そしてもし、データ移行とオブジェクトの作成を一緒に実行したい場合は、db2gen.sh を使

用してください。db2ddl.sh と db2gen.sh はほぼ同じスクリプトです。違いとしては、

db2gen.sh はデータの投入スクリプトも含まれていることです。

Page 25: [Lab 4][Lab 4] OracleOracle からの からのデータベース 移行 · このハンズオンでは、Oracleデータベースのオブジェクトを、DB2V9.7のデータベースに作

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" )

Page 26: [Lab 4][Lab 4] OracleOracle からの からのデータベース 移行 · このハンズオンでは、Oracleデータベースのオブジェクトを、DB2V9.7のデータベースに作

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 ペンディング・アクセスなし状態でない親表ま

たは基礎表に対する操作も、このエラーを受け取る可能性がありま

す。

(省略)

Page 27: [Lab 4][Lab 4] OracleOracle からの からのデータベース 移行 · このハンズオンでは、Oracleデータベースのオブジェクトを、DB2V9.7のデータベースに作

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 レコードが選択されました。

Page 28: [Lab 4][Lab 4] OracleOracle からの からのデータベース 移行 · このハンズオンでは、Oracleデータベースのオブジェクトを、DB2V9.7のデータベースに作

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 レコードが選択されました。

Page 29: [Lab 4][Lab 4] OracleOracle からの からのデータベース 移行 · このハンズオンでは、Oracleデータベースのオブジェクトを、DB2V9.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>

Page 30: [Lab 4][Lab 4] OracleOracle からの からのデータベース 移行 · このハンズオンでは、Oracleデータベースのオブジェクトを、DB2V9.7のデータベースに作

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

Page 31: [Lab 4][Lab 4] OracleOracle からの からのデータベース 移行 · このハンズオンでは、Oracleデータベースのオブジェクトを、DB2V9.7のデータベースに作

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

Page 32: [Lab 4][Lab 4] OracleOracle からの からのデータベース 移行 · このハンズオンでは、Oracleデータベースのオブジェクトを、DB2V9.7のデータベースに作

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 個の行が取り出されました。

Page 33: [Lab 4][Lab 4] OracleOracle からの からのデータベース 移行 · このハンズオンでは、Oracleデータベースのオブジェクトを、DB2V9.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 /

Page 34: [Lab 4][Lab 4] OracleOracle からの からのデータベース 移行 · このハンズオンでは、Oracleデータベースのオブジェクトを、DB2V9.7のデータベースに作

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;

Page 35: [Lab 4][Lab 4] OracleOracle からの からのデータベース 移行 · このハンズオンでは、Oracleデータベースのオブジェクトを、DB2V9.7のデータベースに作

35

© Copyright IBM Corporation 2009 All Rights Reserved.

本書に含まれている情報は、正式なIBMのテストを受けていません。また、明記にしろ、暗黙的にしろ、なんらの保証もなしに配布され

るものです。

この情報の使用またはこれらの技術の実施は、いずれも、使用先の責任において行われるべきものであり、それらを評価し、実際に使用

する環境に統合する使用先の判断に依存しています。それぞれの項目は、ある特定の状態において正確であることがIBMによって調べら

れていますが、他のところで同じまたは同様の結果が得られる保証はありません。これらの技術を自身の環境に適用することを試みる使

用先は、自己の責任において行う必要があります。