PostgreSQL データベースの AWS Database Migration Serviceのターゲットとしての使用 - AWS Database Migration Service

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

PostgreSQL データベースの AWS Database Migration Serviceのターゲットとしての使用

別の PostgreSQL データベースまたはサポートされている他のデータベースのいずれかから AWS DMS、 を使用して PostgreSQL データベースにデータを移行できます。

がターゲットとして AWS DMS サポートする PostgreSQL のバージョンについては、「」を参照してくださいのターゲット AWS DMS

注記
  • Amazon Aurora Serverless は、PostgreSQL との互換性を持つ Amazon Aurora のターゲットとして利用できます。Amazon Aurora Serverless の詳細については、「Amazon Aurora ユーザーガイド」の「Amazon Aurora Serverless v2 の使用」を参照してください。

  • Aurora Serverless DB クラスターは Amazon VPC からのみアクセスでき、[public IP address] (パブリック IP アドレス) を使用することはできません。そのため、レプリケーション インスタンスを Aurora PostgreSQL Serverless とは異なるリージョンに配置する場合は、[vpc peering] (VPC ピアリング接続) を構成します。それ以外の場合は、Aurora PostgreSQL Serverless [regions] (リージョン) の可用性をチェックし、これらのリージョンのいずれかを Aurora PostgreSQL Serverless とレプリケーション インスタンスの両方に使用しました。

  • Babelfish の機能は Amazon Aurora に組み込まれており、追加のコストは発生しません。詳細については、「Using Babelfish for Aurora PostgreSQL as a target for AWS Database Migration Service」を参照してください。

AWS DMS は、フルロードフェーズでソースからターゲットにデータを移行するときに table-by-table アプローチを取ります。全ロードフェーズ中のテーブルの順序は保証されません。テーブル全ロードフェーズ中、および個々のテーブルのキャッシュしたトランザクションが適用されている間は、テーブルは同期されません。その結果、アクティブな参照整合性制約により、全ロードフェーズ中にタスクが失敗する可能性があります。

PostgreSQL では、外部キー (参照整合性制約) はトリガーを使用して実装されます。全ロードフェーズでは、 は各テーブルを一度に 1 つずつ AWS DMS ロードします。次のいずれかの方法を使用して、全ロード中に外部キーの制約を無効にすることを強くお勧めします。

  • インスタンスからすべてのトリガーを一時的に無効にして、全ロードを終了します。

  • PostgreSQL では、session_replication_role パラメータを使用します。

特定の時間において、トリガーは originreplicaalways、または disabled のいずれかの状態になります。session_replication_role パラメータが replica に設定されている場合、replica 状態のトリガーのみがアクティブになり、呼び出されると実行されます。それ以外の場合、トリガーは非アクティブなままです。

PostgreSQL には、session_replication_role が設定されている場合でも、テーブルの切り捨てを防止するフェールセーフメカニズムが備わっています。これを、トリガーを無効にする代わりに使用して、全ロードの完了を支援できます。これを行うには、ターゲットテーブルの準備モードを DO_NOTHING に設定します それ以外の場合、外部キーの制約があると DROP および TRUNCATE オペレーションは失敗します。

Amazon RDS では、パラメータグループを使用してこのパラメータの設定を管理できます。Amazon EC2 で実行されている PostgreSQL インスタンスの場合、パラメータを直接設定できます。

のターゲットとして PostgreSQL データベースを使用する方法の詳細については AWS DMS、以下のセクションを参照してください。

のターゲットとしての PostgreSQL の使用に関する制限 AWS Database Migration Service

