0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AWS DMS のテーブルマッピングを整理してみた

Posted at

背景・目的

AWS Database Migration Service (DMS) のテーブルマッピング機能について、触れる機会があったので整理する。

まとめ

下記に特徴をまとめます。

特徴 説明
DMSのテーブルマッピング 選択ルールと変換ルールで構成される
選択ルール Where セクションとFilterセクションで構成される
変換ルール 選択ルールの設定後、下記の追加が行える。
・スキーマ、テーブルの名前変更
・プレフィックス、サフィックスの追加
・テーブル列の削除
JSON の変換 最大2MBまで変換ルールをJSONで定義が可能
4つのルールタイプ ・selection
・transformation
・table-settings
・post-processing

概要

コンソールからテーブル選択および変換を指定する

AWS DMS のテーブルマッピングは2つの主要機能で構成されている。これら2つのアクションを組み合わせて選択ルールを作る

  1. 選択ルール
  • Where セクション
    • スキーマ、テーブル、アクションを含めるか除外する
  • Filter セクション
    • 列の名前と条件でデータをフィルタリング
  1. 変換ルール
    選択ルール設定後に追加が可能
  • スキーマ、テーブルの名前変更
  • プレフィックス、サフィックスの追加
  • テーブル列の削除

どのデータを移行するか(選択)を決めてから、どう変換するか(変換)を指定する流れ

JSON を使用するテーブル選択および変換を指定する

DMS のテーブルマッピングは JSON ファイルで定義する。

  • コンソールを使用して、JSON ファイル or 直接入力を処理できる

  • 最大2MBのJSONファイルを処理できる

    • 超える場合は、分割
  • 4つのルールタイプ

    • selection
      • どのテーブル/ビュー/スキーマをロードするか
    • transformation
      • ロード前にデータをどう変換するか(式で列内容も定義可能)
    • table-settings
      • 個別テーブルのロード方法を指定
    • post-processing
      • S3 ターゲット限定でオブジェクトタグ付けできる

基本は selection(何を)→ transformation(どう変換)の順で設定します。

選択ルールと選択アクション

テーブルマッピングを使用すると、選択ルールと選択アクションを使用することで、使用するテーブル、ビューやスキーマを指定できる
選択ルールタイプを使用するテーブルマッピングルールの場合、次の値を適用できる。

  • 基本パラメータ
パラメータ
rule-type selection(必須)
rule-id 一意の数値
rule-name 一意の名前
rule-action include / exclude / explicit
  • object-locator(対象指定)
パラメータ
schema-name スキーマ名
table-name テーブル名
table-type table / view / all(デフォルト: table)

その他

パラメータ
load-order ロード優先順位(数値大が先)
filters 列ベースのフィルタ条件

重要な制約

  • ビューは全ロードタスクのみ対応(CDC不可)
  • ビューはターゲットでテーブルとしてロード
  • 大文字小文字はソースDB設定に依存
  • explicit はワイルドカード不可、1オブジェクトのみ指定

対応ソース(ビュー): Oracle, SQL Server, PostgreSQL, Db2, ASE, MySQL, Aurora
MySQL, MariaDB
対応ソース(コレクション): MongoDB, DocumentDB

例 スキーマ内のすべてのテーブルの移行

以下の例では、ソース内の Test という名前のスキーマからすべてのテーブルをターゲットエンドポイントに移行します。

{
    "rules": [
        {
            "rule-type": "selection",
            "rule-id": "1",
            "rule-name": "1",
            "object-locator": {
                "schema-name": "Test",
                "table-name": "%"
            },
            "rule-action": "include"
        }
    ]
}

例 スキーマの一部のテーブルの移行

以下の例では、ソース内の Test という名前のスキーマから、先頭が DMS のテーブルを除くすべてのテーブルをターゲットエンドポイントに移行します。

{
    "rules": [
        {
            "rule-type": "selection",
            "rule-id": "1",
            "rule-name": "1",
            "object-locator": {
                "schema-name": "Test",
                "table-name": "%"
            },
            "rule-action": "include"
        },
        {
            "rule-type": "selection",
            "rule-id": "2",
            "rule-name": "2",
            "object-locator": {
                "schema-name": "Test",
                "table-name": "DMS%"
            },
            "rule-action": "exclude"
        }
    ]
}

例 単一のスキーマで指定した単一のテーブルの移行

以下の例では、ソース内の NewCust スキーマから Customer テーブルをターゲットエンドポイントに移行します。

複数の選択ルールを指定することで、複数のテーブルとスキーマを明示的に選択できる

{
    "rules": [
        {
            "rule-type": "selection",
            "rule-id": "1",
            "rule-name": "1",
            "object-locator": {
                "schema-name": "NewCust",
                "table-name": "Customer"
            },
            "rule-action": "explicit"
        }
    ]
}

