Amazon Web Services ブログ

AWS DMS でのテーブルマッピング作成の自動化

AWS Database Migration Service (AWS DMS) を使えば、オンプレミスデータベースを AWS に迅速かつ安全に移行できます。同種間だけでなく、異種間の移行もサポートしています。移行の実行中やテスト中でも、ソースデータベースは稼働を続けます。移行は、DMS レプリケーションサーバー、ソース、ターゲットエンドポイント、移行タスクを使って行います。

DMS を使って多くのデータベースを移行したい、そして少数のテーブルだけを選択して JSON ファイルの作成を自動化したいなら、この投稿はお役に立つことと思います。この投稿では、DMS タスクの JSON ファイル作成を自動化するツールについて説明します。

自動化の必要性

DMS は、移行プロジェクトに関連する難しいまたは面倒なタスクを数多く引き継いでくれます。ロギングやエラー処理などの特別な処理を行うとともに、移行するスキーマとテーブルを指定します。

移行タスクには次のものが含まれます。

  • 名前
  • 内容
  • ソース
  • ターゲットエンドポイント
  • テーブルマッピング

この投稿では、特にテーブルマッピングのセクションに焦点を当てています。テーブルマッピングではいくつかのタイプのルールを使用して、データソース、スキーマ、タスク中に発生する変換などを指定します。

テーブルマッピングを指定するには、ガイド付きと JSON の 2 つの異なる方法があります。

ガイド付きの方法では、個々のテーブル名またはワイルドカード文字 (% や ABC%) としてテーブル名を入力できます。移行のために選択したテーブルを含めたり除外したりする必要のあるテーブルが多数ある場合、ガイド付きの方法は時間がかかります。

一方 JSON の自動化オプションは、同じ情報を詳細に入力できます。

この投稿では、Python ツールを使用した JSON ファイル作成の自動化を取り上げています。JSON ファイルは手動で作成できますが、記述されているルールの数によっては扱いにくく、あるいはエラーが発生しやすくなります。

自動化ソリューションの説明

この投稿では Python ベースのツールをご紹介します。これは、入力を CSV ファイルとして受け取り、必要とする除外ルールとアクションルールのコンポーネントを含んだ単一の JSON ファイルを生成します。特定のフォルダーに複数の入力ファイルが存在する場合があります。ツールへ唯一入力できる場所はフォルダーです。

このフォルダー内のすべてのファイルの名前は、include* または exclude* で始まる必要があります。これは、その特定のファイルのどのコンテンツを含め、除外するかを示しています。ファイルのコンテンツは、カンマで区切られた各行のスキーマ名とテーブル名です。以下の手順には、ソースデータベースで実行して、include* ファイルまたは exclude* ファイルを生成できるクエリを含めてます。

前提条件

このソリューションの前提条件は、次のとおりです。

  • アマゾン ウェブ サービス (AWS) アカウントへのアクセス: サンプルの AWS Data Migration Service を設定するには、AWS アカウントが必要です。AWS にサインアップする
  • IT スキルレベル: このプロジェクトを正しく実行するには、Oracle と SQL の基本的な知識が必要です。
  • Python 2.7 がインストールされたインスタンス。

アーキテクチャ図

次のアーキテクチャ図は、イベントのフローを示しています。詳細については、次のステップのセクションをご覧ください。

ソリューションのステップ

ソリューションを実装するには、次の手順を実行します。

1) 既存のオンプレミス環境に基づいて、Oracle/SQLサーバーに接続します。使用可能なテーブルのリスト全体を見つけるには、次のクエリを実行して、HR の場所で必要とするスキーマ名を変更します。たとえば、次のスクリプトを .sql ファイルにコピーします。「allhrtables.sql

set heading off
set pages 0
set feedback off
set echo off
col text format a500
set trimspool on
set trimout on
spool alltable.csv
select owner||','||object_name from dba_objects
where owner='HR' and object_type='TABLE'
spool off;
exit;

これで、このコマンドを実行すると、使用可能なテーブルのリストが表示されるようになります。

sqlplus -s <UserName>/<Password>@<DB_Alias> @<SQL_FileName>

例えば、次のようになります。

sqlplus -s oraadmin/oraadmin123@orclauth @allhrtables.sql

以下は、出力がどのようになるかを示すスクリーンショットプレビューです。

2) 利用可能なすべてのテーブルのリストから CSV ファイルを生成します。このファイルには、AWS へ移行した少数のテーブルを含めたり除外したりできます。少数のテーブルのみを移行するには、最初にどのテーブル (またはテーブル名のパターン) を含め、除外するかを決定する必要があります。決定後、次のようにスクリプトを実行します。以下に、含まれるテーブルと除外されるテーブルの 2 つの例を示します。どちらのファイルも相互に排他的で、含まれる/除外される同じテーブルを説明しています。

含める場合のシナリオ

この例は、テーブル名が TEMPBACKUPLOGARCHIVEHISTORY で終わるものを除いたすべてのテーブルを含んでいます。「include.sql」というファイルを作成し、次の行をコピーしてください。

set heading off
set pages 0
set feedback off
set echo off
col text format a500
set trimspool on
set trimout on
spool include.csv
select owner||','||object_name from dba_objects
where owner='HR' and object_type='TABLE'
and object_name not like '%TEMP'
and object_name not like '%BACKUP'
and object_name not like '%LOG'
and object_name not like '%ARCHIVE'
and object_name not like '%HISTORY';
spool off;
exit;

ファイルの準備ができたら、それを実行し、次のように include.csv を用意します。

sqlplus -s <UserName>/<Password>@<DB_Alias> @include.sql

例えば、次のようになります。

