Amazon Database Migration Service(DMS)のテーブルマッピング機能を試してみた

Amazon Database Migration Serviceでデータベース間のデータ移行時にテーブルマッピングの機能を利用して移行してみました。

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、AWS事業本部のニシヤマです。

AWSにおいてデータベース間のデータ移行の際にAmazon Database Migration Service(DMS)というサービスがあります。こちらのサービスではオンプレ環境やRDSなどのデータベース間でのデータを一括移行、継続的なデータレプリケートを行うことが可能です。

今回はそのデータ移行の際に移行データの絞り込みや、移行先テーブルの変更に利用可能なテーブルマッピング機能を試してみました。

環境準備

こちらを検証するために2台のRDSインスタンスと、データ移行のタスクを実行するためのDMSレプリケーションインスタンスの構築が必要になりますが、こちらのチュートリアルの手順に従って実施することで簡単に環境構築が可能になります。

今回はこのチュートリアルの中のOracle to Amazon RDS for Oracleを利用しました。

引用元:https://catalog.us-east-1.prod.workshops.aws/v2/workshops/77bdff4f-2d9e-4d68-99ba-248ea95b3aca/en-US/oracle-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テーブルのみデータ移行という単純なケースで試してみましたが、変換ルールについてもテーブルだけでは無くスキーマや列に対しても条件を指定することが可能です。実際のケースで利用する場合は複数の条件や複数タスクを組み合わして実施することになるかと思いますので、要件にあった指定方法があるか確認していただければと思います。

この記事がどなたかの参考になれば幸いです。

参考