例 設定順でテーブルを移行

  • 数値が大きいほど優先度が高い(先にロード)
    • 例: load-order: 2 のテーブル → load-order: 1 のテーブルの順
  • テーブル間の依存関係を制御する場合などに利用
    • 親テーブルを先にロードなど
{
    "rules": [
        {
            "rule-type": "selection",
            "rule-id": "1",
            "rule-name": "1",
            "object-locator": {
                "schema-name": "Test",
                "table-name": "loadsecond"
            },
            "rule-action": "include",
            "load-order": "1"
        },
        {
            "rule-type": "selection",
            "rule-id": "2",
            "rule-name": "2",
            "object-locator": {
                "schema-name": "Test",
                "table-name": "loadfirst"
            },
            "rule-action": "include",
            "load-order": "2"
        }
    ]
}

例 スキーマの一部のビューの移行

以下の例では、ソースの Test という名前のスキーマからターゲット内の同等のテーブルに、一部のビューを移行します。

{
   "rules": [
        {
           "rule-type": "selection",
           "rule-id": "2",
           "rule-name": "2",
           "object-locator": {
               "schema-name": "Test",
               "table-name": "view_DMS%",
               "table-type": "view"
            },
           "rule-action": "include"
        }
    ]
}

例 スキーマ内のすべてのテーブルとビューの移行

以下の例では、ソースの report という名前のスキーマからターゲット内の同等のテーブルに、すべてのテーブルとビューを移行します。

{
   "rules": [
        {
           "rule-type": "selection",
           "rule-id": "3",
           "rule-name": "3",
           "object-locator": {
               "schema-name": "report",
               "table-name": "%",
               "table-type": "all"
            },
           "rule-action": "include"
        }
    ]
}

テーブルマッピングのワイルドカード

テーブルマッピングで使用できるワイルドカード

ワイルドカード マッチ内容
% 0文字以上の任意の文字
_ 1文字の任意の文字
[_] アンダースコア文字そのもの
[ab] 文字セット(例: 'a' または 'b')
[a-d] 文字範囲(例: 'a', 'b', 'c', 'd' のいずれか)

Oracle 間の移行時の補足

  • 接続属性 escapeCharacter でエスケープ文字を指定可能
  • 例: escapeCharacter=# とすると、#% でワイルドカードではなく通常の % 文字として扱える

エスケープ文字 # を使うことで、ワイルドカード _ を通常の文字として扱える

変換ルールおよび変換アクション

変換ルールの主な制限事項は下記の通り。