sqlplus -s oraadmin/oraadmin123@orclauth @include.sql

以下は、出力がどのようになるかを示すスクリーンショットプレビューです。

除外する場合のシナリオ

この例は、テーブル名が TEMPBACKUPLOGARCHIVEHISTORY で終わるものを除いたすべてのテーブルを含んでいます。これは、前のセクションで説明したものと同じシナリオです。この CSV ファイルで、含めるテーブルではなく除外するテーブルを言及します。これを行うには、「exclude.sql」というファイルを作成し、その中に次の行をコピーしてください。

set heading off
set pages 0
set feedback off
set echo off
col text format a500
set trimspool on
set trimout on
spool exclude.csv
select owner||','||object_name from dba_objects
where owner='HR' and object_type='TABLE'
and (object_name like '%TEMP'
or object_name like '%BACKUP'
or object_name like '%LOG'
or object_name like '%ARCHIVE'
or object_name like '%HISTORY');
spool off;
exit;

ファイルの準備ができたら、それを実行し、次のように exclude.csvファイルを用意します。

sqlplus -s <UserName>/<Password>@<DB_Alias> @exclude.sql

例えば、次のようになります。

sqlplus -s oraadmin/oraadmin123@orclauth @exclude.sql

以下は、出力がどのようになるかを示すスクリーンショットプレビューです。

さらなるステップ

含める場合のシナリオ、および除外する場合のシナリオを設定したら、次の手順を実行してください。

3) CSV ファイルの準備ができたら、それらを Python プログラムを実行しているマシンのフォルダーにコピーします。

4) GitHub から Python プログラムをダウンロードするか、ワークステーション内の適切な場所に以下をコピーします。

line_count = 0
data['rules'] = []

def writeJSON():
    with open('automated_json.json', 'w') as outfile:
        json.dump(data, outfile)


def createJSON(csvfile,action):
    global line_count
    with open(csvfile) as file:
       csv_reader = csv.reader(file, delimiter=',')

       for row in csv_reader:
           counter = str(line_count + 1)
           data['rules'].append({
               "rule-type": "selection",
               "rule-id": counter,
               "rule-name": counter,
               "object-locator": {
                   "schema-name": row[0],
                   "table-name": row[1]
               },
               "rule-action": action
           })
           line_count += 1


if __name__ == "__main__":
    print("This program expects a folder location from the user. ")
    print("The folder can have two different types of files in csv format.")
    print("The file types are include table list and exclude table list.")
    print(" ")
    print("The file name should start with include or exclude to indicate "
          "whether the content of a particular file has to included or excluded.")
    print(" ")
    print("Both include and exclude files should contain schema name and the table name "
          "to be included or excluded separated by comma.")
    print("It is not necessary to have both include and exclude files.")
    print(" ")

    File_Location = raw_input("Enter the Folder location: ")
    if("/" in File_Location):
        separator = "/"
    else:
        separator = "\\"
    listOfFiles = os.listdir(File_Location)
    for entry in listOfFiles:
        if (entry.startswith("include")):
            createJSON(File_Location+separator+entry,"include")
        elif (entry.startswith("exclude")):
            createJSON(File_Location+seperater+entry, "exclude")

    writeJSON()

5) Python プログラムを実行し、include.sql または exclude.sql ファイルが存在するフォルダーの場所を指定します。 以下は、出力がどのようになるかを示すスクリーンショットプレビューです。

お好きなテキストエディタで JSON ファイルを開き、コンテンツをコピーし、JSONLint を使って検証します。この検証では、JSON ファイルを整形形式でフォーマットすることもできます。

JSON ファイルを整形形式で表示するには、Python プログラムが存在するフォルダーから次のコマンドを実行します。

python -m json.tool automated_json.json

6) 下の図に示すように、「テーブルマッピング」セクションには、ガイド付き UI と JSON エディタの 2 つの編集オプションがあります。2 つ目の JSON エディタオプションを選択し、前の手順でプログラムから生成した JSON ファイルのコンテンツをコピーします。

この自動化アプローチを使用する利点は、次のとおりです。

  • より高速に、include テーブルと exclude テーブルのリストから JSON ファイルを生成します。
  • 手動介入を回避できるため、エラーが減少します。
  • 特定のスキーマのすべてのテーブルではなく、少数のテーブルのみを含めたい場合、このプログラムでは、選択したテーブルを含めて、ワイルドカードオプションを無効にすることが可能です。

まとめ

この投稿では、Python プログラムを使用して JSON ファイルを作成する手順を詳しく説明しました。この JSON ファイルは、AWS DMS の使用中に選択したテーブルを含む、あるいは除外します。この JSON ファイルを DMS のテーブルマッピングセクションで使用することで、選択したテーブルをオンプレミス環境から AWS に移行できます。

ご使用の環境でぜひこのアプローチを試してみて、上で述べたような利点をお確かめください。この投稿が、移行の高速化に役立つことを願っています。質問や機能に関するリクエストは、コメント欄よりお気軽にお送りください。

 


著者について


Amishi Shah は DevOps コンサルタントで、アマゾン ウェブ サービスのプロフェッショナルサービスチームに所属しています。お客様とともに、AWS クラウドでスケーラブルで可用性の高い、安全なソリューションを構築しています。技術、組織、SDLC の大規模な変革を通じて、企業顧客を手引きすることに取り組んでいます。

 

 

 

Bhavesh Rathod は Oracle データベースクラウドアーキテクトで、アマゾン ウェブ サービスのプロフェッショナルサービスチームに所属しています。データベース移行のスペシャリストとして、Amazon のお客様がオンプレミスデータベース環境を AWS クラウドデータベースソリューションに移行する支援を行っています。