Amazon Web Services ブログ

AWS DMS バージョン 3.1.3 を使用したデータ変換

AWS は最新の AWS Database Migration Service (AWS DMS) バージョン 3.1.3 の新しいデータ変換機能をサポートするようになりました。スキーマ、テーブル、および列の名前を変更し、Oracle ターゲットの個々の表領域名を指定し、そして任意のターゲット上のテーブルの主キーと一意キーを更新することができます。DMS バージョン 3.1.3 は、以下の新しいデータ変換機能をサポートしています。

  • 明示的なテーブルマッピング
  • Oracle のソースおよびターゲットの表領域の変換規則
  • Oracle のソースおよびターゲットの索引表領域の変換規則
  • 主キーまたは一意キーのインデックスの定義
  • 対象列のデータ型の変更

明示的なテーブルマッピング

以前の DMS バージョンでは、AWS マネジメントコンソールを使用してテーブルマッピングを実行したり、テーブル選択を指定したり、スキーマやテーブルのルールアクションを変換したりしていました。

バージョン 3.1.3 では、AWS DMS により明示的なテーブルの選択を行えます。明示的なテーブルマッピングルールを使用すると、サポートされている DMS ターゲットへの移行用に特定のソーステーブルを選択できます。また、より良い粒度のためにソースからテーブルのサブセットを除外します。明示的な選択規則を使用するときは、テーブルマッピングのスキーマ名とテーブル名にワイルドカード (%) を使用することはできません。

次の例では、ソースに 7 つのテーブルがあります。明示的な変換規則を使用すると、残りのテーブルを移行から除外する一方、DEPT テーブルのみを移行することを選択できます。

SQL> SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_CATALOG LIKE %DEPT%'

TABLE_NAME
------------------------------
HRDEPT
DEVDEPT
SUPPORTDEPT
PMDEPT
SECURITYDEPT
ITDEPT
DEPT

DMS コンソールの対応する変換規則は、次のようになります。

{  
   "rules":[  
      {  
         "rule-type":"selection",
         "rule-id":"1",
         "rule-name":"1",
         "object-locator":{  
            "schema-name":"MYSCHEMA",
            "table-name":%"DEPT%"
         },
         "rule-action":"exclude"
      },
      {  
         "rule-type":"selection",
         "rule-id":"1",
         "rule-name":"1",
         "object-locator":{  
            "schema-name":"MYSCHEMA",
            "table-name":"DEPT"
         },
         "rule-action":"explicit"
      }
   ]
}

次のクエリを使用して、ターゲットデータベーススキーマのテーブル「DEPT」をクエリできます。

SQL> SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_CATALOG LIKE %DEPT%'

TABLE_NAME
------------------------------
DEPT

Oracle ソースおよびターゲットの表領域の変換規則

表領域の変換規則を使用すると、テーブルを Oracle ターゲット上の特定の表領域に移行できます。次のコード例を使用すると、テーブル MYTABLENAME を別の表領域に配置することができます。

{
"rule-type": "transformation",
"rule-id": "2",
"rule-name": "2",
"rule-action": "rename",
"rule-target": "table-tablespace",
"schema-name": "MYSCHEMA",
"table-name": "MYTABLENAME",
"table-tablespace-name": "%"
},
"value": "TARGETTABLESPACE"
}

Oracle のソースおよびターゲットの索引表領域の変換規則

索引表領域の変換規則を使用すると、Oracle ターゲット上で選択した表領域に表索引を移行できます。次のコード例を使用すると、テーブル MYTABLENAME のインデックスを別の表領域に配置できます。

{
"rule-type": "transformation",
"rule-id": "3",
"rule-name": "3",
"rule-action": "rename",
"rule-target": "index-tablespace",
"schema-name": "MYSCHEMANAME",
"table-name": "MYTABLENAME",
"index-tablespace-name": "%"
},
"value": " TARGETTABLESPACE "
}

主キーまたは一意のインデックスの定義

テーブル列の主キーの管理と作成は、いつも難題を突きつけます。新しい DMS 機能により、ターゲットの主キーを更新できます。

次の例は、必要な列にテーブルの主キーを作成する方法を示しています。変換規則で定義されている列の順序は、ターゲットに作成された主キーの列の順序を示します。オリジンフィールドを指定して、主キーまたは一意のインデックスとしてターゲット上にキーを作成できます。DMS はデフォルトでそれを主キーとして作成します。

