AWS Database Migration Serviceでテーブル名やカラム名を変えて移行する方法を試しました

2017.11.20

DMSでデータを移行する際にソースとターゲットでテーブル名やカラム名を変える方法を調べて試してみました。 今回はMySQLからRedshiftへの移行で名前は以下のように変更するとします。

MySQL Redshift
スキーマ名 mydb test
テーブル名 table_1 table_A
カラム名 column_1 column_A
column_2 column_B
column_3 column_C

ソースとなるMySQLには以下のテーブルを作成しました。サンプルのデータもあります。

create table mydb.table_1(
	column_1 int,
	column_2 varchar(255),
	column_3 timestamp
);

insert into mydb.table_1 values(1, 'abc', '2017-01-02 01:23:45');
insert into mydb.table_1 values(2, 'def', '2017-03-04 01:23:45');
insert into mydb.table_1 values(3, 'ghi', '2017-05-06 01:23:45');

タスクの設定画面の下の方にあるテーブルマッピングという項目があります。まず最初にどのテーブルを対象とするかの選択ルールを設定すると変換ルールを設定できるようになります。テキストボックスやプルダウンでルールを設定することもできるのですが、今回はガイドを使わずJSONタブを開いてルールを設定します。

上の表の条件をJSONにしたものです。最初のルール(3行目~12行目)は移行する対象に関するルールですが、14行目からはスキーマのリネーム、テーブルのリネーム、カラムのリネームに関するルールです。

{
    "rules": [
        {
            "rule-type": "selection",
            "rule-id": "1",
            "rule-name": "1",
            "object-locator": {
                "schema-name": "mydb",
                "table-name": "%"
            },
            "rule-action": "include"
        },
        {
            "rule-type": "transformation",
            "rule-id": "2",
            "rule-name": "2",
            "rule-action": "rename",
            "rule-target": "schema",
            "object-locator": {
                "schema-name": "mydb"
            },
            "value": "test"
        },
        {
            "rule-type": "transformation",
            "rule-id": "3",
            "rule-name": "3",
            "rule-action": "rename",
            "rule-target": "table",
            "object-locator": {
                "schema-name": "mydb",
                "table-name": "table_1"
            },
            "value": "table_A"
        },
        {
            "rule-type": "transformation",
            "rule-id": "4",
            "rule-name": "4",
            "rule-action": "rename",
            "rule-target": "column",
            "object-locator": {
                "schema-name": "mydb",
                "table-name": "table_1",
                "column-name" : "column_1"
            },
            "value": "column_A"
        },
        {
            "rule-type": "transformation",
            "rule-id": "5",
            "rule-name": "5",
            "rule-action": "rename",
            "rule-target": "column",
            "object-locator": {
                "schema-name": "mydb",
                "table-name": "table_1",
                "column-name" : "column_2"
            },
            "value": "column_B"
        },
        {
            "rule-type": "transformation",
            "rule-id": "6",
            "rule-name": "6",
            "rule-action": "rename",
            "rule-target": "column",
            "object-locator": {
                "schema-name": "mydb",
                "table-name": "table_1",
                "column-name" : "column_3"
            },
            "value": "column_C"
        }
    ]
}

保存してタスクを開始するとRedshift側にテーブルが作成されデータが入っていると思います。 もう一度タスクの設定画面を開くと以下のようにガイドに選択ルールと変換ルールが表示されているのが確認できます。

JSONの項目の意味を詳しく知りたい方は以下のドキュメントをご覧ください。

データの選択とフィルタにテーブルマッピングをタスクで使用する