Amazon Web Services ブログ

AWS Database Migration Service を使用して PostgreSQL 10 のネイティブパーティション表に移行する

AWS Database Migration Service (AWS DMS) バージョン 2.4.3 についてご紹介します。これには、PostgreSQL 10 のネイティブパーティション表へデータを移行するサポートが含まれています。

この記事では、AWS DMS バージョン 2.4.3 を使用して Oracle パーティション表から PostgreSQL 10 のネイティブパーティション表へデータを移行する方法について説明します。これは特殊な設定をせずに行えます。AWS DMS と並行してパーティション表のスキーマ変換を実行するには、この変換をサポートするようになった AWS Schema Conversion Tool (AWS SCT) を使用できます。

PostgreSQL のパーティショニング

パーティショニングは、論理的に 1 つの大きな表をより小さな物理的なピースに分割することを指します。パーティショニングにはいくつかの利点があります。

AWS DMS を使用してこの記事の説明に従ってパーティション表に移行する前に、PostgreSQL のパーティション表に精通している必要があります。PostgreSQL はバージョン 10 でネイティブパーティショニングサポートを導入しました。

以下は、Oracle パーティション表から PostgreSQL 10 ネイティブパーティション表にデータを移行する例です。ソースの Oracle パーティション表は、作成日の列に 3 つのパーティションが作成されます。すべてのパーティションは、それぞれの日付範囲の値に基づいてデータを保持します。

ステップ 1: レンジパーティション基準を使用して Oracle パーティション表を作成する

次のコードの例は、レンジパーティション基準 (ステップ 1) を使用して Oracle パーティション表を作成する方法を示しています。

CREATE TABLE partition_schema.partition_test 
	(id NUMBER(10) NOT NULL,
	data_value VARCHAR2(50),
	create_dt DATE DEFAULT sysdate
	)
PARTITION BY RANGE(create_dt) (
  partition p1 values less than ('01-JAN-2016'),
  partition p2 values less than ('01-JAN-2017'),
  partition p3 values less than ('01-JAN-2018')
);

ステップ 2: AWS SCT を使用してまたは手動で PostgreSQL パーティション表を作成する

次のコードの例は、ステップ 2 の PostgreSQL パーティション表の作成方法を示しています。

CREATE TABLE IF NOT EXISTS partition_schema.partition_test(
id NUMERIC(38,0) NOT NULL,
data_value CHARACTER VARYING(25) NOT NULL,
create_date TIMESTAMP(6) WITHOUT TIME ZONE NOT NULL,
) PARTITION BY RANGE (create_date)
WITH (
OIDS=FALSE
);

以下の手順については、PostgreSQL ドキュメントの 「PostgreSQL 表のパーティショニング」のトピックをご覧ください。

ステップ 3: パーティションを作成する

次のステップでは、パーティションを作成します。各パーティションの定義では、親テーブルのパーティショニングメソッドとパーティションキーに対応する境界を指定する必要があります。次のコードの例は、この手順を示しています。

CREATE TABLE partition_schema.PERIOD_2016 PARTITION OF partition_schema.partition_test
FOR VALUES FROM ('2015-01-01 00:00:00') TO ('2016-01-01 00:00:00');
 
CREATE TABLE partition_schema.PERIOD_2017 PARTITION OF partition_schema.partition_test
FOR VALUES FROM ('2016-01-01 00:00:00') TO ('2017-01-01 00:00:00');
 
CREATE TABLE partition_schema.PERIOD_2018 PARTITION OF partition_schema.partition_test
FOR VALUES FROM ('2017-01-01 00:00:00') TO ('2018-01-01 00:00:00');

ステップ 4: キー列にインデックスを作成する

ステップ 4 では、キー列にインデックスを作成します。同時に、各パーティションに必要な他のインデックスを作成します。次のコードの例は、この手順を示しています。

CREATE index on partition_schema.PERIOD_2016 (id);
CREATE index on partition_schema.PERIOD_2017 (id);
CREATE index on partition_schema.PERIOD_2018 (id);

ステップ 5: Oracle パーティション表にいくつかのレコードを挿入する

次に、以下のコードの例で示すように、レコードを Oracle のパーティション表に挿入します。

INSERT into partition_schema.partition_test VALUES (1,'data_1','2016-04-05');
INSERT into partition_schema.partition_test VALUES (1,'data_2','2017-04-05');
INSERT into partition_schema.partition_test VALUES (1,'data_3','2018-04-05');
COMMIT;

ステップ 6: Oracle パーティション表から PostgreSQL パーティション表に移行する AWS DMS タスクを作成する

ステップ 6 では、Oracle パーティション表から PostgreSQL パーティション表に移行する AWS DMS タスクを作成します。これを行うには、DMS バージョン 2.4.3 で次の表のマッピングを使用します。

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

ステップ 7: タスクの完了後に表が正常に移行されたかどうかを確認する

次に、AWS DMS タスクの完了後に表が正常に移行されたかどうかを確認します。DMS タスクは失敗せずに完了し、データは PostgreSQL 10のパーティション表に正常に移行されているはずです。

DMS がターゲット表の適切なパーティションにレコードを移行したことを確認するには、以下のクエリを実行します。

SELECT * FROM 'partition_schema','partition_test';

SELECT * FROM partition_schema.PERIOD_2016;
SELECT * FROM partition_schema.PERIOD_2017;
SELECT * FROM partition_schema.PERIOD_2018;

この移行を適切に処理するために、AWS DMS バージョン 2.4.3 では PostgreSQL ドライバーの新しいバージョン psqlodbc-10.03.0000 がサポートされています。

前述の移行では、DMS が PostgreSQL 10 のパーティション表の詳細を取得し、データを適切にロードしました。

概要

この記事で説明したように、AWS DMS バージョン 2.4.3 では、PostgreSQL 10 ネイティブパーティション表への移行がサポートされるようになりました。詳細については、AWS DMS ユーザーガイドをご覧ください。


著者について

Mahesh Kansara は アマゾン ウェブ サービスのデータベースエンジニアです。 彼は AWS のお客様と協力して様々なデータベースおよび分析プロジェクト関連の指導や技術支援を行っており、AWS を使用する際にお客様がソリューションの価値を向上させられるようにサポートしています。