PostgreSQL データベースを AWS DMSのターゲットとして使用する場合、以下の制限が適用されます。

  • 異種の移行の場合、JSON データ型は内部でネイティブな CLOB データ型に変換されます。

  • Oracle から PostgreSQL への移行では、Oracle の列に NULL 文字 (16 進値 U+0000) が含まれている場合、 は NULL 文字をスペース (16 進値 U+0020) AWS DMS に変換します。これは、PostgreSQL の制限によるものです。

  • AWS DMS は、coalesce 関数で作成された一意のインデックスを持つテーブルへのレプリケーションをサポートしていません。

  • テーブルがシーケンスを使用している場合は、ソースデータベースからレプリケーションを停止した後、ターゲットデータベース内の各シーケンスNEXTVALの の値を更新します。 はソースデータベースからデータ AWS DMS をコピーしますが、進行中のレプリケーション中はシーケンスをターゲットに移行しません。

のターゲットとして PostgreSQL データベースを使用する場合のセキュリティ要件 AWS Database Migration Service

セキュリティ上の観点から、データ移行に使用されるユーザーアカウントは、ターゲットとして使用する PostgreSQL データベースにおける登録済みユーザーにする必要があります。

PostgreSQL ターゲットエンドポイントでは、 AWS DMS 移行を実行するために最小限のユーザーアクセス許可が必要です。以下の例を参照してください。

CREATE USER newuser WITH PASSWORD 'your-password'; ALTER SCHEMA schema_name OWNER TO newuser;

または

GRANT USAGE ON SCHEMA schema_name TO myuser; GRANT CONNECT ON DATABASE postgres to myuser; GRANT CREATE ON DATABASE postgres TO myuser; GRANT CREATE ON SCHEMA schema_name TO myuser; GRANT UPDATE, INSERT, SELECT, DELETE, TRUNCATE ON ALL TABLES IN SCHEMA schema_name TO myuser; GRANT TRUNCATE ON schema_name."BasicFeed" TO myuser;

のターゲットとして PostgreSQL を使用する場合のエンドポイント設定と追加の接続属性 (ECAs) AWS DMS

エンドポイント設定と追加の接続属性 (ECAs ) を使用して、PostgreSQL ターゲットデータベースを設定できます。

AWS DMS コンソールを使用するか、--postgre-sql-settings '{"EndpointSetting": "value", ...}'JSON 構文で の create-endpoint コマンドを使用してAWS CLI、ターゲットエンドポイントを作成するときに設定を指定します。

エンドポイントの ExtraConnectionAttributesパラメータを使用して ECAs を指定します。

次の表は、PostgreSQL をターゲットとして使用できるエンドポイント設定を説明しています。

名前 説明

MaxFileSize

PostgreSQL へのデータ転送に使用される .csv ファイルの最大サイズ (KB 単位) を指定します。

デフォルト値: 32768 KB (32 MB)

有効な値:1 ~ 1,048,576 KB (最大 1.1 GB)

例: --postgre-sql-settings '{"MaxFileSize": 512}'

ExecuteTimeout

PostgreSQL インスタンスのクライアントステートメントタイムアウト (秒単位) を設定します。デフォルト値は 60 秒です。

例: --postgre-sql-settings '{"ExecuteTimeout": 100}'

AfterConnectScript= SET session_replication_role = replica

この属性は、外部キーとユーザートリガーを AWS DMS バイパスして、データの一括ロードにかかる時間を短縮します。

MapUnboundedNumericAsString

このパラメータは、数値の精度を失うことなく正常に移行するために、境界なしの NUMERIC データ型の列を文字列として扱います。このパラメーターは、PostgreSQL ソースから PostgreSQL ターゲットへのレプリケーション、または PostgreSQL 互換のデータベースにのみ使用します。

デフォルト値: false

有効な値: false/true

例: --postgre-sql-settings '{"MapUnboundedNumericAsString": "true"}

このパラメータを使用すると、数値から文字列への変換、および数値への変換により、レプリケーションのパフォーマンスが低下する可能性があります。このパラメータは、DMS バージョン 3.4.4 以降で使用するためにサポートされています

注記

PostgreSQL のソースとターゲット エンドポイントを一緒にのみ MapUnboundedNumericAsString を使用します。

ソース PostgreSQL エンドポイントで MapUnboundedNumericAsString を使用すると、CDC 中に精度が 28 に制限されます。ターゲット エンドポイントで MapUnboundedNumericAsString を使用すると、精度 28 スケール 6 でデータを移行します。

