Amazon Database Migration Service(DMS)のテーブルマッピング機能を試してみた
こんにちは、AWS事業本部のニシヤマです。
AWSにおいてデータベース間のデータ移行の際にAmazon Database Migration Service(DMS)というサービスがあります。こちらのサービスではオンプレ環境やRDSなどのデータベース間でのデータを一括移行、継続的なデータレプリケートを行うことが可能です。
今回はそのデータ移行の際に移行データの絞り込みや、移行先テーブルの変更に利用可能なテーブルマッピング機能を試してみました。
環境準備
こちらを検証するために2台のRDSインスタンスと、データ移行のタスクを実行するためのDMSレプリケーションインスタンスの構築が必要になりますが、こちらのチュートリアルの手順に従って実施することで簡単に環境構築が可能になります。
今回はこのチュートリアルの中のOracle to Amazon RDS for Oracleを利用しました。
こちらの手順に添付されたCloudFormationテンプレートですと、今回の検証に必要なDMSのレプリケーションインスタンス、移行タスクは作成されないのでチュートリアルを実施してデータ移行できる環境を用意してください。
また、テンプレートではRDSインスタンス、EC2インスタンス、EBSが料金が高めの物を利用するようになっているので検証する際は注意してください。必要に応じてインスタンスタイプ等の変更をお勧めします。
ソースフィルタを試してみる
ではソースフィルタを試してみます。まずは利用するテーブルを決めるために適度なデータ数があるテーブルを選びます。RDSへの接続についてはチュートリアルの中で構築されるOracle SQL Developerの導入されたEC2インスタンスを利用しています。
ソースRDSには自動的にいくつかのテーブルとデータが用意されていますが今回はその中のSPORT_DIVISION
テーブルを利用します。
こちらのテーブルのテーブル構成とデータは以下の状態です。
Name Null? Type ----------------------- -------- ------------- SPORT_TYPE_NAME NOT NULL VARCHAR2(15) SPORT_LEAGUE_SHORT_NAME NOT NULL VARCHAR2(10) SHORT_NAME NOT NULL VARCHAR2(10) LONG_NAME VARCHAR2(60) DESCRIPTION VARCHAR2(120) SPORT_TYPE_NAME SPORT_LEAG SHORT_NAME LONG_NAME DESCRIPTION --------------- ---------- ---------- ------------------------------------ -------------------------------------- baseball MLB AL East American League East American League East baseball MLB AL Central American League Central American League Central baseball MLB AL West American League West American League West baseball MLB NL East National League East National League East baseball MLB NL Central National League Central National League Central baseball MLB NL West National League West National League West football NFL AFC East American Football Conference East American Football Conference East football NFL AFC West American Football Conference West American Football Conference West football NFL AFC North American Football Conference North American Football Conference North football NFL AFC South American Football Conference South American Football Conference South football NFL NFC East National Football Conference East National Football Conference East football NFL NFC West National Football Conference West National Football Conference West football NFL NFC North National Football Conference North National Football Conference North football NFL NFC South National Football Conference South National Football Conference South 14 rows selected.
まずはチュートリアルに従い、全てのデータを移行したターゲットRDSの状態でテーブル構造と移行されたレコードを確認します。
ではテーブルマッピングの効果がわかりやすいように一度ターゲットRDSのSPORT_DIVISION
テーブルのレコードを削除しておきます。
行のフィルタ
それではまずは行のフィルタ
をやってみます。これはSQL文のWHERE
句と同じように特定の条件に合うレコードのみをターゲットRDSに移行します。
今回はSPORT_TYPE_NAMEがbaseball
のレコードのみ移行してみます。
チュートリアルで作成したデータベース移行タスクからフルロードのタスクを選択しアクション>変更をクリックします。 ここでテーブルマッピングの選択ルール>列フィルタの追加をクリックして以下の情報を追加します。
フィールド | 値 |
---|---|
列名 | SPORT_TYPE_NAME |
条件 1 | と等しい |
値 | 「baseball」 |
またこのままだとどのテーブルに対してのフィルタ処理かわからないためテーブル名の値も%
からSPORT_DIVISION
に変更します。
これで保存
をクリックして設定変更をします。
少し待つと保存が完了します。ただ、先ほどの変更では保存後に実行するオプションを有効にしていないのでそのままでは実行されないので、再度データベース移行タスクの画面で対象のタスクにチェックを入れて開始/再開
を実行します。
確認画面が出たら再起動を選択してタスクの開始
をクリックします。
少しすると実行が完了しますのでSQL Developerで確認します。
念の為、テーブルの件数もカウントしてもSPORT_TYPE_NAME=baseball
の6件のみが移行されています。
列の削除
次に列の削除を試してみます。一旦ターゲットRDS側のテーブルをSQL Developerで以下のDROP TABLE文を実行しておきます。
DROP TABLE DBMASTER.SPORT_DIVISION;
再びマネジメントコンソールからフルロードのタスクを選択しアクション>変更をクリックします。
今度はテーブルマッピングの中で変換ルールの追加
をクリックし、以下の情報を入力します。
フィールド | 値 |
---|---|
ターゲット | 列 |
スキーマ名 | DMS_SAMPLE |
テーブル名 | SPORT_DIVISION |
列名 | DESCRIPTION |
アクション | 列の削除 |
今度はタスク設定保存後にすぐ実行されるように変更画面上部にあるタスクの設定の変更時にタスクを開始
にチェックを入れてから保存します。先ほどと同様に確認画面が出たら再起動を選択してタスクの開始
をクリックします。
実行完了まで待ってSQL Developerで確認します。
冒頭でご紹介したテーブル構造からDESCRIPTION
列が無い状態で14件のデータの移行ができています!
条件ごとに別のテーブルに移行
最後に条件を指定して異なるテーブルへ移行する方法を試してみます。
以下の条件でレコードをターゲットRDSの別々のテーブルに移行させます。
条件 | 移行先テーブル名 |
---|---|
SPORT_TYPE_NAME = baseball |
BASEBALL_SPORT_DIVISION |
まずは現状を確認します。
移行先のターゲットRDS側にBASEBALL_SPORT_DIVISION
テーブルは無くSPORT_DIVISION
テーブルも空の状態にしています。
それではタスクのテーブルマッピングの画面に移動します。
今度はテーブルマッピングの変換ルール
で以下の情報を入力して保存と実行をします。
フィールド | 値 |
---|---|
ターゲット | テーブル |
スキーマ名 | DMS_SAMPLE |
テーブル名 | SPORT_DIVISION |
アクション | 名前の変更 |
値 | 「BASEBALL_SPORT_DIVISION」 |
こちらでタスクを実行した結果が以下になります。
ちゃんとSPORT_DIVISION
テーブルでは無くBASEBALL_SPORT_DIVISION
テーブルにデータが移行されています。
以上です!
まとめ
DMSを利用することで2つのデータベース間で簡単にデータ移行を行うことが可能です。ただし、そのまま全データを移行するのではなくデータを絞り込みや不要なデータ切り捨て、移行先のテーブルを変更したりなどの要望にはこれらのフィルタ機能を利用していただくことが可能です。 今回は1テーブルのみデータ移行という単純なケースで試してみましたが、変換ルールについてもテーブルだけでは無くスキーマや列に対しても条件を指定することが可能です。実際のケースで利用する場合は複数の条件や複数タスクを組み合わして実施することになるかと思いますので、要件にあった指定方法があるか確認していただければと思います。
この記事がどなたかの参考になれば幸いです。
参考
- https://aws.amazon.com/jp/dms/
- https://docs.aws.amazon.com/ja_jp/dms/latest/userguide/CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Selections.html
- https://docs.aws.amazon.com/ja_jp/dms/latest/userguide/CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Transformations.html
- https://www.slideshare.net/AmazonWebServicesJapan/20210216-aws-black-belt-online-seminar-aws-database-migration-service