SQL> Create table MyTable 
(
    ID int Primary KEY NOT NULL,
    SNO INT,
    NAME VARCHAR(20),
    SALE_AMOUNT int,
    SALE_DATE DATE,
    REGION VARCHAR(10)
)

この例では、ID はソース上の唯一の主キー列です。このサンプルテーブルマッピングルールを使用して、SNO を主キーとして移行することもできます。

{
	"rules": [
		{
			"rule-type": "selection",
			"rule-id": "1",
			"rule-name": "1",
			"object-locator": {
				"schema-name": "dbo",
				"table-name": " MyTable"
			},
			"rule-action": "include"
		},
		{
			"rule-type": "transformation",
			"rule-id": "2",
			"rule-name": "2",
			"object-locator": {
				"schema-name": "dbo",
				"table-name": " MyTable"
			},
			"rule-action": "define-primary-key",
			"rule-target": "table",
			"primary-key-def": {
				"name": "newPk",
				"origin": "primary-key",
				"columns": [
					"ID",
					"sno"
				]
			}
		}
	]
}

ターゲット側で、このコード例は主キーとして ID と SNO の両方を持つテーブル DMS を作成します。主キー制約の構文は次のようになります。

ALTER TABLE [dbo].AWS Database Migration Service ADD  CONSTRAINT [ID_1553262410892936_PK] PRIMARY KEY CLUSTERED 
(
	[ID] ASC,
	[SNO] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO

対象列のデータ型の変更

移行中に change-data-type 変換を使用して、列の型をその場で変換できます。DMS は現在、以下のデータ型のデータ型変換をサポートしています。

BYTES("bytes"), DATE("date"), TIME("time"), DATETIME("datetime"), INT1 ("int1"), INT2 ("int2"), INT4 ("int4"), INT8 ("int8"), NUMERIC ("numeric"), REAL4 ("real4"), REAL8 ("real8"), STRING("string"), UINT1("uint1"), UINT2 ("unit2"), UINT4 ("uint4"), UINT8 ("uint8"), WSTRING("wstring"), BLOB ("blob"), NCLOB ("nclob"), CLOB ("clob"), BOOLEAN ("boolean"), SET ("set"), LIST ("list"), MAP ("map"), TUPLE ("tuple");

次の例では、SQL Server をソースとターゲットとして使用して、ターゲットの変換規則を使用して列のデータ型を変更する方法を示します。

ステップ 1: ソーステーブルを作成する

次のコード例を使用して、ソースにテーブルを作成します。

CREATE TABLE [dbo].AWS Database Migration Service
(
	[ID] [int] NOT NULL,
	[SNO] [int] NOT NULL,
	[NAME] [varchar](20) NULL,
	[SALE_AMOUNT] [int] NULL,
	[SALE_DATE] [date] NULL,
	[REGION] [varchar](10) NULL
)

ステップ 2: タスクを作成する

次のタスクマッピング JSON を使用して、次のソースエンドポイントとターゲットエンドポイントを使ってタスクを作成します。

{
"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"
}
}

ステップ 3: テーブルを変更します。

変換規則によって、テーブルが次のように変更されるはずです。

CREATE TABLE [dbo].AWS Database Migration Service
(
	[ID] [int] NOT NULL,
	[SNO] [int] NOT NULL,
	[NAME] [varchar](20) NULL,
	[SALE_AMOUNT] [bigint] NULL,
	[SALE_DATE] [date] NULL,
	[REGION] [varchar](10)
)

結論

AWS DMS レプリケーションエンジンバージョン 3.1.3 では、この記事で紹介した機能が利用できます。明示的なマッピング規則 (すべてのエンジン)、Oracle のソースとターゲットに異なる変換規則を使用でき、さらにすべてのエンジンのターゲット列に主キーインデックスと一意キーインデックスを定義できます。

ご質問またはご提案いついては、以下でコメントを残してください。移行がうまくいきますように!

 

 


著者について

 

Harish Bannai は AWS のクラウドサポートエンジニアです。 彼は当社の顧客と協力してデータベースプロジェクト上の指導や技術支援を行い、AWS を使用する際にソリューションの価値を向上させる手助けをしています。