PostgreSQL 以外のターゲットとは MapUnboundedNumericAsString を使用しません。

loadUsingCSV

この追加接続属性 (ECA) を使用して、\COPY コマンドを使用して全ロードオペレーションのデータを転送します。

デフォルト値: true

有効な値: true/false

ECA の例:loadUsingCSV=true;

注: この ECA を false に設定すると、INSERTs が直接実行されるため、レプリケーションのパフォーマンスが低下する可能性があります。

DatabaseMode

この属性を使用して、Babelfish エンドポイントなど、追加の設定を必要とする PostgreSQL 互換エンドポイントのレプリケーション処理のデフォルトの動作を変更する。

デフォルト値: DEFAULT

有効な値: DEFAULTBABELFISH

例: DatabaseMode=default;

BabelfishDatabaseName

この属性を使用して、移行先のターゲット Babelfish T-SQL データベース名を指定する。これは、DatabaseModeBabelfish に設定されている場合に必要です。これは予約済みの babelfish_db データベースではない。

例: BabelfishDatabaseName=TargetDb;

PostgreSQL のターゲットデータ型

の PostgreSQL データベースエンドポイントは、ほとんどの PostgreSQL データベースデータ型 AWS DMS をサポートしています。次の表は、 の使用時にサポートされる PostgreSQL データベースターゲットデータ型 AWS DMS と、 AWS DMS データ型からのデフォルトのマッピングを示しています。

AWS DMS データ型の詳細については、「」を参照してくださいAWS Database Migration Service のデータ型

AWS DMS データ型

PostgreSQL のデータ型

BOOLEAN

BOOLEAN

BLOB

BYTEA

BYTES

BYTEA

DATE

DATE

TIME

TIME

DATETIME

スケールが 0 ~ 6 の場合、タイムスタンプ を使用します。

スケールが 7 ~ 9 の場合、VARCHAR (37) を使用します。

INT1

SMALLINT

INT2

SMALLINT

INT4

INTEGER

INT8

BIGINT

NUMERIC

DECIMAL (P,S)

REAL4

FLOAT4

REAL8

FLOAT8

STRING

長さが 1 ~ 21,845 の場合、VARCHAR (バイト単位の長さ) を使用します。

長さが 21,846 ~ 2,147,483,647 の場合、VARCHAR (65535) を使用します。

UINT1

SMALLINT

UINT2

INTEGER

UINT4

BIGINT

UINT8

BIGINT

WSTRING

長さが 1 ~ 21,845 の場合、VARCHAR (バイト単位の長さ) を使用します。

長さが 21,846 ~ 2,147,483,647 の場合、VARCHAR (65535) を使用します。

NCLOB

TEXT

CLOB

TEXT

注記

PostgreSQL ソースからレプリケートする場合、 は、ユーザー定義のデータ型の列を除き、すべての列に対して同じデータ型のターゲットテーブル AWS DMS を作成します。このような場合、データ型はターゲットで「character varying」として作成されます。

のターゲットとしての Babelfish for Aurora PostgreSQL の使用 AWS Database Migration Service

AWS Database Migration Serviceを使用して SQL Server ソーステーブルを Babelfish for Amazon Aurora PostgreSQL のターゲットに移行できます。Babelfishを使用すると、Aurora PostgreSQL は Microsoft SQL Server 独自の SQL 言語である T-SQL を認識し、同じ通信プロトコルをサポートします。これにより、SQL Server 向けに作成されたアプリケーションのコード変更量が低減し、Aurora と連携できるようになります。Babelfish の機能は Amazon Aurora に組み込まれており、追加のコストは発生しません。Amazon Aurora クラスターのBabelfish は、Amazon RDS コンソールで有効化できます。

AWS DMS コンソール、API、または CLI コマンドを使用して AWS DMS ターゲットエンドポイントを作成するときは、ターゲットエンジンを Amazon Aurora PostgreSQL として指定し、データベースに babelfish_db という名前を付けます。[エンドポイント設定] セクションで、DatabaseModeBabelfish に設定して、BabelfishDatabaseName をターゲットの Babelfish T-SQL データベース名に指定する設定を追加します。