適用制限

  • 同一オブジェクトに複数の変換ルール不可(例外: データマスキング時は ADD-COLUMN と CHANGE-DATA-TYPE の併用可)
  • テーブル名・列名は大文字小文字を区別される
    • Oracle/Db2 は大文字指定必須
  • 特殊文字(#, , /, - など)を含む列名は変換不可
  • BLOB/CLOB 列は、ターゲットでの削除のみ対応

重複禁止

  • 2つのソーステーブルを1つのターゲットテーブルにレプリケート不可
  • オブジェクト名は一意である必要がある
    • 例えばソースに ID 列、ターゲットに id 列が既存の場合、ADD-COLUMN で id を追加すると重複エラーになる

非推奨事項

  • data-type パラメータは複数列選択時のみ使用(単一列には非推奨)
  • ソースとターゲットが同じデータベース/スキーマの変換ルールは非対応
    • テーブルデータへの意図しない変更等の予期しない結果につながる

変換ルール(transformation)の主要パラメータは下記の通り。

基本パラメータ

  • rule-type
    • transformation
  • rule-id
    • 一意の数値(複数ルール時は小さい ID が先に適用)
  • rule-name
    • 一意の名前
  • rule-target
    • schema
    • table
    • column
    • table-tablespace
    • index-tablespace

object-locator

  • 対象指定
  • schema-name, table-name, column-name
    • ワイルドカード % 使用可
  • table-tablespace-name, index-tablespace-name
    • Oracle のみ、同時指定不可
  • data-type: 既存の列データ型(ワイルドカード不可)

rule-action

  • 変換アクション
  • 列操作
    • add-column
    • include-column
    • remove-column
  • 名前変更
    • rename
  • 大文字小文字
    • convert-lowercase
    • convert-uppercase
  • プレフィックス/サフィックス
    • add-prefix
    • remove-prefix
    • replace-prefix
    • add-suffix
    • remove-suffix
    • replace-suffix
  • その他
    • define-primary-key
    • change-data-type
    • add-before-image-columns
  • データマスキング
    • data-masking-digits-mask
    • data-masking-digits-randomize
    • data-masking-hash-mask

その他パラメータ

  • value
    • 新しい値(rename 時など)
  • old-value
    • 置換前の値(replace-prefix 時など)
  • data-type
    • データ型定義(type, precision, scale, length)
  • expression
    • SQLite 構文で列内容を定義(演算子・コマンド不可)
  • primary-key-def
    • プライマリキー定義(name, origin, columns)
  • before-image-def
    • CDC 前イメージ列の設定(column-prefix, column-suffix, column-filter)

例 スキーマの名前変更

以下の例では、スキーマの名前をソースでの Test からターゲットでの Test1 に変更します。

{

    "rules": [
        {
            "rule-type": "selection",
            "rule-id": "1",
            "rule-name": "1",
            "object-locator": {
                "schema-name": "Test",
                "table-name": "%"
            },
            "rule-action": "include"
        },
        {
            "rule-type": "transformation",
            "rule-id": "2",
            "rule-name": "2",
            "rule-action": "rename",
            "rule-target": "schema",
            "object-locator": {
                "schema-name": "Test"
            },
            "value": "Test1"
        }
    ]
}

例 テーブル名の変更

以下の例では、テーブルの名前をソースでの Actor からターゲットでの Actor1 に変更します。

{
    "rules": [
        {
            "rule-type": "selection",
            "rule-id": "1",
            "rule-name": "1",
            "object-locator": {
                "schema-name": "Test",
                "table-name": "%"
            },
            "rule-action": "include"
        },
        {
            "rule-type": "transformation",
            "rule-id": "2",
            "rule-name": "2",
            "rule-action": "rename",
            "rule-target": "table",
            "object-locator": {
                "schema-name": "Test",
                "table-name": "Actor"
            },
            "value": "Actor1"
        }
    ]
}

例 列名の変更

以下の例では、テーブル Actor の列の名前をソースでの first_name からターゲットでの fname に変更します。

{
    "rules": [
        {
            "rule-type": "selection",
            "rule-id": "1",
            "rule-name": "1",
            "object-locator": {
                "schema-name": "test",
                "table-name": "%"
            },
            "rule-action": "include"
        },
         {
            "rule-type": "transformation",
            "rule-id": "4",
            "rule-name": "4",
            "rule-action": "rename",
            "rule-target": "column",
            "object-locator": {
                "schema-name": "test",
                "table-name": "Actor",
                "column-name" : "first_name"
            },
            "value": "fname"
        }
    ]
}

例 Oracle テーブルのテーブルスペースの名前変更

次の例では、Oracle ソースの Actor という名前のテーブルの SetSpace という名前のテーブルのテーブルスペースを、Oracle のターゲットエンドポイントで SceneTblSpace に名前変更します。

{
    "rules": [
        {
            "rule-type": "selection",
            "rule-id": "1",
            "rule-name": "1",
            "object-locator": {
                "schema-name": "Play",
                "table-name": "%"
            },
            "rule-action": "include"
        },
        {
            "rule-type": "transformation",
            "rule-id": "2",
            "rule-name": "2",
            "rule-action": "rename",
            "rule-target": "table-tablespace",
            "object-locator": {
                "schema-name": "Play",
                "table-name": "Actor",
                "table-tablespace-name": "SetSpace"
            },
            "value": "SceneTblSpace"
        }
    ]
}

例 Oracle インデックスのテーブルスペースの名前変更

以下の例では、Oracle ソースの Actor という名前のテーブルの SetISpace という名前のインデックスのテーブルスペースを、Oracle のターゲットエンドポイントで SceneIdxSpace に名前変更します。

{
    "rules": [
        {
            "rule-type": "selection",
            "rule-id": "1",
            "rule-name": "1",
            "object-locator": {
                "schema-name": "Play",
                "table-name": "%"
            },
            "rule-action": "include"
        },
        {
            "rule-type": "transformation",
            "rule-id": "2",
            "rule-name": "2",
            "rule-action": "rename",
            "rule-target": "table-tablespace",
            "object-locator": {
                "schema-name": "Play",
                "table-name": "Actor",
                "table-tablespace-name": "SetISpace"
            },
            "value": "SceneIdxSpace"
        }
    ]
}

例 列の追加

次の例では、スキーマ test のテーブル Actor に datetime 列を追加します。

{
    "rules": [
        {
            "rule-type": "selection",
            "rule-id": "1",
            "rule-name": "1",
            "object-locator": {
                "schema-name": "test",
                "table-name": "%"
            },
            "rule-action": "include"
        },
        {
            "rule-type": "transformation",
            "rule-id": "2",
            "rule-name": "2",
            "rule-action": "add-column",
            "rule-target": "column",
            "object-locator": {
                "schema-name": "test",
                "table-name": "actor"
            },
            "value": "last_updated",
            "data-type": {
                "type": "datetime",
                "precision": 6
            }
        }
    ]
}

例 列の削除

以下の例では、ソース内の Actor という名前のテーブルを変換し、先頭文字が col のすべての列をターゲットから削除します。

{
 	"rules": [{
		"rule-type": "selection",
		"rule-id": "1",
		"rule-name": "1",
		"object-locator": {
			"schema-name": "test",
			"table-name": "%"
		},
		"rule-action": "include"
	}, {
		"rule-type": "transformation",
		"rule-id": "2",
		"rule-name": "2",
		"rule-action": "remove-column",
		"rule-target": "column",
		"object-locator": {
			"schema-name": "test",
			"table-name": "Actor",
			"column-name": "col%"
		}
	}]
 }

例 [Convert to lowercase] (小文字に変換)

以下の例では、テーブルの名前をソースでの ACTOR からターゲットでの actor に変換します。

{
	"rules": [{
		"rule-type": "selection",
		"rule-id": "1",
		"rule-name": "1",
		"object-locator": {
			"schema-name": "test",
			"table-name": "%"
		},
		"rule-action": "include"
	}, {
		"rule-type": "transformation",
		"rule-id": "2",
		"rule-name": "2",
		"rule-action": "convert-lowercase",
		"rule-target": "table",
		"object-locator": {
			"schema-name": "test",
			"table-name": "ACTOR"
		}
	}]
}

例 大文字への変換

次の例では、すべてのテーブルおよびすべてのスキーマ内のすべての列を、ソースでの小文字からターゲットでの大文字に変換します。

{
    "rules": [
        {
            "rule-type": "selection",
            "rule-id": "1",
            "rule-name": "1",
            "object-locator": {
                "schema-name": "test",
                "table-name": "%"
            },
            "rule-action": "include"
        },
        {
            "rule-type": "transformation",
            "rule-id": "2",
            "rule-name": "2",
            "rule-action": "convert-uppercase",
            "rule-target": "column",
            "object-locator": {
                "schema-name": "%",
                "table-name": "%",
                "column-name": "%"
            }
        }
    ]
}

例 プレフィックスの追加

以下の例では、ソース内のすべてのテーブルを変換し、ターゲットではそれらのテーブルにプレフィックス DMS_ を追加します。

{
 	"rules": [{
		"rule-type": "selection",
		"rule-id": "1",
		"rule-name": "1",
		"object-locator": {
			"schema-name": "test",
			"table-name": "%"
		},
		"rule-action": "include"
	}, {
		"rule-type": "transformation",
		"rule-id": "2",
		"rule-name": "2",
		"rule-action": "add-prefix",
		"rule-target": "table",
		"object-locator": {
			"schema-name": "test",
			"table-name": "%"
		},
		"value": "DMS_"
	}]
 
}

例 プレフィックスの置き換え

以下の例では、ソースでプレフィックス Pre_ を含むすべての列を変換し、ターゲットではプレフィックスを NewPre_ に置き換えます。

{
    "rules": [
        {
            "rule-type": "selection",
            "rule-id": "1",
            "rule-name": "1",
            "object-locator": {
                "schema-name": "test",
                "table-name": "%"
            },
            "rule-action": "include"
        },
        {
            "rule-type": "transformation",
            "rule-id": "2",
            "rule-name": "2",
            "rule-action": "replace-prefix",
            "rule-target": "column",
            "object-locator": {
                "schema-name": "%",
                "table-name": "%",
                "column-name": "%"
            },
            "value": "NewPre_",
            "old-value": "Pre_"
        }
    ]
}

例 サフィックスの削除

以下の例では、ソース内のすべてのテーブルを変換し、ターゲットではそれらのテーブルからサフィックス _DMS を削除します。

{
	"rules": [{
		"rule-type": "selection",
		"rule-id": "1",
		"rule-name": "1",
		"object-locator": {
			"schema-name": "test",
			"table-name": "%"
		},
		"rule-action": "include"
	}, {
		"rule-type": "transformation",
		"rule-id": "2",
		"rule-name": "2",
		"rule-action": "remove-suffix",
		"rule-target": "table",
		"object-locator": {
			"schema-name": "test",
			"table-name": "%"
		},
		"value": "_DMS"
	}]
}

例 プライマリキーの定義

次の例では、ターゲットエンドポイントに移行した ITEM テーブルの 3 つの列の ITEM-primary-key という名前のプライマリキーを定義します。

{
	"rules": [{
		"rule-type": "selection",
		"rule-id": "1",
		"rule-name": "1",
		"object-locator": {
			"schema-name": "inventory",
			"table-name": "%"
		},
		"rule-action": "include"
	}, {
		"rule-type": "transformation",
		"rule-id": "2",
		"rule-name": "2",
		"rule-action": "define-primary-key",
		"rule-target": "table",
		"object-locator": {
			"schema-name": "inventory",
			"table-name": "ITEM"
		},
		"primary-key-def": {
			"name": "ITEM-primary-key",
			"columns": [
				"ITEM-NAME",
				"BOM-MODEL-NUM",
				"BOM-PART-NUM"
			]
              }
	}]
}

例 一意のインデックスの定義

次の例では、ターゲットエンドポイントに移行した ITEM テーブルの 3 つの列の ITEM-unique-idx という名前の一意のインデックスを定義します。

{
	"rules": [{
		"rule-type": "selection",
		"rule-id": "1",
		"rule-name": "1",
		"object-locator": {
			"schema-name": "inventory",
			"table-name": "%"
		},
		"rule-action": "include"
	}, {
		"rule-type": "transformation",
		"rule-id": "2",
		"rule-name": "2",
		"rule-action": "define-primary-key",
		"rule-target": "table",
		"object-locator": {
			"schema-name": "inventory",
			"table-name": "ITEM"
		},
		"primary-key-def": {
			"name": "ITEM-unique-idx",
			"origin": "unique-index",
			"columns": [
				"ITEM-NAME",
				"BOM-MODEL-NUM",
				"BOM-PART-NUM"
			]
              }
	}]
}

例 ターゲット列のデータ型の変更

次の例では、SALE_AMOUNT という名前のターゲット列のデータ型を既存のデータ型から int8 に変更します。

{
    "rule-type": "transformation",
    "rule-id": "1",
    "rule-name": "RuleName 1",
    "rule-action": "change-data-type",
    "rule-target": "column",
    "object-locator": {
        "schema-name": "dbo",
        "table-name": "dms",
        "column-name": "SALE_AMOUNT"
    },
    "data-type": {
        "type": "int8"
    }
}

例 前イメージ列の追加

emp_no という名前のソース列の場合、次の例の変換ルールによって、ターゲットに BI_emp_no という名前の新しい列が追加されます。

{
	"rules": [{
			"rule-type": "selection",
			"rule-id": "1",
			"rule-name": "1",
			"object-locator": {
				"schema-name": "%",
				"table-name": "%"
			},
			"rule-action": "include"
		},
		{
			"rule-type": "transformation",
			"rule-id": "2",
			"rule-name": "2",
			"rule-target": "column",
			"object-locator": {
				"schema-name": "%",
				"table-name": "employees"
			},
			"rule-action": "add-before-image-columns",
			"before-image-def": {
				"column-prefix": "BI_",
				"column-suffix": "",
				"column-filter": "pk-only"
			}
		}
	]
}

変換ルール式を使用した列の内容の定義

変換ルールの式を使うと下記が可能になる。

  1. 新しい列を追加できる
  2. ソーステーブルのヘッダー情報(メタデータ)をターゲットにコピーできる
  3. レコードに操作フラグ(挿入/更新/削除)を付けられる

式を使用した列の追加

add-column + expression で列を追加:

  • object-locator(schema-name, table-name)と expression 内の列名 → ソースを参照
  • value(新列名)と data-type → ターゲットを参照

例: ITEM テーブルに FULL_NAME 列(string, 50文字)を追加し、FIRST_NAME と LAST_NAME を連結した値を格納

{
    "rules": [
        {
            "rule-type": "selection", 
            "rule-id": "1",
            "rule-name": "1",
            "object-locator": {
                "schema-name": "Test",
                "table-name": "%"
            },
            "rule-action": "include"
        },
        {
            "rule-type": "transformation",
            "rule-id": "2",
            "rule-name": "2",
            "rule-action": "add-column",
            "rule-target": "column",
            "object-locator": {
                "schema-name": "Test",
                "table-name": "ITEM"
            },
            "value": "FULL_NAME",
            "expression": "$FIRST_NAME||'_'||$LAST_NAME",
            "data-type": {
                 "type": "string",
                 "length": 50
            }
        }
    ]
}

式を使用したターゲットレコードのフラグ付け

operation_indicator 関数で CDC 操作をフラグ付け

動作は下記の通り

  • ターゲットに操作フラグ列を追加
  • 挿入='I', 更新='U', 削除='D' を記録
  • ソースで削除されたレコードもターゲットには残り、'D' フラグが付く

制約:
ソースとターゲット両方にプライマリキーが必要

例:
json
"expression": "operation_indicator('D', 'U', 'I')"

→ 削除時='D', 更新時='U', 挿入時='I' を Operation 列に設定

{
      "rule-type": "transformation",
      "rule-id": "2",
      "rule-name": "2",
      "rule-target": "column",
      "object-locator": {
        "schema-name": "%",
        "table-name": "%"
      },
      "rule-action": "add-column",
      "value": "Operation",
      "expression": "operation_indicator('D', 'U', 'I')",
      "data-type": {
        "type": "string",
        "length": 50
      }
}

式を使用したソーステーブルヘッダーのレプリケート

ソーステーブルのヘッダー(メタデータ)をターゲットに列として追加できる。

ヘッダー CDC時 全ロード時
AR_H_STREAM_POSITION ソースからのストリーム位置の値
SCN/LSN
空文字列 STRING
AR_H_TIMESTAMP 変更時刻 ターゲット到着時刻 DATETIME
AR_H_COMMIT_TIMESTAMP コミット時刻 現在時刻 DATETIME
AR_H_OPERATION INSERT/UPDATE/DELETE INSERT STRING
AR_H_USER 変更ユーザー※ 空文字列 STRING
AR_H_CHANGE_SEQ 一意の増分番号(35桁)
タイムスタンプと自動インクリメント番号で構成される
空文字列 STRING

※ AR_H_USER は SQL Server と Oracle 11.2.0.3+ のみ対応

用途は、CDC の追跡情報をターゲットに保存(監査ログ、データリネージュなど)

次の例では、ソースからのストリーム位置の値を使用して、ターゲットに新しい列を追加します。SQL サーバー の場合、ストリーム位置の値は、ソース エンドポイントの SCN です。Oracle の場合、ストリーム位置の値はソースエンドポイントの LSN です。

{
      "rule-type": "transformation",
     "rule-id": "2",
      "rule-name": "2",
      "rule-target": "column",
      "object-locator": {
        "schema-name": "%",
        "table-name": "%"
      },
      "rule-action": "add-column",
      "value": "transact_id",
      "expression": "$AR_H_STREAM_POSITION",
      "data-type": {
        "type": "string",
        "length": 50
      }
    }

次の使用例は、ソースから一意の増分番号を持つ新しい列をターゲットに追加します。この値は、タスクレベルでの 35 桁の一意の数字を表します。最初の 16 桁はタイムスタンプの一部であり、最後の 19 桁は DBMS によって増分された record_id 番号です。

{
"rule-type": "transformation",
"rule-id": "2",
"rule-name": "2",
"rule-target": "column",
"object-locator": {
"schema-name": "%",
"table-name": "%"
},
"rule-action": "add-column",
"value": "transact_id",
"expression": "$AR_H_CHANGE_SEQ",
"data-type": {
"type": "string",
"length": 50
}
}

SQLite 関数を使用して式を構築する

特定のテーブル/ビューに対する個別のロード設定を指定(オプション)
MongoDB/DocumentDB の場合は、下記の通り

  • テーブル/ビューの概念がなく、コレクション単位
  • 並列ロード設定では範囲セグメンテーションタイプを使用

文字列関数

  • lower(x), upper(x)
    • 小文字/大文字変換(ASCII のみ)
  • ltrim(x,y), rtrim(x,y), trim(x,y)
    • 左/右/両端トリム(y 省略時はスペース削除)
  • replace(x,y,z)
    • x 内の y を z に置換
  • substr(x,y,z)
    • y 番目から z 文字分の部分文字列(インデックスは 1 始まり、負数は右から)

LOB 関数

  • hex(x)
    • BLOB を 16 進文字列に変換
  • randomblob(N)
    • N バイトのランダム BLOB
  • zeroblob(N)
    • 0x00 の N バイト BLOB

数値関数

  • abs(x)
    • 絶対値
  • random()
    • -9,223,372,036,854,775,808 ~ +9,223,372,036,854,775,807 の乱数
  • round(x,y)
    • x を小数点以下 y 桁で四捨五入
  • max(x,y,...), min(x,y,...)
    • 最大値/最小値

NULL チェック関数

  • coalesce(x,y,...)
    • 最初の非 NULL 値を返す
  • ifnull(x,y)
    • x が NULL なら y を返す
  • nullif(x,y)
    • x と y が同じなら NULL、異なれば x を返す

日付・時刻関数

  • date(timestring, modifier,...)
    • YYYY-MM-DD
  • time(timestring, modifier,...)
    • HH:MM:SS
  • datetime(timestring, modifier,...)
    • YYYY-MM-DD HH:MM:SS
  • julianday(timestring, modifier,...)
    • グリニッジで紀元前4714年11月24日の正午からの日数
  • strftime(format,timestring, modifier,...)
    • カスタム書式(%d, %H, %m, %M, %s, %S, %Y など)

ハッシュ関数

  • hash_sha256(x)
    • SHA-256 ハッシュの 16 進値

CASE 式の使用

SQLite CASE 式は、条件のリストを評価し、結果に基づいて式を返します。構文を以下に示します。

    CASE case_expression
     WHEN when_expression_1 THEN result_1
     WHEN when_expression_2 THEN result_2
     ...
     [ ELSE result_else ] 
    END

# Or 

     CASE
     WHEN case_expression THEN result_1
     WHEN case_expression THEN result_2
     ...
     [ ELSE result_else ] 
    END

例 ケース条件を使用してターゲット テーブルに新しい文字列列を追加する

CASE 式を使った列追加の例。
employee テーブルに emp_seniority 列を追加し、給与に基づいて値を設定

  {
      "rule-type": "transformation",
      "rule-id": "2",
      "rule-name": "2",
      "rule-action": "add-column",
      "rule-target": "column",
      "object-locator": {
        "schema-name": "public",
        "table-name": "employee"
      },
      "value": "emp_seniority",
      "expression": " CASE WHEN round($emp_salary)>=20000 THEN ‘SENIOR’ ELSE ‘JUNIOR’ END",
      "data-type": {
        "type": "string",
        "length": 50
      }

  }

式を使用したターゲット テーブルへのメタデータ追加

次の式を使用して、メタデータ情報をターゲット テーブルに追加できます

  • $AR_M_SOURCE_SCHEMA – ソーススキーマの名前
  • $AR_M_SOURCE_TABLE_NAME – ソーステーブルの名前
  • $AR_M_SOURCE_COLUMN_NAME – ソーステーブルの列の名前
  • $AR_M_SOURCE_COLUMN_DATATYPE – ソーステーブルの列のデータ型
  {
      "rule-type": "transformation",
      "rule-id": "2",
      "rule-name": "2",
      "rule-action": "add-column",
      "rule-target": "column",
      "object-locator": {
        "schema-name": "%",
        "table-name": "%"
      },
      "rule-action": "add-column",
      "value":"schema_name",
      "expression": "$AR_M_SOURCE_SCHEMA", 
      "data-type": { 
         "type": "string",
         "length": 50
      }
  }

テーブルとコレクション設定のルールとオペレーション

テーブル設定ルールは下記の通り

特定のテーブル/ビューに対する個別設定を指定できる(オプション)

MongoDB/DocumentDB の場合

  • テーブル/ビューではなくコレクション単位
  • データベース = コレクションのセット
  • 並列ロード設定では以下を使用:
    • 自動セグメンテーション
    • 範囲セグメンテーション

基本パラメータ

  • rule-type
    • table-settings
  • rule-id, rule-name
    • 一意の識別子
  • object-locator
    • 特定のスキーマ/テーブル/ビュー/コレクション(ワイルドカード不可)

parallel-load(並列ロード設定)
type:

  • partitions-auto
    • 全パーティションを自動並列ロード(MongoDB/DocumentDB の自動セグメンテーション用)
  • subpartitions-auto
    • 全サブパーティションを並列ロード(Oracle のみ)
  • partitions-list
    • 指定パーティション/サブパーティションを並列ロード
  • ranges
    • 範囲ベースのセグメントを並列ロード(PostgreSQL、MongoDB/DocumentDB 対応)
  • none
    • シングルスレッド(デフォルト)

MongoDB/DocumentDB 用パラメータ(partitions-auto 時)

  • number-of-partitions
    • パーティション数(デフォルト: 16)
  • collection-count-from-metadata
    • 推定値使用(true)か実際の値使用(false)
  • max-records-skip-per-page
    • パーティション境界決定時のスキップレコード数(デフォルト: 10,000)
  • batch-size
    • 1 バッチあたりのドキュメント数(デフォルト: 0=サーバー定義値)

partitions-list 用

  • partitions
    • パーティション名の配列
  • subpartitions
    • サブパーティション名の配列(Oracle のみ)

ranges 用

  • columns
    • セグメント識別用の列名配列
  • boundaries
    • 各セグメントの上限境界値の配列

lob-settings(LOB 処理設定)
mode

  • limited
    • 制限付き LOB モード(100MB 以下推奨、超過分は切り捨て)
  • unlimited
    • 完全 LOB モード(1GB 超推奨、切り捨てなし)
    • bulk-max-size=0
      • 標準完全 LOB モード
    • bulk-max-size>0
      • 組み合わせ完全 LOB モード
  • none
    • タスクの LOB 設定に従う

bulk-max-size

  • LOB の最大サイズ(KB 単位)

テーブル設定内のワイルドカードの制限

次のとおり、"table-settings" ルールでのパーセントのワイルドカード ("%") の使用は、ソースデータベースではサポートされていません。

{
    "rule-type": "table-settings",
    "rule-id": "8",
    "rule-name": "8",
    "object-locator": {
        "schema-name": "ipipeline-prod",            
        "table-name": "%"
    },
    "parallel-load": {
        "type": "partitions-auto",
        "number-of-partitions": 16,
        "collection-count-from-metadata": "true",
        "max-records-skip-per-page": 1000000,
        "batch-size": 50000
    }
  }

選択したテーブルおよびビューさらにコレクションで並列ロードを使用する

複数スレッドでテーブル/ビュー/コレクションを並列ロードして移行を高速化が可能。
対応ソースは下記の通り。

  • Oracle
  • SQL Server
  • MySQL
  • PostgreSQL
  • Db2 LUW
  • ASE(SAP Adaptive Server Enterprise)
  • MongoDB※
  • DocumentDB※

※自動/範囲セグメンテーションのみ

選択したテーブルまたはビューの LOB 設定を指定

選択したテーブル/ビューへの LOB 設定:

対応ソース: Oracle, SQL Server, MySQL, PostgreSQL, Db2※, ASE※
対応ターゲット: Oracle, SQL Server, MySQL, PostgreSQL, ASE※
※mode と bulk-max-size に依存
制約: プライマリキーがあるテーブル/ビューのみ

mode パラメータ:

  1. limited(デフォルト、最速)
  • 全ロード: LOB をインラインで移行、bulk-max-size 超過分は切り捨て
  • CDC: ソーステーブル参照で移行(標準完全 LOB モード同様)
  • 用途: 全 LOB が小さい、またはターゲットが無制限 LOB 非対応
  • bulk-max-size: ゼロ以外必須
  1. unlimited(完全 LOB モード、切り捨てなし)

標準完全 LOB モード(bulk-max-size=0):

  • 全 LOB をソーステーブル/ビュー参照で移行
  • 最も低速
  • 用途: ほとんどの LOB が大きい(1GB 以上)

組み合わせ完全 LOB モード(bulk-max-size>0):

  • 全ロード: bulk-max-size 以下はインライン、超過分はソース参照
  • CDC: 全 LOB をソース参照(サイズ問わず)
  • 速度: limited と標準完全の中間
  • 用途: 小さい LOB と大きい LOB が混在、ほとんどが小さい
  • 対応: Db2(ソース)、ASE(ソース/ターゲット)のみ
  1. none
    タスクの LOB 設定に従う(比較用)

bulk-max-size:

  • KB 単位で指定
  • LOB はバイナリ変換されるため、実際のサイズの 3 倍を指定
  • 例: 最大 LOB が 2MB → bulk-max-size=6000(6MB)

BatchApplyEnabled との関係:

  • LOB を含むテーブル/ビューで BatchApplyEnabled=true にできるのは limited モードのみ
  • Oracle 間の移行で LOB がある場合、BatchApplyPreserveTransaction は自動的に true に設定される

データマスキングを使用して機密情報を非表示にする

移行中に機密データを隠すための 3 つのアクションは下記の通り。

  1. data-masking-digits-mask
    • 数字をマスク
  2. data-masking-digits-randomize
    • 数字をランダム化
  3. data-masking-hash-mask
    • ハッシュでマスク

設定は下記の通り

  • テーブルマッピングの変換ルールで指定
  • rule-target: column(列レベル必須)
  • 変更されたデータがターゲットにロードされる

マスキング文字を使用して列データの数値をマスキングする

「データマスキング: 数字マスク」変換ルールアクションでは、数字を指定した 1 つの ASCII 印刷可能な文字 (空の文字または空白文字を除く) に置き換えることで、1 つ以上の列の数値データをマスクできます。

customer_master テーブルのcust_passport_no列内のすべての桁をマスキング文字でマスク'#'し、マスクされたデータをターゲットテーブルにロードする例を次に示します。

「データマスキング: 数字マスク」変換ルールアクションでは、数字を指定した 1 つの ASCII 印刷可能な文字 (空の文字または空白文字を除く) に置き換えることで、1 つ以上の列の数値データをマスクできます。

customer_master テーブルのcust_passport_no列内のすべての桁をマスキング文字でマスク'#'し、マスクされたデータをターゲットテーブルにロードする例を次に示します。

列の数値を乱数に置き換える

変換ルール「Data Masking: Digits Randomize」では、1 つ以上の列の各数値を乱数に置き換えることができます。次の例では、 AWS DMS はソーステーブルのcust_passport_no列のすべての桁を乱数customer_masterに置き換え、変更されたデータをターゲットテーブルに書き込みます。


            {
    "rules": [
        {
            "rule-type": "selection",
            "rule-id": "1",
            "rule-name": "1",
            "object-locator": {
                "schema-name": "cust_schema",
                "table-name": "%"
            },
            "rule-action": "include"
        },
        {
            "rule-type": "transformation",
            "rule-id": "2",
            "rule-name": "2",
            "rule-target": "column",
            "object-locator": {
                "schema-name": "cust_schema",
                "table-name": "customer_master",
                "column-name": "cust_passport_no"
            },
            "rule-action": "data-masking-digits-randomize"
        }
    ]
}

列データをハッシュ値に置き換える

変換ルール「データマスキング: ハッシュマスク」では、列データをSHA256アルゴリズムを使用して生成されたハッシュに置き換えることができます。ハッシュの長さは常に 64 文字であるため、ターゲットテーブルの列の長さは少なくとも 64 文字である必要があります。または、change-data-type変換ルールアクションを列に追加して、ターゲットテーブルの列の幅を増やすこともできます。

次の例では、ソーステーブルの cust_passport_no列のデータに 64 文字の長いハッシュ値を生成customer_masterし、列の長さを増やした後、変換されたデータをターゲットテーブルにロードします。


{
"rules": [
{
"rule-type": "selection",
"rule-id": "1",
"rule-name": "1",
"object-locator": {
"schema-name": "cust_schema",
"table-name": "%"
},
"rule-action": "include"
},
{
"rule-type": "transformation",
"rule-id": "2",
"rule-name": "2",
"rule-target": "column",
"object-locator": {
"schema-name": "cust_schema",
"table-name": "customer_master",
"column-name": "cust_passport_no"
},
"rule-action": "change-data-type",
"data-type": {
"type": "string",
"length": "100",
"scale": ""
}
},
{
"rule-type": "transformation",
"rule-id": "3",
"rule-name": "3",
"rule-target": "column",
"object-locator": {
"schema-name": "cust_schema",
"table-name": "customer_master",
"column-name": "cust_passport_no"
},
"rule-action": "data-masking-hash-mask"
}
]
}

考察

大まかな基本機能は理解できました。次回は、実際に触れて動作を確認します。

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?