Database Conversion WorkbenchとIBM Liftを使ってOracleからDb2 on CloudにDB移行してみた

Db2への移行ツールとして、Database Conversion Workbench(以下DCW)とIBM Liftが無償で提供されているということで、これらのツールを使用して、OracleからDb2 on Cloudにデータ移行をしてみました。
#ツールの紹介
####**＜Database Conversion Workbenchとは＞**
IBM社から無償で提供されているDB移行ツールで、
移行データソースとして、Db2等のIBM社のDB製品に加え、OracleやSQLServerなど他社DBもサポートしています。

####**＜IBM Liftとは＞**
IBM社から無償で提供されているDB移行ツールで、他社DBも対象としている点はDCWと同じです。
IBM Cloudで提供されているDBサービス（Db2 on cloudやDb2 Warehouse on Cloud）をサポートしていることが特徴です。

##環境情報
####＜移行元・移行先環境について＞
今回はOracle DB（オンプレミス環境 12cR2）からDb2 on Cloudへの移行を実施します。
![スライド3.jpeg](https://qiita-image-store.s3.amazonaws.com/0/325142/39e21226-c79c-deba-50b5-67d716224256.jpeg)

####＜移行データについて＞
移行対象データとして、OracleのHRサンプルスキーマを作成し、使用しました。
EMPLOYEES表のデータに関しては、一部日本語データに変更して使用しています。
[サンプル・スキーマの概要とセットアップ方法](https://docs.oracle.com/cd/E82638_01/comsc/introduction-to-sample-schemas.html#GUID-844E92D8-A4C8-4522-8AF5-761D4BE99200)

####＜Db2 on Cloudに関して＞
Db2 on Cloudの環境として、Db2のレジストリー変数であるDB2_COMPATIBILITY_VECTORを**Ora**にセットし、その上でDBを作成しています。
これによりDb2のOracle互換モードが有効化された状態でDBが作成されます。

[Oracle 用の互換フィーチャー](https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.1.0/com.ibm.db2.luw.apdv.porting.doc/doc/c_compat_oracle.html)
[DB2_COMPATIBILITY_VECTOR レジストリー変数](https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.1.0/com.ibm.db2.luw.apdv.porting.doc/doc/r0052867.html)
####＜作業PCについて＞
使用するツールは全て上記の図の通り、作業PCに導入しています。
今回は作業PCとしてMac Bookを使用していますが、両ツールはWindowsやLinuxにも対応しています。

##移行手順の流れ
以下の手順で移行作業を実施します。（手順1~4はDCW、手順5~8はIBM Liftを使用します）
1. Oracle DBのDDLを抽出 
2. Oracle DDLに対するDb2との互換性評価
3. Oracle DDLの自動変換
4. Oracle DDLを手動修正
5. Db2 on Cloudに変換したDDLを実行
6. Oracle DBからデータ抽出
7. データをIBM Cloud上に転送
8. Db2 on Cloudにデータを読み込む

##ツールのインストール
両ツール、先述の通り無償で提供されていますが、ダウンロードにはIBM IDの登録をする必要があります。

####＜DCWインストール手順＞
以下のリンクをご参照ください。ダウンロードモジュール・インストールガイド・移行ガイドも公開されています。
[IBM Database Conversion Workbench](https://www.ibm.com/developerworks/community/groups/service/html/communityview?communityUuid=05901c97-75b2-47a1-9c32-25f748855913)

####＜IBM Liftのインストール手順＞
こちらのQiitaの記事に日本語で紹介されています。
https://qiita.com/azzeten/items/525479b9817cbdd6ce25

全て英語で書かれていますが、IBM Liftの公式サイトにもインストール方法に加えてIBM Liftのコマンドとコマンドオプション等が記載されています。
[IBM Lift CLI](https://www.lift-cli.cloud.ibm.com/)
##DCWのセットアップ
DCWインストール後、移行作業を始める前にDCWのセットアップを行います。
####**＜DCWの起動＞**
ダウンロードしたのDCWモジュールを解凍すると、以下のようなファイルがあります。
その中のdcwという実行ファイル（黒いアイコン）をクリックし、起動します。
私の場合、最初の起動時に「このJavaアプリケーション”を開くには、以前のJava SE 6ランタイムをインストールする必要があります。」というエラーが出て、うまく起動できなかったため、Java SE 6をインストールをしてから再度起動を行いました。

![スクリーンショット 2018-12-18 14.58.43.png](https://qiita-image-store.s3.amazonaws.com/0/325142/2a4a55b4-8d9c-c853-6b10-64c2937edde3.png)
DCWの起動画面
![スクリーンショット 2018-12-18 14.59.10.png](https://qiita-image-store.s3.amazonaws.com/0/325142/ae40c785-e7dd-9ee1-017e-d1cb19ed0603.png)
Workspaceの場所を聞かれるので、入力し続行します。
（デフォルトはインストールディレクトリーの直下になります）
![スクリーンショット 2018-12-18 14.59.27.png](https://qiita-image-store.s3.amazonaws.com/0/325142/da0115e2-bc99-0f54-96c0-d32eb9a94d5f.png)
起動が完了するとこのようなワークスペースが開きます。
![スクリーンショット 2018-12-19 10.42.49.png](https://qiita-image-store.s3.amazonaws.com/0/325142/d93d9ef4-4f24-21ff-3761-186ff83e952f.png)

####**＜プロジェクトの作成＞**
DCW起動後、プロジェクトを作成します。
「File」> 「New」 > 「DCW Project」を選択します。
![スクリーンショット 2018-12-18 15.19.04.png](https://qiita-image-store.s3.amazonaws.com/0/325142/471281a9-3afe-282f-96c7-d3c5efd5649c.png)
任意のプロジェクト名を入力し、ソースDB、ターゲットDBを選択します。
![スクリーンショット 2018-12-14 15.16.03.png](https://qiita-image-store.s3.amazonaws.com/0/325142/e168fcac-505d-e30a-880d-68c5c7aab92e.png)
「Project Explorer」以下に新しいプロジェクトが作成されます。
![スクリーンショット 2018-12-19 10.50.00.png](https://qiita-image-store.s3.amazonaws.com/0/325142/b9522940-7719-cdad-db27-c41bd02d87e0.png)

####**＜DB接続情報の設定＞**
事前にソースDB及びターゲットDB（今回であれば、OracleとDb2両方のJDBC Driverをダウンロードする必要があります。
「Database Connection」＞「New」を選択し、新規のDB接続情報を追加します。
![スクリーンショット 2018-12-19 14.59.38.png](https://qiita-image-store.s3.amazonaws.com/0/325142/7f3be27c-02d5-99db-f4c6-136564490216.png)
登録するDBの種類を選択します。（今回はOracle DBの接続情報を追加します）
![スクリーンショット 2018-12-19 15.00.35.png](https://qiita-image-store.s3.amazonaws.com/0/325142/7af83ca8-60a5-3a72-38e3-e83760eed18d.png)
接続情報を入力する前に画面右上の車輪のようなアイコンを選択します　
これです→![スクリーンショット 2018-12-19 15.01.23.png](https://qiita-image-store.s3.amazonaws.com/0/325142/78d3d610-fb1d-2e57-152f-5c0d24b5fd8c.png)
ここからJDBC Driverの接続設定を行います。
先に接続情報を入力した後にJDBC Driverの値を設定すると、せっかく入力したユーザー情報が初期設定に戻ってしまい、結局再度入力するはめになりますのでご注意を！
![スクリーンショット 2018-12-19 15.01.01.png](https://qiita-image-store.s3.amazonaws.com/0/325142/82440407-0adc-9525-b070-65a195935014.png)

Driverの種類を選択します。今回のVersionは12ですが、見当たらないため、ひとまず11を選択しました。
![スクリーンショット 2018-12-19 15.01.45.png](https://qiita-image-store.s3.amazonaws.com/0/325142/10e9ba2f-2de2-f6ab-e2d4-7b4ad8ee3100.png)
「JAR List」タブを選択すると、デフォルトで設定されている「ojdbc14.jar」を選択し、左側の「Edit」を選択します。
![スクリーンショット 2018-12-19 15.02.28.png](https://qiita-image-store.s3.amazonaws.com/0/325142/d1bff9e7-7a80-d832-7d16-11ea56c9dc53.png)
実際にJDBC Driverをダウンロードしたディレクトリーを指定し、「OK」を選択します。
![スクリーンショット 2018-12-19 15.02.51.png](https://qiita-image-store.s3.amazonaws.com/0/325142/2e1b2965-7c11-77ab-0db1-0367ae96b0ab.png)
元の接続情報を入力する画面に戻るので、ここで接続情報を登録します。
「Test Connection」を選択し、Ping succeeded!というメッセージが表示されたら、「Finish」を選択し、設定を保存します。
![スクリーンショット 2018-12-19 15.03.36.png](https://qiita-image-store.s3.amazonaws.com/0/325142/ab42b549-c3bd-40d3-b4ae-7be47e1438fb.png)
接続が完了すると、接続先DBのオブジェクトやデータを参照できるようになります。
![スクリーンショット 2018-12-19 15.04.52.png](https://qiita-image-store.s3.amazonaws.com/0/325142/655fb5a4-31e7-b92f-2332-a361fe3ec23d.png)

同様の手順でDb2の接続情報も追加します。
![スクリーンショット 2018-12-19 15.20.28.png](https://qiita-image-store.s3.amazonaws.com/0/325142/e887933e-a08a-df0d-a037-991e2eec6537.png)

ここまで準備が完了したら、移行作業に取り掛かります。
##1.Oracle DBのDDLを抽出 
まずソースDBのDDLを抽出します。
プロジェクトを右クリックすると以下のようなプルダウンメニューが表示されます。
「Database Conversion 」＞「Extract DDL」を選択します。
![スクリーンショット 2018-12-18 14.57.20.png](https://qiita-image-store.s3.amazonaws.com/0/325142/3b63dfaa-4d73-ce04-e281-1c2f5863c963.png)

DDLの抽出方法として、以下の２つの方法がありますが、前者の方法で行います。
1. DDL抽出スクリプトをDCWで作成し、ソースDBのローカル環境でスクリプトを実行しDDLを抽出
2. DCWから直接ソースDBにアクセスしてDDLを抽出
![スクリーンショット 2018-12-18 14.55.30.png](https://qiita-image-store.s3.amazonaws.com/0/325142/345ca3b9-95aa-1494-18de-3c52a6f806d1.png)
任意のスクリプト名を入力し、今回はHRスキーマのみのDDLの抽出を実施するためAdvanced schema selectionを選択します。
![スクリーンショット 2018-12-18 14.56.36.png](https://qiita-image-store.s3.amazonaws.com/0/325142/9088f65d-9b9d-c932-e0ff-113191135954.png)
今回の移行元となるOracleサーバーにあるスキーマが全てリストされますが、
HR以外は削除します。
![スクリーンショット 2018-12-18 14.56.58.png](https://qiita-image-store.s3.amazonaws.com/0/325142/0c56037c-431a-a7e0-7086-9a7d93de7cbc.png)
Finishを選択すると、先ほど指定したファイル名でスクリプトが作成されます。
![スクリーンショット 2018-12-18 15.15.50.png](https://qiita-image-store.s3.amazonaws.com/0/325142/b05f0bd1-9ebf-2a14-2c4d-2fdfadec5115.png)

作成したスクリプトをOracleサーバー上へコピーし、実行します。
＜スクリプト実行コマンド例＞
```sqlplus / as sysdba @hr_extract.sql```

実行完了すると以下のようなファイルが出力されます。
複数ファイルが出力されますが、extract_ddl_script_ddl.sqlにDDLが出力されてます。
![スクリーンショット 2018-12-14 15.25.08.png](https://qiita-image-store.s3.amazonaws.com/0/325142/2ef6c65d-8826-4882-32cd-d46a337ab223.png)

##2.Oracle DDLに対するDb2との互換性評価
1でOracleサーバー上に抽出したDDLを作業用PCにコピーします。
その後、プロジェクトをクリックし、「Data Conversion」＞「Import SQL Files」を選択し、DCWに取り込みます。
![スクリーンショット 2018-12-14 15.26.10.png](https://qiita-image-store.s3.amazonaws.com/0/325142/6205d813-53e5-6ed3-ae01-7b8926b526bb.png)
取り込みたいファイルを指定し、「Finish」を選択します。
![スクリーンショット 2018-12-14 15.34.37.png](https://qiita-image-store.s3.amazonaws.com/0/325142/353ae961-0ce6-607e-09fd-bad9ab39fe10.png)
読み込まれたDDLファイルを選択し、「Database Conversion」>「Evaluate Compatibility」を選択します。
![スクリーンショット 2018-12-14 15.28.04.png](https://qiita-image-store.s3.amazonaws.com/0/325142/f49d7ed1-91f0-6272-ada7-602bc5579ec9.png)
移行元DBと移行先DBの種類を選択し「Fininsh」を選択します。
![スクリーンショット 2018-12-14 15.28.17.png](https://qiita-image-store.s3.amazonaws.com/0/325142/a4774fc1-85d4-b7fd-6726-220ca494aa24.png)

HTML形式の互換性評価レポートが作成されます。
![スクリーンショット 2018-12-18 15.26.30.png](https://qiita-image-store.s3.amazonaws.com/0/325142/677deea4-866b-a1ce-2213-be6a541d02bc.png)

レポートのサマリーにはソースDBのDDLについて、Db2との互換性レベルが記載されています。
![スクリーンショット 2018-12-14 15.28.35.png](https://qiita-image-store.s3.amazonaws.com/0/325142/5b1c6bed-2d4e-315b-1c4f-dcdc38b9e855.png)

##3.Oracle DDLの自動変換
DCWにはOracle DDLをDb2に対応できるように自動変換する機能があります。

DDLファイルを選択し、「Database Conversion」＞「Convert Code」を選択します。
![スクリーンショット 2018-12-14 15.40.38.png](https://qiita-image-store.s3.amazonaws.com/0/325142/1ec6263f-fa36-1118-ef28-74ee1d8cef43.png)

移行元DBと移行先DBの種類をと区切り文字を選択し、「Finish」を選択します。
![スクリーンショット 2018-12-14 15.40.52.png](https://qiita-image-store.s3.amazonaws.com/0/325142/dba5a7b1-da03-e4a8-c503-609ea6bdb49d.png)

変換されたDDLは変換前のDDLとは別ファイルとして作成されます。
ファイル名の最後に「converted」が付きます。
![スクリーンショット 2018-12-14 15.39.16.png](https://qiita-image-store.s3.amazonaws.com/0/325142/9c713f3e-832f-b316-435c-18d93b2e201e.png)

##4.Oracle DDLを手動修正
自動変換対象外のDDLに関しては、手動でDCWの画面から直接ファイルを編集します。
互換性評価レポートには自動変換対象外のDDLがリストされています。
互換性評価レポートの「PL/SQL Evaluation」や「SQL Evaluation」タブを選択すると見ることができます。
![スクリーンショット 2018-12-18 16.30.43.png](https://qiita-image-store.s3.amazonaws.com/0/325142/e4bcca37-8abb-d883-9d07-f26ac5fc8ce4.png)
＋ボタンを展開すると、「Solution」の箇所に修正内容が書いてあるので、それを参考にしながらどう修正するか検討します。（必ずここに記載している内容通りに修正する必要があるわけではありません。ケースバイケースで最適な修正プランを考えます）

＜自動変換ができないDDLのリスト＞
![スクリーンショット 2018-12-19 18.25.50.png](https://qiita-image-store.s3.amazonaws.com/0/325142/afd17272-fc1b-e959-a62e-75602114d15c.png)

このレポートによると、EMP_DETAILS_VIEWの**WITH READ ONLYオプション**はDb2ではサポートされていないということなのでここを修正します。

![スクリーンショット 2018-12-19 18.34.47.png](https://qiita-image-store.s3.amazonaws.com/0/325142/78dd35ae-9b61-06d2-9ebe-5fedf066bc9a.png)

WITH READ ONLYオプションをコメントアウトします。
![スクリーンショット 2018-12-19 18.34.54.png](https://qiita-image-store.s3.amazonaws.com/0/325142/b3b9f42a-f8ae-985c-2ac3-d49cf7ad2b38.png)

このように全ての自動変換で対応できないDDLを修正していきます。

ちなみに、修正したDDLに再度互換性評価を行えば、互換性レベルが100%になるはず！と思いましたが、修正済みDDLファイルに対しては互換性評価は行えないようです・・・。残念！
![スクリーンショット 2018-12-18 16.36.56.png](https://qiita-image-store.s3.amazonaws.com/0/325142/9b11448e-7b0f-643d-3bd7-ac5ea53be383.png)

##5.Db2 on Cloudに変換したDDLを実行
ここからはIBM Liftを使用します。
修正したDDLを移行先のDb2 on Cloudに対して実行します。
DDLの実行はexecuteコマンドを使用します。

実行オプションをファイルにconfigファイルとして定義します
コマンドライン上でオプションを指定することも可能ですが、コマンド自体が長々としたものになり、修正しにくいため、今回はIBM Liftのコマンドオプションは全てファイルに書いて、コマンドライン上でファイル名を指定します。
＜executeコマンドのconfigファイル＞
![スクリーンショット 2018-12-14 16.05.16.png](https://qiita-image-store.s3.amazonaws.com/0/325142/da63438d-57c0-f09e-e7b6-d9fd94376a0f.png)
＜executeコマンド例＞

```lift execute --file extract_ddl_script_ddl_converted.sql --properties-file ddl_execute.cfg```

実行完了後、がDb2 on Cloudコンソールにログインをして、テーブル等のオブジェクトが作成されていることを確認します。
＜ログイン画面＞
![スクリーンショット 2018-12-14 16.15.39.png](https://qiita-image-store.s3.amazonaws.com/0/325142/ea161752-dd55-5cb9-0489-fb2801d5df71.png)
＜EXPLORE画面＞
![スクリーンショット 2018-12-14 16.15.16.png](https://qiita-image-store.s3.amazonaws.com/0/325142/6407c665-e260-5f8a-1e19-6298714d01f0.png)

##6.Oracle DBからデータ抽出
移行元DBのデータを出力にはexportコマンドを使用します。
exportされたデータはCSVファイルとして、IBM Lift CLIが導入されている環境に出力されます。
ワイルドカードや区切り文字を使って一気に全表のファイルを出力しようと試みましたが、どうやらできないようで、表ごとにコマンドを実行しました。
＜exportコマンドのオプション＞
![スクリーンショット 2018-12-14 16.39.43.png](https://qiita-image-store.s3.amazonaws.com/0/325142/93dd5236-0e5b-55ed-50b4-90ceaa81021f.png)
＜exportコマンド例＞
```lift export --source-table REGIONS --properties-file data_export.cfg```
##7.データをIBM Cloud上に転送
putコマンドでコマンドでCSVファイルをIBM Cloud上に転送します。
CSVファイルはIBM Cloud上のランディングゾーンという場所に転送されます。
＜IBM Liftのサイトに掲載されているイメージ図＞
![スクリーンショット 2018-12-18 16.45.16.png](https://qiita-image-store.s3.amazonaws.com/0/325142/db678272-2fac-5f7c-6efa-3ed5abec475c.png)

＜putコマンドのconfigファイル＞
putコマンドでは、ワイルドカードを使用したファイル指定が可能なようです。
「HR」から始まるcsvファイル全てを一気に転送することができました。
![スクリーンショット 2018-12-14 16.42.04.png](https://qiita-image-store.s3.amazonaws.com/0/325142/8ca3dda5-9e8a-c663-7faf-bde9bc71a5d7.png)
＜putコマンド例＞
```lift put --properties-file data_put.cfg```
ランディングゾーンに転送されたファイルはlsコマンドで確認できます。rmコマンドで転送されたファイルを削除することもできます。
＜lsコマンドのconfigファイル＞
![スクリーンショット 2018-12-14 16.42.22.png](https://qiita-image-store.s3.amazonaws.com/0/325142/6115d771-19df-33e7-7857-45e7e9736323.png)
全てのファイルが転送されていることを確認します。
RSamplesはデフォルトであるファイルです。
＜lsコマンド例＞
```lift ls --properties-file data_load.cfg```

＜lsコマンド出力例＞
![スクリーンショット 2018-12-14 16.46.59.png](https://qiita-image-store.s3.amazonaws.com/0/325142/0ee434c3-a633-e78e-978e-544a3186fb43.png)

##8.Db2 on Cloudにデータを読み込む
loadコマンドでDb2 on Cloudにランディングゾーンに転送されているファイルからデータを読み込みます。
今回は少ないデータ量でデータ移行を行っていますが、Load機能には高速データ転送ソフトウェアであるAsperaが使用されており、大量のデータの場合でも高速に読み込みを行うことができるようです。

＜loadコマンドのconfigファイル＞
![スクリーンショット 2018-12-14 17.01.53.png](https://qiita-image-store.s3.amazonaws.com/0/325142/be0f09e0-8751-f5e9-cfd3-dac4e6aa2df6.png)
＜loadコマンド＞
```lift load --filename HR.REGIONS.csv --target-table REGIONS --properties-file data_load.cfg```

##最後にデータの確認
Db2 on Cloudコンソール上でデータを確認します。
![スクリーンショット 2018-12-14 17.10.58.png](https://qiita-image-store.s3.amazonaws.com/0/325142/be5fb608-63ee-8e40-3eba-5a7572ff1ac7.png)

##おまけ
今回はDDLの実行手順ではIBM Liftを使用していますが
Db2 on CloudのコンソールからGUI操作でDDLの実行・データのロードを行うことができます。（今回はEMPLOYEES2という表を定義し、データをロードします）
DDLの実行は、RUN SQLから直接SQLを入力します
![スクリーンショット 2018-12-14 17.14.29.png](https://qiita-image-store.s3.amazonaws.com/0/325142/301df1f8-fc7d-5340-24ca-0cec36d3433e.png)
データのロードはLOADから、CSVファイルを指定します。
![スクリーンショット 2018-12-14 17.14.49.png](https://qiita-image-store.s3.amazonaws.com/0/325142/759fe7a7-9cc6-b1f1-89d1-35295ff3d208.png)
ターゲット表を選択します。
![スクリーンショット 2018-12-14 17.15.17.png](https://qiita-image-store.s3.amazonaws.com/0/325142/fd0d4188-6408-91fd-34ec-e3c858d83bc3.png)
文字コードや区切り文字などロードオプションを指定します。
![スクリーンショット 2018-12-14 17.15.33.png](https://qiita-image-store.s3.amazonaws.com/0/325142/4eb13b13-0a65-0b92-0446-fefd871085de.png)
DateやTime型等のフォーマット定義を変更する場合は変更します。
ここではロードされるデータイメージを参照することが可能です。
![スクリーンショット 2018-12-14 17.16.00.png](https://qiita-image-store.s3.amazonaws.com/0/325142/26a54099-38ed-85b3-7d18-1ee219dfd780.png)
ロードを実行します。無事に全てのデータのロードに成功しました。
![スクリーンショット 2018-12-14 17.16.24.png](https://qiita-image-store.s3.amazonaws.com/0/325142/ae6a1c09-c162-24d1-4199-a65acb9dce0e.png)


##参考動画
これらの手順は動画にもまとめてあります。よろしければご参照ください。
[OracleからDb2への移行（３分版/10分版）](https://www.youtube.com/playlist?list=PL97CF7A9CC2DCCA6C)