移行タスクへの変換ルールの追加

Babelfish のターゲットの移行タスクを定義する場合、DMS がターゲットデータベース内で事前に作成された T-SQL Babelfish テーブルを使用するようにする変換ルールを含める必要があります。

まず、すべてのテーブル名を小文字にする変換ルールを移行タスクに追加します。Babelfish は、T-SQLを使用して作成したテーブル名前 PostgreSQL の pg_class カタログに小文字で保存します。ただし、大文字と小文字が混在する名前の SQL Server テーブルがある場合、DMS は T-SQL 互換のデータ型ではなく PostgreSQL ネイティブのデータ型を使用してテーブルを作成します。このため、すべてのテーブル名を小文字にする変換ルールを必ず追加します。列名は小文字に変換しないように注意してください。

次に、クラスターを定義する際にマルチデータベース移行モードを使用した場合は、元の SQL Server スキーマ名を変更する変換ルールを追加します。T-SQL データベース名が含まれるように SQL Server スキーマ名は必ず変更します。例えば、元の SQL Server のスキーマ名が dbo で、T-SQL データベース名が mydb の場合、変換ルールを使用してスキーマ名を mydb_dbo と変更します。

単一のデータベースモードを使用する場合、スキーマ名を変更するための変換ルールは必要ありません。スキーマ名には、Babelfish のターゲット T-SQL データベースとの one-to-one マッピングがあります。

次の変換ルールサンプルでは、すべてのテーブル名を小文字にして、元の SQL Server スキーマ名を dbo から mydb_dbo に変更しています。

{ "rules": [ { "rule-type": "transformation", "rule-id": "566251737", "rule-name": "566251737", "rule-target": "schema", "object-locator": { "schema-name": "dbo" }, "rule-action": "rename", "value": "mydb_dbo", "old-value": null }, { "rule-type": "transformation", "rule-id": "566139410", "rule-name": "566139410", "rule-target": "table", "object-locator": { "schema-name": "%", "table-name": "%" }, "rule-action": "convert-lowercase", "value": null, "old-value": null }, { "rule-type": "selection", "rule-id": "566111704", "rule-name": "566111704", "object-locator": { "schema-name": "dbo", "table-name": "%" }, "rule-action": "include", "filters": [] } ] }

Babelfish テーブルで PostgreSQL のターゲットエンドポイントを使用する場合の制限

