はじめに
データベースを異なるプラットフォームで移行する場合、文字コードなどの考慮事項があります。それらを踏まえて移行方法を検討しました。
内容
以下の前提でIBM Db2の移行方法を説明、検討します。
- サーバーをWindowsからLinuxへ変更
- Db2をバージョンアップ
- データを移行
移行する環境
移行元DBサーバー | 移行先DBサーバー | |
---|---|---|
OS | Windows Server 2008 R2 | Ubuntu 20.04 LTS |
DBMS | IBM Db2 V10.1 | IBM Db2 V11.5 |
文字コード(OS) | Shift JIS | UTF-8 |
文字コード(DB) | Shift JIS | Shift JIS |
移行する方法
移行するやり方は3つあります。
移行方法 | 特徴 | Windows-Linux |
---|---|---|
バックアップ/リストア | データベース単位にファイルに出力 | 不可 |
エクスポート/ロード | テーブル単位にファイル出力 | 可能 |
カーソルを用いたロード | 移行元DBに接続してselect/load | 可能 |
バックアップ/リストア
backupコマンドでデータベース単位にバックアップし、作成したバックアップファイルを元にrestoreコマンドで復元します。データのバージョンアップはDb2が行います。最も簡単な方法ですが、プラットフォームの互換性、Db2のバージョン間の互換性を考慮する必要があります。詳細はIBMのウェブサイトをご覧ください。
エクスポート/ロード
exportコマンドでテーブル単位にファイルを出力、それを元に移行先のテーブルへloadコマンドで挿入します。もっとも可搬性が高く、DBMSを変更する際にも用いられる方法です。ファイルを出力、読み込む際に以下に注意を払う必要があります。
- 32KBを超えるレコード長
- ラージオブジェクト(LOB)
- 文字コード
エクスポート/ロードはQiitaもご覧ください。
Db2:データベースをExportで全部移行してくれ
Db2:データベースをLoadで全部移行してくれ
カーソルを用いたロード
移行先のデータベースに接続したうえで移行元のデータベースをカーソルで定義、そのカーソルでselectしたレコードをloadします。ファイル出力をしないので作業用ファイルスペースを用意する必要がありません。移行元DBサーバーと移行先DBサーバーとが同じ場所でなくオンプレミスとクラウドといった場合、移行に時間がかかる可能性があります。
connect to NEWDB ;
declare mycurs cursor database OLDDB user user1 using pwd1 for select two,one,three from abc.table1 ;
load from mycurs of cursor insert into abc.table1 ;
LOADコマンドの詳細はIBMのウェブサイトをご覧ください。
LOADコマンド
どの方法を選ぶか
今回はWindowsからLinuxへの移行なのでバックアップ/リストアは使えません。データベースの文字コードはShift JISのままで変更なしですが**OSがShift JISからUTF-8に変わります。**エクスポート/ロードで移行する場合、文字コードに対する対応、環境設定の変更が必要な場合があります。
OS(Linux)がUTF-8でDBがShift JISの場合、CSVファイルをそのままインポートすると文字化けします。コードページをShift-JISに変更してからインポートします。
1.DB2CODEPAGEをShift-JISに設定
export DB2CODEPAGE=943
2.データベースを切断
db2 terminate
3.データベースを再接続してコードページを反映
db2 connect to mydb
4.Shift-JISのcsvをインポート
db2 import from file.csv of del insert into table1
カーソルを用いたロードで移行する場合、ファイルを介さずデータベース間でのやり取りのため、文字コードに対する対応は不要になります。
移行方法 | メリット | デメリット |
---|---|---|
バックアップ/リストア | 最も単純で簡単 | Windows-Linuxは不可 |
エクスポート/ロード | 可搬性に優れる | 文字コードの考慮が必要 |
カーソルを用いたロード | 文字コードの考慮が不要 | リモート接続だと遅い |
エクスポート/ロードはケアレスミスで簡単に文字化けしそうです。正直、文字化けトラブルは泥沼なので係わりたくありません。今回のケースですとファイル出力も不要なカーソルを用いたロードで移行することにしました。
おわりに
データベースの移行は前提条件によって選択する方法が変わります。今回は同じDBMSなのでカーソルを用いたロードを選択しましたが、DBMSを変更するならエクスポート/ロードを選択するか異種DBMS間を接続するアダプターを介しての移行になるかと思います。