Babelfish テーブルで PostgreSQL のターゲットエンドポイントを使用する場合、次の制限が適用されます。

  • [ターゲットテーブル作成モード] では、[何もしない] モードまたは [切り捨て] モードのみを使用します。[ターゲット上のテーブルを削除] モードは使用しないでください。このモードの場合、DMS は T-SQL が認識しない可能性のある PostgreSQL テーブルとしてテーブルを作成します。

  • AWS DMS は sql_variant データ型をサポートしていません。

  • Babelfish は、HEIRARCHYID データ型、GEOMETRY データ型、GEOGRAPHY データ型をサポートしていません。上記のデータ型を移行するには、変換ルールを追加してデータ型を wstring(250) に変換します。

  • Babelfish での BINARY データ型、VARBINARY データ型、IMAGE データ型の以降は、BYTEA データ型を使用することでのみサポートされます。Aurora PostgreSQL の以前のバージョンの場合、DMS を使用してこのようなテーブルを Babelfish のターゲットエンドポイント に移行できます。次の例のとおり、BYTEA データ型で長さを指定する必要はありません。

    [Picture] [VARBINARY](max) NULL

    上記の T-SQL データ型を T-SQL がサポートする BYTEA データ型に変更します。

    [Picture] BYTEA NULL
  • Aurora PostgreSQL Babelfish の以前のバージョンでは、PostgreSQL ターゲットエンドポイントを使用して SQL Server から Babelfish への継続的なレプリケーションのための移行タスクを作成する場合、IDENTITY 列を使用するすべてのテーブルに SERIAL データ型を割り当てる必要があります。Aurora PostgreSQL (バージョン 15.3、14.8 以降) と Babelfish (バージョン 3.2.0 以降) 以降では、アイデンティティ列がサポートされるようになったため、SERIAL データ型を割り当てる必要はありません。詳細については、「SQL Server to Aurora PostgreSQL 移行プレイブック」の「Sequences and Identity」セクションの「SERIAL Usage」を参照してください。Babelfish でテーブルを作成する際は、列の定義を次のとおり変更します。

    [IDCol] [INT] IDENTITY(1,1) NOT NULL PRIMARY KEY

    上記の内容を次のとおり変更します。

    [IDCol] SERIAL PRIMARY KEY

    Babelfish 互換の Aurora PostgreSQL では、デフォルト設定を使用してシーケンスを作成し、列に NOT NULL 制約を追加します。新たに作成されるシーケンスは通常のシーケンス (1 でインクリメント) と同様に動作し、複合型の SERIAL のオプションはありません。

  • IDENTITY 列または SERIAL データ型を使用するテーブルのデータを移行した後、列の最大値に基づいて PostgreSQL ベースのシーケンスオブジェクトをリセットします。テーブルのフルロード実行後、次の T-SQL クエリを使用してステートメントを生成し、関連づけられたシーケンスオブジェクトをシードします。

    DECLARE @schema_prefix NVARCHAR(200) = '' IF current_setting('babelfishpg_tsql.migration_mode') = 'multi-db' SET @schema_prefix = db_name() + '_' SELECT 'SELECT setval(pg_get_serial_sequence(''' + @schema_prefix + schema_name(tables.schema_id) + '.' + tables.name + ''', ''' + columns.name + ''') ,(select max(' + columns.name + ') from ' + schema_name(tables.schema_id) + '.' + tables.name + '));' FROM sys.tables tables JOIN sys.columns columns ON tables.object_id = columns.object_id WHERE columns.is_identity = 1 UNION ALL SELECT 'SELECT setval(pg_get_serial_sequence(''' + @schema_prefix + table_schema + '.' + table_name + ''', ''' + column_name + '''),(select max(' + column_name + ') from ' + table_schema + '.' + table_name + '));' FROM information_schema.columns WHERE column_default LIKE 'nextval(%';

    このクエリは、最大 IDENTITY 値と SERIAL 値を更新する SELECT ステートメントのセットを生成します。

  • バージョン 3.2 以前の Babelfish では、[完全 LOB モード] の場合、テーブルエラーが発生する可能性があります。エラーが発生した場合は、ロードに失敗したテーブルのために別のタスクを作成します。その後、[制限付き LOB モード] を使用して [最大 LOB サイズ (KB)] に適切な値を指定します。もう 1 つのオプションとして、SQL Server エンドポイント接続属性設定を ForceFullLob=True と指定する方法があります。

  • バージョン 3.2 以前の Babelfish では、整数ベースのプライマリキーを使用しない Babelfish テーブルでデータ検証を実行すると、適切な一意のキーが見つからないというメッセージが表示されます。整数以外のプライマリキーのデータ検証は、Aurora PostgreSQL (バージョン 15.3、14.8 以降) と Babelfish (バージョン 3.2.0 以降) 以降ではサポートされています。

  • 秒の小数点以下の桁数の精度の違いにより、DMS は DATETIME データ型を使用する Babelfish テーブルでデータ検証エラーを報告します。このようなエラーが表示されないようにするには、DATETIME データ型に次のとおりの検証ルールタイプを追加します。

    { "rule-type": "validation", "rule-id": "3", "rule-name": "3", "rule-target": "column", "object-locator": { "schema-name": "dbo", "table-name": "%", "column-name": "%", "data-type": "datetime" }, "rule-action": "override-validation-function", "source-function": "case when ${column-name} is NULL then NULL else 0 end", "target-function": "case when ${column-name} is NULL then NULL else 0 end" }