「翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。」
データベースを PostgreSQL のソースとして使用するAWS DMS
を使用して、1 つ以上の PostgreSQL データベースからデータを移行できます。AWS DMSソースとして PostgreSQL データベースを使用すると、別の PostgreSQL データベースまたはサポートされている他のデータベースのいずれかにデータを移行できます。AWS DMS は、以下のタイプのデータベースのソースとして、PostgreSQL バージョン 9.4 以降 (バージョン 9.x の場合)、10.x、11.x、および 12.x データベースをサポートしています。
-
オンプレミスのデータベース
-
インスタンスでのデータベースAmazon EC2
-
Amazon RDS DB インスタンスでのデータベース
-
との互換性を持つ Amazon Aurora DB インスタンスでのデータベースPostgreSQL
-
AWS DMS は、ソースまたはターゲットとしての Amazon RDS for PostgreSQL 10.4 または Amazon Aurora (PostgreSQL 10.4) では動作しません。
-
PostgreSQL バージョン 12.x は AWS DMS バージョン 3.3.3 以降でソースとしてサポートされています。
-
PostgreSQL バージョン 11.x は AWS DMS バージョン 3.3.1 以降でのみソースとしてサポートされています。バージョン 9.4 以降 (バージョン 9.x) および 10.x を任意の DMS バージョンのソースとして使用できます。PostgreSQL
-
PostgreSQL バージョン 10.x では、以前のバージョンの関数名とフォルダ名に多くの変更が加えられています。
場合によっては、PostgreSQL バージョン 10.x データベースをソースとして使用し、3.3.1 より前の AWS DMS バージョンを使用します。これらの場合、データベースを バージョン 10.x を PostgreSQL のソースとして使用するAWS DMS のソースとして準備する方法については、「AWS DMS.」を参照してください。
注記 バージョン 3.3.1 以降のソースとして PostgreSQL 10.x データベースを使用する場合は、以前の AWS DMS バージョンに必要なソース 10.x データベースに対してこれらの準備を行わないでください。AWS DMS
サポートされている AWS DMS ソースバージョンを使用するための PostgreSQL バージョン要件の概要については、次の表を参照してください。
PostgreSQL ソースバージョン |
AWS DMS使用する バージョン |
---|---|
9.x |
使用可能な任意の AWS DMS バージョンを使用します。 |
10.x |
3.3.1 より前の AWS DMS バージョンを使用している場合は、「PostgreSQL」で説明されているラッパー関数を使用して、バージョン 10.x を PostgreSQL のソースとして使用するAWS DMS ソースを準備します。 バージョン 3.3.1 以降を使用する場合は、これらのラッパー関数を作成しないでください。AWS DMS追加の準備作業なしで PostgreSQL ソースを使用できます。 |
11.x |
AWS DMS バージョン 3.3.1 を使用します。 |
12.x |
AWS DMS バージョン 3.3.3 を使用します。 |
SSL を使用して、PostgreSQL エンドポイントとレプリケーションインスタンスとの接続を暗号化できます。エンドポイントで SSL を使用する方法の詳細については、「PostgreSQL」を参照してください。 での SSL の使用AWS Database Migration Service
データベースから AWS の PostgreSQL データベースへの同種移行の場合、以下が当てはまります。PostgreSQL
-
ソースの JSONB 列は、ターゲットの JSONB 列に移行されます。
-
JSON 列は、ターゲットで JSON 列として移行されます。
-
HSTORE 列は、ターゲットで HSTORE 列として移行されます。
ソースとして PostgreSQL を使用し、ターゲットとして別のデータベースエンジンを使用した異種移行では、状況は異なります。この場合、JSONB、JSON、および HSTORE 列は AWS DMS 中間タイプの NCLOB に変換され、ターゲットで対応する NCLOB 列タイプに変換されます。この場合、AWS DMS は JSONB データを LOB 列と同様に扱います。移行の全ロードフェーズ中、ターゲット列は NULL を許容する必要があります。
AWS DMS は、プライマリキーを持つ PostgreSQL テーブルの変更データキャプチャ (CDC) をサポートします。テーブルにプライマリキーがない場合、先書きログ (WAL) にはデータベース行の前イメージが含まれていないため、AWS DMS がテーブルを更新できません。
AWS DMS は、DB インスタンスが論理レプリケーションを使用するように設定されている場合、Amazon RDS PostgreSQL データベース上の CDC をサポートします。Amazon RDS は PostgreSQL DB インスタンスバージョン 9.4.9 以降および 9.5.4 以降の論理レプリケーションをサポートします。また、Amazon RDS はバージョン 2.2.0 および 2.2.1 を使用して、Amazon Aurora DB インスタンスの論理レプリケーションもサポートしています。互換性は PostgreSQL 10.6 です。
データベースと PostgreSQL の使用の詳細については、以下のセクションを参照してください。AWS DMS
トピック
- を使用した PostgreSQL から PostgreSQL への移行AWS DMS
- データベースを PostgreSQL のソースとして使用する場合の前提条件AWS DMS
- データベースを PostgreSQL のソースとして使用する場合のセキュリティ要件AWS DMS
- データベースを PostgreSQL のソースとして使用する場合の制限AWS DMS
- ソースとしての Amazon RDS PostgreSQL DB インスタンスの設定
- ソースデータベースからの AWS DMS アーティファクトの削除PostgreSQL
- データベースを PostgreSQL のソースとして使用する場合の追加設定AWS DMS
- バージョン 10.x を PostgreSQL のソースとして使用するAWS DMS
- のソースとして PostgreSQL を使用する場合の追加の接続属性AWS DMS
- のソースデータ型PostgreSQL
を使用した PostgreSQL から PostgreSQL への移行AWS DMS
以外のデータベースエンジンから PostgreSQL データベースに移行する場合、ほとんどの場合 PostgreSQL が最適な移行ツールです。AWS DMSただし、PostgreSQL データベースから PostgreSQL データベースに移行する場合、PostgreSQL ツールがより効果的な場合があります。
以下の条件では、PostgreSQL などの pg_dump
データベース移行ツールを使用することをお勧めします。
-
ソース PostgreSQL データベースからターゲット PostgreSQL データベースに移行する同種移行である。
-
データベース全体を移行する。
-
ネイティブツールで最小のダウンタイムでデータを移行できる。
ユーティリティは COPY コマンドを使用して pg_dump
データベースのスキーマおよびデータダンプを作成します。PostgreSQLpg_dump
によって生成されるダンプスクリプトは、同じ名前のデータベースにデータをロードし、テーブル、インデックス、外部キーを再作成します。pg_restore
コマンドと -d
パラメータを使用して、データを別の名前でデータベースに復元できます。
または PostgreSQL の Amazon RDS への PostgreSQL データベースのインポートの詳細については、「PostgreSQL との互換性がある Amazon Aurora」を参照してください。https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/PostgreSQL.Procedural.Importing.html
DMS を使用した PostgreSQL から PostgreSQL へのデータの移行
AWS DMS は、たとえば、オンプレミスのソース PostgreSQL データベースから Amazon RDS または PostgreSQL インスタンスのターゲット Aurora PostgreSQL にデータを移行できます。通常、PostgreSQL のコアまたは基本のデータ型は正常に移行されます。
ソースのデータベースではサポートされていても、ターゲットではサポートされていないデータ型は、正常に移行されないことがあります。データ型が不明な場合、AWS DMS は一部のデータ型を文字列としてストリームします。XML や JSON などの一部のデータ型は、小さなファイルの場合は正常に移行されますが、大きなドキュメントの場合は失敗することがあります。
次の表は、ソース PostgreSQL データ型と、これらのデータ型が正常に移行されるかどうかを示しています。
データ型 | 正常に移行 | 部分的に移行 | 移行しない | コメント |
---|---|---|---|---|
INTEGER | X | |||
SMALLINT | X | |||
BIGINT | X | |||
NUMERIC/DECIMAL(p,s) | X | この場合、0<p<39 と 0<s | ||
NUMERIC/DECIMAL | X | この場合、p>38 または p=s=0 | ||
REAL | X | |||
DOUBLE | X | |||
SMALLSERIAL | X | |||
SERIAL | X | |||
BIGSERIAL | X | |||
MONEY | X | |||
CHAR | X | 精度の指定なし | ||
CHAR(n) | X | |||
VARCHAR | X | 精度の指定なし | ||
VARCHAR(n) | X | |||
TEXT | X | |||
BYTEA | X | |||
TIMESTAMP | X | |||
TIMESTAMP(Z) | X | |||
DATE | X | |||
TIME | X | |||
TIME (z) | X | |||
INTERVAL | X | |||
BOOLEAN | X | |||
ENUM | X | |||
CIDR | X | |||
INET | X | |||
MACADDR | X | |||
TSVECTOR | X | |||
TSQUERY | X | |||
XML | X | |||
POINT | X | PostGIS 空間データ型 | ||
LINE | X | |||
LSEG | X | |||
BOX | X | |||
PATH | X | |||
POLYGON | X | PostGIS 空間データ型 | ||
CIRCLE | X | |||
JSON | X | |||
ARRAY | X | |||
COMPOSITE | X | |||
RANGE | X | |||
LINESTRING | X | PostGIS 空間データ型 | ||
MULTIPOINT | X | PostGIS 空間データ型 | ||
MULTILINESTRING | X | PostGIS 空間データ型 | ||
MULTIPOLYGON | X | PostGIS 空間データ型 | ||
GEOMETRYCOLLECTION | X | PostGIS 空間データ型 |
NUMERIC(p,s) データ型で精度とスケールが指定されない場合、PostgreSQL はデフォルトでは 28 の精度と 6 のスケール (NUMERIC(28,6)) を使用します。AWS DMSたとえば、ソースからの値 0.611111104488373 は、PostgreSQL ターゲットの 0.611111 に変換されます。
空間データ型の移行PostGIS
空間データは、空間内のオブジェクトまたは位置のジオメトリ情報を識別します。のオブジェクトリレーショナルデータベースは、PostgreSQL 空間データ型をサポートします。PostGIS
空間データオブジェクトを移行する前に、PostgreSQL プラグインがグローバルレベルで有効になっていることを確認してください。PostGISこれにより、AWS DMS は PostgreSQL ターゲットデータベースインスタンスの正確なソース空間データ列を作成します。
から PostgreSQL への同種移行の場合、PostgreSQL では以下のような AWS DMS ジオメトリおよび地理的 (測地座標) データオブジェクト型およびサブタイプの移行がサポートされています。PostGIS
-
POINT
-
LINESTRING
-
POLYGON
-
MULTIPOINT
-
MULTILINESTRING
-
MULTIPOLYGON
-
GEOMETRYCOLLECTION
データベースを PostgreSQL のソースとして使用する場合の前提条件AWS DMS
データベースを PostgreSQL のソースにする場合、以下の操作を実行します。AWS DMS
-
バージョン 9.4.x 以降の PostgreSQL データベースを使用します。
-
全ロードタスクと変更データキャプチャ (CDC) タスクまたは CDC のみのタスクの場合、PostgreSQL ソースデータベースに指定されたユーザーアカウントにスーパーユーザー権限を付与します。ソース内のレプリケーション固有の機能にアクセスするには、スーパーユーザー権限が必要です。フルロードのみのタスクの場合、それらを移行するには、テーブルで SELECT 権限が必要です。
-
AWS DMS レプリケーションサーバーの IP アドレスを
pg_hba.conf
設定ファイルに追加し、レプリケーションおよびソケット接続を有効にします。以下に例を示します。# Replication Instance host all all 12.3.4.56/00 md5 # Allow replication connections from localhost, by a user with the # replication privilege. host replication dms 12.3.4.56/00 md5
PostgreSQL の
pg_hba.conf
設定ファイルはクライアント認証を制御します。(DBA はホストベースの認証を表します) ファイルは従来、データベースクラスターのデータディレクトリに保存されています。 -
postgresql.conf
設定ファイルで次のパラメータと値を設定します。-
を設定
wal_level = logical
-
max_replication_slots
を 1 より大きい値に設定します。max_replication_slots
値は、実行するタスクの数に従って設定してください。たとえば、5 つのタスクを実行するには、少なくとも 5 つのスロットを設定する必要があります。スロットは、タスクが開始するとすぐに自動的に開き、タスクが実行されなくなった場合でも開いたままです。開いているスロットは手動で削除する必要があります。 -
max_wal_senders
を 1 より大きい値に設定します。max_wal_senders
パラメータは、実行可能な同時タスクの数を設定します。 -
を設定
wal_sender_timeout =0
wal_sender_timeout
パラメータは、指定されたミリ秒数が過ぎても非アクティブなレプリケーション接続を終了します。デフォルトは 60 秒ですが、このパラメータは 0 に設定することをお勧めします (タイムアウトメカニズムが無効になります)。
注記 一部のパラメータは、サーバーの起動時にのみ設定できます。設定ファイルのエントリに対する変更は、サーバーが再起動されるまで無視されます。詳細については、PostgreSQL データベースのドキュメントを参照してください。
-
-
バージョン 9.6 以降でパラメータ
idle_in_transaction_session_timeout
を使用すると、アイドル状態のトランザクションがタイムアウトして失敗する可能性があります。PostgreSQL一部の AWS DMS トランザクションでは、AWS DMS エンジンで再度そのパラメータが使用されるまでの間、しばらくアイドル状態になることがあります。 を使用する際、アイドル状態のトランザクションを終了しないでください。AWS DMS.
データベースを PostgreSQL のソースとして使用する場合のセキュリティ要件AWS DMS
をソースとして使用する場合の唯一のセキュリティ要件として、指定されたユーザーアカウントが PostgreSQL データベースに登録されているユーザーであることが必要です。PostgreSQL
データベースを PostgreSQL のソースとして使用する場合の制限AWS DMS
のソースとして PostgreSQL を使用する場合、以下の制限が適用されます。AWS DMS
-
AWS DMS は、ソースまたはターゲットとして Amazon RDS 10.4 または PostgreSQL 10.4 に対しては Amazon Aurora PostgreSQL を使用できません。
-
キャプチャされたテーブルにはプライマリキーが必要です。テーブルにプライマリキーがない場合、AWS DMS はそのテーブルの DELETE および UPDATE レコードオペレーションを無視します。
-
タイムゾーンの種類の列のタイムスタンプはサポートされていません。
-
AWS DMS は、プライマリキーセグメントの更新の試みを無視します。この場合、ターゲットは、その更新によってどの行も更新されないと識別します。ただし、PostgreSQL でのプライマリキーの更新結果は予測できないため、どのレコードも例外テーブルには書き込まれません。
-
AWS DMS では、[Start Process Changes from Timestamp] 実行オプションがサポートされていません。
-
AWS DMS は、Amazon RDS の PostgreSQL での全ロードと変更処理をサポートします。 DB インスタンスを準備し、CDC を使用するようにセットアップする方法については、「PostgreSQL」を参照してください。ソースとしての Amazon RDS PostgreSQL DB インスタンスの設定
-
大文字と小文字の組み合わせが異なる同じ名前 (table1、TABLE1、Table1) を持つ複数のテーブルをレプリケートすると、予測できない動作が生じることがあります。この問題により、AWS DMS ではこのタイプのレプリケーションがサポートされていません。
-
多くの場合、AWS DMS ではテーブルに対する CREATE、ALTER、DROP DDL ステートメントの変更処理がサポートされています。テーブルが内部関数またはプロシージャ本文ブロックに保持されているか、ネストしている他の構造に保持されている場合、AWS DMS ではこの変更処理がサポートされていません。
たとえば、以下の変更はキャプチャされません。
CREATE OR REPLACE FUNCTION attu.create_distributors1() RETURNS void LANGUAGE plpgsql AS $$ BEGIN create table attu.distributors1(did serial PRIMARY KEY,name varchar(40) NOT NULL); END; $$;
-
現在、
boolean
ソースの PostgreSQL データ型は、一貫性のない値を持つbit
データ型として SQL Server ターゲットに移行されます。回避策として、列のVARCHAR(1)
データ型を使用してテーブルを事前に作成します (または、AWS DMS でテーブルを作成します)。次に、ダウンストリーム処理で「F」を False、「T」を True として扱います。 -
AWS DMS では、TRUNCATE オペレーションの変更処理はサポートされていません。
-
OID LOB データ型は、ターゲットに移行されません。
-
ソースがオンプレミスまたは PostgreSQL インスタンス上の Amazon EC2 データベースである場合は、test_decoding 出力プラグインがソースエンドポイントにインストールされていることを確認します。このプラグインは、Postgres contrib パッケージにあります。test-decoding プラグインの詳細については、「 のドキュメントPostgreSQL」を参照してください。
-
AWS DMS では、列のデフォルト値を設定および設定解除するための変更処理はサポートされていません (ALTER TABLE ステートメントでの ALTER COLUMN SET DEFAULT 句の使用)。
-
AWS DMS では、列の null 機能を設定するための変更処理はサポートされていません (ALTER TABLE ステートメントでの ALTER COLUMN [SET|DROP] NOT NULL 句の使用)。
-
論理レプリケーションが有効な場合、トランザクションあたりのメモリに保持される変更の最大数は 4 MB です。その後、変更はディスクに書き込まれます。結果として
ReplicationSlotDiskUsage
が増加し、トランザクションが完了または中止され、ロールバックが終了するまでrestart_lsn
は続行されません。トランザクションが長くなるため、ロールバックに時間がかかることがあります。したがって、論理レプリケーションが有効な場合は、長時間実行されるトランザクションは避けてください。代わりに、トランザクションをいくつかの小さいトランザクションに分割します。 -
AWS DMS では、パーティション分割されたテーブルのレプリケーションはサポートされていません。パーティション分割されたテーブルが検出された場合、以下の状況が発生します。
-
エンドポイントは、親テーブルと子テーブルのリストを報告します。
-
AWS DMS は、ターゲットのテーブルを、選択したテーブルと同じプロパティを持つ通常のテーブルとして作成します。
-
ソースデータベースの親テーブルに子テーブルと同じプライマリキー値がある場合、「重複するキー」エラーが生成されます。
-
パーティション分割されたテーブルを PostgreSQL ソースから PostgreSQL ターゲットにレプリケートするには、まずターゲットで親テーブルと子テーブルを手動で作成する必要があります。次に、それらのテーブルにレプリケートする別個のタスクを定義します。その場合、タスク設定を [Truncate before loading.] に設定します。
PostgreSQL データ型はサイズが固定されていません。NUMERIC
NUMERIC
データ型ですが、精度とスケールがないデータを転送する場合、DMS はデフォルトで NUMERIC(28,6)
(精度が 28、スケールが 6) を使用します。たとえば、ソースからの値 0.611111104488373 は、PostgreSQL ターゲットの 0.611111
に変換されます。
ソースとしての Amazon RDS PostgreSQL DB インスタンスの設定
for Amazon RDS DB インスタンスまたはリードレプリカを PostgreSQL のソースとして使用できます。AWS DMSDB インスタンスは、全ロードタスクと継続的なレプリケーションの変更データキャプチャ (CDC) の両方に使用できます。リードレプリカは、全ロードタスクにのみ使用でき、CDC には使用できません。
DB インスタンス用の AWS マスターユーザーアカウントを PostgreSQL の PostgreSQL ソースエンドポイント用のユーザーアカウントとして使用します。AWS DMSマスターユーザーアカウントには、CDC を設定するために必要なロールがあります。マスターユーザーアカウント以外のアカウントを使用する場合、アカウントには rds_superuser ロールと rds_replication ロールが必要です。rds_replication ロールは、論理スロットを管理し、論理スロットを使用してデータをストリーミングするアクセス権限を付与します。
DB インスタンスのマスターユーザーアカウントを使用しない場合は、使用するアカウントのマスターユーザーアカウントから複数のオブジェクトを作成する必要があります。必要なオブジェクトの作成については、「」を参照してください。マスターユーザーアカウントを使用しない Amazon RDS for PostgreSQL データベースの移行.
RDS for PostgreSQL DB インスタンスでの CDC の使用
のネイティブ論理レプリケーション機能を使用して、PostgreSQL DB インスタンスの Amazon RDS のデータベース移行中に CDC を有効にすることができます。PostgreSQLこのアプローチにより、ダウンタイムが短くなり、確実にターゲットデータベースがソース PostgreSQL データベースと同期されるようになります。Amazon RDS は、PostgreSQL DB インスタンスバージョン 9.4.9 以降および 9.5.4 以降の論理レプリケーションをサポートしています。
CDC (継続的なレプリケーション) には Amazon RDS リードレプリカに PostgreSQL を使用することはできません。
RDS PostgreSQL DB インスタンスの論理レプリケーションを有効にするには
-
DB インスタンス用の AWS マスターユーザーアカウントを PostgreSQL ソースエンドポイント用のユーザーアカウントとして使用します。PostgreSQLマスターユーザーアカウントには、CDC を設定するために必要なロールがあります。
マスターユーザーアカウント以外のアカウントを使用する場合は、使用するアカウントのマスターユーザーアカウントから複数のオブジェクトを作成する必要があります。詳細については、「」を参照してください。マスターユーザーアカウントを使用しない Amazon RDS for PostgreSQL データベースの移行.
-
DB パラメータグループの
rds.logical_replication
パラメータを 1 に設定します。この静的パラメータを有効にするには、DB インスタンスを再起動する必要があります。このパラメータを適用する一環として、AWS DMS はwal_level
、max_wal_senders
、max_replication_slots
、およびmax_connections
パラメータを設定します。これらのパラメータの変更によって先書きログ (WAL) の生成が増える可能性があるため、論理レプリケーションスロットを使用する場合にのみrds.logical_replication
を設定してください。 -
ベストプラクティスとして、
wal_sender_timeout
パラメータを 0 に設定します。このパラメータを 0 に設定すると、PostgreSQL は指定されたタイムアウトより非アクティブなレプリケーション接続を終了します。AWS DMS がデータを移行するとき、レプリケーション接続は指定するタイムアウトより長く実行できる必要があります。 -
をソースとしてネイティブ CDC 開始ポイントを有効にします。PostgreSQLこれを行うには、エンドポイントを作成するときに、
slotName
の追加の接続属性を、既存の論理レプリケーションスロットの名前に設定します。この論理レプリケーションスロットは、エンドポイントの作成時点からの継続的な変更を保持するため、以前の時点からのレプリケーションをサポートします。PostgreSQL は、AWS DMS が論理レプリケーションスロットから変更を正常に読み取った後にのみ破棄される WAL ファイルにデータベースの変更を書き込みます。論理レプリケーションスロットを使用すると、ログに記録された変更がレプリケーションエンジンによって消費される前に削除されないように保護できます。
ただし、変更率と消費率によっては、論理レプリケーションスロットに保持されている変更により、ディスク使用率が高くなることがあります。論理レプリケーションスロットを使用する場合は、ソースの PostgreSQL インスタンスにスペース使用アラームを設定することをお勧めします。追加の
slotName
接続属性の設定についての詳細は、「のソースとして PostgreSQL を使用する場合の追加の接続属性AWS DMS.」を参照してください。
次の手順では、このアプローチについて詳しく説明します。
ネイティブ CDC 開始ポイントを使用して PostgreSQL ソースエンドポイントの CDC ロードを設定するには
-
開始点として使用する以前のレプリケーションタスク (親タスク) によって使用されていた論理レプリケーションスロットを特定します。次に、ソースデータベースの
pg_replication_slots
ビューにクエリを実行して、このスロットにアクティブな接続がないことを確認します。その場合は、先に進む前に解決して終了します。次のステップでは、論理レプリケーションスロットが であると仮定します。
abc1d2efghijk_34567890_z0yx98w7_6v54_32ut_1srq_1a2b34c5d67ef
. -
次の追加接続属性設定を含む新しいソースエンドポイントを作成します。
slotName=abc1d2efghijk_34567890_z0yx98w7_6v54_32ut_1srq_1a2b34c5d67ef;
-
AWS DMS API または CLI を使用して、新しい CDC 専用タスクを作成します。たとえば、CLI を使用して、次の
create-replication-task
コマンドを実行できます。AWS DMS は現在、コンソールを使用したネイティブ開始ポイントによる CDC タスクの作成をサポートしていません。
aws dms create-replication-task --replication-task-identifier postgresql-slot-name-test --source-endpoint-arn arn:aws:dms:us-west-2:012345678901:endpoint:ABCD1EFGHIJK2LMNOPQRST3UV4 --target-endpoint-arn arn:aws:dms:us-west-2:012345678901:endpoint:ZYX9WVUTSRQONM8LKJIHGF7ED6 --replication-instance-arn arn:aws:dms:us-west-2:012345678901:rep:AAAAAAAAAAA5BB4CCC3DDDD2EE --migration-type cdc --table-mappings "file://mappings.json" --cdc-start-position "4AF/B00000D0" --replication-task-settings "file://task-pg.json"
前述のコマンドでは、次のオプションが設定されています。
-
source-endpoint-arn
は、ステップ 2 で作成した新しい値に設定されます。 -
replication-instance-arn
は、ステップ 1 の親タスクと同じ値に設定されます。 -
table-mappings
およびreplication-task-settings
は、ステップ 1 の親タスクと同じ値に設定されます。 -
cdc-start-position
は、開始位置の値に設定されます。この開始位置を調べるには、ソースデータベースのpg_replication_slots
ビューにクエリを実行するか、ステップ 1 で親タスクのコンソール詳細を表示します。詳細については、「」を参照してください。CDC ネイティブの開始ポイントの決定.
この CDC タスクが実行されると、指定された論理レプリケーションスロットが存在しない場合、AWS DMS はエラーを生成します。また、
cdc-start-position
の有効な設定を使用してタスクが作成されていない場合、エラーが生成されます。 -
マスターユーザーアカウントを使用しない Amazon RDS for PostgreSQL データベースの移行
場合によっては、ソースとして使用している Amazon RDS PostgreSQL DB インスタンスのマスターユーザーアカウントを使用しない場合があります。このような場合は、データ定義言語 (DDL) イベントをキャプチャするために複数のオブジェクトを作成する必要があります。マスターアカウント以外のアカウントでこれらのオブジェクトを作成し、マスターユーザーアカウントでトリガーを作成します。
ソースエンドポイントで captureDDLs
追加の接続属性を N に設定した場合、ソースデータベース上で次のテーブルおよびトリガーを作成する必要はありません。
これらのオブジェクトを作成するには、以下の手順を実行します。マスターアカウント以外のユーザーアカウントをこの手順では NoPriv
アカウントと呼んでいます。
オブジェクトを作成するには
-
オブジェクトが作成されるスキーマを選択します。デフォルトのスキーマは
public
です。 スキーマが存在し、NoPriv
アカウントからアクセス可能であることを確認します。 -
アカウントを使用して PostgreSQL DB インスタンスにログインします。
NoPriv
-
以下のコマンドを実行して
awsdms_ddl_audit
テーブルを作成します。コード内の
は、使用するスキーマの名前に置き換えてください。objects_schema
create table
objects_schema
.awsdms_ddl_audit ( c_key bigserial primary key, c_time timestamp, -- Informational c_user varchar(64), -- Informational: current_user c_txn varchar(16), -- Informational: current transaction c_tag varchar(24), -- Either 'CREATE TABLE' or 'ALTER TABLE' or 'DROP TABLE' c_oid integer, -- For future use - TG_OBJECTID c_name varchar(64), -- For future use - TG_OBJECTNAME c_schema varchar(64), -- For future use - TG_SCHEMANAME. For now - holds current_schema c_ddlqry text -- The DDL query associated with the current DDL event ) -
以下のコマンドを実行して
awsdms_intercept_ddl
関数を作成します。コード内の
は、使用するスキーマの名前に置き換えてください。objects_schema
CREATE OR REPLACE FUNCTION
objects_schema
.awsdms_intercept_ddl() RETURNS event_trigger LANGUAGE plpgsql SECURITY DEFINER AS $$ declare _qry text; BEGIN if (tg_tag='CREATE TABLE' or tg_tag='ALTER TABLE' or tg_tag='DROP TABLE') then SELECT current_query() into _qry; insert intoobjects_schema
.awsdms_ddl_audit values ( default,current_timestamp,current_user,cast(TXID_CURRENT()as varchar(16)),tg_tag,0,'',current_schema,_qry ); delete fromobjects_schema
.awsdms_ddl_audit; end if; END; $$; -
NoPriv
アカウントからログアウトし、rds_superuser
ロールが割り当てられたアカウントを使用してログインします。 -
以下のコマンドを実行してイベントトリガー
awsdms_intercept_ddl
を作成します。CREATE EVENT TRIGGER awsdms_intercept_ddl ON ddl_command_end EXECUTE PROCEDURE
objects_schema
.awsdms_intercept_ddl();
前の手順を完了したら、AWS DMS アカウントを使用して NoPriv
ソースエンドポイントを作成できます。
ソースデータベースからの AWS DMS アーティファクトの削除PostgreSQL
DDL イベントをキャプチャするため、移行タスクの開始時に AWS DMS によってさまざまなアーティファクトが PostgreSQL データベースに作成されます。タスクが完了したら、これらのアーティファクトを削除できます。アーティファクトを削除するには、以下のステートメントを発行します
(示されている順序で)。{AmazonRDSMigration}
は、アーティファクトが作成されたスキーマです。
drop event trigger awsdms_intercept_ddl;
イベントトリガーは特定のスキーマに属していません。
drop function {AmazonRDSMigration}.awsdms_intercept_ddl() drop table {AmazonRDSMigration}.awsdms_ddl_audit drop schema {AmazonRDSMigration}
スキーマを削除する場合でも、細心の注意を払ってください。運用中のスキーマ (特に公開スキーマ) は絶対に削除しないでください。
データベースを PostgreSQL のソースとして使用する場合の追加設定AWS DMS
データベースからデータを移行するときは、2 つの方法でその他の構成設定を追加できます。PostgreSQL
-
追加接続属性に値を追加して、DDL イベントをキャプチャし、運用中の DDL データベースアーティファクトが作成されたスキーマを指定します。詳細については、「」を参照してください。のソースとして PostgreSQL を使用する場合の追加の接続属性AWS DMS.
-
接続文字列パラメータを上書きできます。以下のいずれかを行う必要がある場合は、このオプションを選択します。
-
内部 AWS DMS パラメータを指定します。このようなパラメータが必要になることはめったにないため、ユーザーインターフェイスには表示されません。
-
特定のデータベースクライアントのパススルー (passthru) 値を指定します。AWS DMS では、データベースクライアントに渡される接続文字列にパススルーパラメータが含まれています。
-
-
バージョン 9.4 以降のテーブルレベルのパラメータ
REPLICATE IDENTITY
を使用すると、先行書き込みログ (PostgreSQLWALsWALs 特に、更新または削除される行を識別する WALs の場合、これを行います。REPLICATE IDENTITY FULL
は、行のすべての列の古い値を記録します。により必要ではない可能性のある多数のREPLICATE IDENTITY FULL
が生成されるため、FULL
はテーブルごとに慎重に使用してください。WALs
バージョン 10.x を PostgreSQL のソースとして使用するAWS DMS
PostgreSQL バージョン 10.x データベースでは、以前の PostgreSQL バージョンの関数名とフォルダ名に多くの変更が加えられています。そのため、3.3.1 より前の AWS DMS バージョンを使用する場合、一部の移行アクションには下位互換性がありません。
10.x データベースを PostgreSQL 3.3.1 以降のソースとして使用する場合、以下に説明する準備を実行AWS DMSしないでください。追加の準備作業なしで PostgreSQL ソースを使用できます。
ほとんどの名前変更は表面上のものであるため、AWS DMS では AWS DMS が PostgreSQL バージョン 10.x を使用できるようにするラッパー関数を作成しました。ラッパー関数は、pg_catalog
の関数よりも優先されます。 さらに、ユーザー定義関数などの他のシステムカタログ関数が上書きされないように、既存のスキーマのスキーマ可視性は変更されないようにしました。
移行タスクを実行する前にこれらのラッパー関数を使用するには、ソースエンドポイントの作成に使用したのと同じ AWS DMS ユーザーアカウント (
) を使用します。これらのラッパー関数を定義してこのアカウントに関連付けるには、ソース PostgreSQL データベースで次の SQL コードを実行します。
user_name
BEGIN; CREATE SCHEMA IF NOT EXISTS fnRenames; CREATE OR REPLACE FUNCTION fnRenames.pg_switch_xlog() RETURNS pg_lsn AS $$ SELECT pg_switch_wal(); $$ LANGUAGE SQL; CREATE OR REPLACE FUNCTION fnRenames.pg_xlog_replay_pause() RETURNS VOID AS $$ SELECT pg_wal_replay_pause(); $$ LANGUAGE SQL; CREATE OR REPLACE FUNCTION fnRenames.pg_xlog_replay_resume() RETURNS VOID AS $$ SELECT pg_wal_replay_resume(); $$ LANGUAGE SQL; CREATE OR REPLACE FUNCTION fnRenames.pg_current_xlog_location() RETURNS pg_lsn AS $$ SELECT pg_current_wal_lsn(); $$ LANGUAGE SQL; CREATE OR REPLACE FUNCTION fnRenames.pg_is_xlog_replay_paused() RETURNS boolean AS $$ SELECT pg_is_wal_replay_paused(); $$ LANGUAGE SQL; CREATE OR REPLACE FUNCTION fnRenames.pg_xlogfile_name(lsn pg_lsn) RETURNS TEXT AS $$ SELECT pg_walfile_name(lsn); $$ LANGUAGE SQL; CREATE OR REPLACE FUNCTION fnRenames.pg_last_xlog_replay_location() RETURNS pg_lsn AS $$ SELECT pg_last_wal_replay_lsn(); $$ LANGUAGE SQL; CREATE OR REPLACE FUNCTION fnRenames.pg_last_xlog_receive_location() RETURNS pg_lsn AS $$ SELECT pg_last_wal_receive_lsn(); $$ LANGUAGE SQL; CREATE OR REPLACE FUNCTION fnRenames.pg_current_xlog_flush_location() RETURNS pg_lsn AS $$ SELECT pg_current_wal_flush_lsn(); $$ LANGUAGE SQL; CREATE OR REPLACE FUNCTION fnRenames.pg_current_xlog_insert_location() RETURNS pg_lsn AS $$ SELECT pg_current_wal_insert_lsn(); $$ LANGUAGE SQL; CREATE OR REPLACE FUNCTION fnRenames.pg_xlog_location_diff(lsn1 pg_lsn, lsn2 pg_lsn) RETURNS NUMERIC AS $$ SELECT pg_wal_lsn_diff(lsn1, lsn2); $$ LANGUAGE SQL; CREATE OR REPLACE FUNCTION fnRenames.pg_xlogfile_name_offset(lsn pg_lsn, OUT TEXT, OUT INTEGER) AS $$ SELECT pg_walfile_name_offset(lsn); $$ LANGUAGE SQL; CREATE OR REPLACE FUNCTION fnRenames.pg_create_logical_replication_slot(slot_name name, plugin name, temporary BOOLEAN DEFAULT FALSE, OUT slot_name name, OUT xlog_position pg_lsn) RETURNS RECORD AS $$ SELECT slot_name::NAME, lsn::pg_lsn FROM pg_catalog.pg_create_logical_replication_slot(slot_name, plugin, temporary); $$ LANGUAGE SQL; ALTER USER
user_name
SET search_path = fnRenames, pg_catalog, "$user", public; -- DROP SCHEMA fnRenames CASCADE; -- ALTER USER PG_User SET search_path TO DEFAULT; COMMIT;
3.3.1 より前の PostgreSQL バージョンのソース AWS DMS 10.x データベースでこの準備コードを実行しないと、次のようなエラーが表示されます。
2018-10-29T02:57:50 [SOURCE_CAPTURE ]E: RetCode: SQL_ERROR SqlState: 42703 NativeError: 1 Message: ERROR: column "xlog_position" does not exist;, No query has been executed with that handle [1022502] (ar_odbc_stmt.c:3647)
AWS DMS バージョンを 3.3.1 以降にアップグレードした後、次のステップに従います。
-
ソース
fnRenames
10.x 設定検索パスの設定に使用するALTER USER
ステートメントから PostgreSQL 参照を削除します。 -
データベースから
fnRenames
スキーマを削除します。PostgreSQL
アップグレード後にこれらのステップを実行しない場合、fnRenames
スキーマへのアクセス時に次のエラーがログに表示されます。
RetCode: SQL_ERROR SqlState: 42703 NativeError: 1 Message: ERROR: column "lsn" does not exist;
がデータベースに対して非マスターユーザーアカウントを使用している場合は、ソース AWS DMS 10.x データベースでこれらのラッパー関数にアクセスするための特定のアクセス権限も設定する必要があります。PostgreSQLこれらのアクセス許可を設定するには、次の許可を実行します。
GRANT USAGE ON SCHEMA fnRenames TO dms_superuser; GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA fnRenames TO dms_superuser;
ソース PostgreSQL 10.x データベースで非マスターユーザーアカウントを使用する方法の詳細については、「マスターユーザーアカウントを使用しない Amazon RDS for PostgreSQL データベースの移行」を参照してください。
のソースとして PostgreSQL を使用する場合の追加の接続属性AWS DMS
追加の接続属性を使用して PostgreSQL ソースを設定できます。これらの設定は、ソースエンドポイントを作成するときに指定します。接続属性の設定が複数ある場合は、空白を追加せずにそれぞれをセミコロンで区切ります
(例: oneSetting;thenAnother
).
次の表に、PostgreSQL を AWS DMS のソースとして使用するときに使用できる追加の接続属性を示します。
Attribute Nameは | 説明 |
---|---|
|
DDL イベントをキャプチャするために、AWS DMS はタスクの開始時にさまざまなアーティファクトを PostgreSQL データベースに作成します。」に記載されているように、これらのアーティファクトは後で削除できます。ソースデータベースからの AWS DMS アーティファクトの削除PostgreSQL. この値が N に設定されている場合は、ソースデータベースにテーブルまたはトリガーを作成する必要はありません。詳細については、「」を参照してください。マスターユーザーアカウントを使用しない Amazon RDS for PostgreSQL データベースの移行. ストリーミングされた DDL イベントがキャプチャされます。 デフォルト値: Y 有効な値: Y/N 例: |
|
運用中の DDL データベースアーティファクトが作成されるスキーマ。 デフォルト値: public 有効な値: 文字列 例: |
|
タスクが制限付き LOB モードに設定され、このオプションが true に設定されている場合、LOB データを切り捨てるのではなくタスクが失敗します。 デフォルト値: false 有効な値: ブール値 例: |
|
インスタンスのクライアントステートメントタイムアウトを秒単位で設定します。PostgreSQLデフォルト値は 60 秒です。 例: |
|
ソースインスタンスの CDC ロード用に以前に作成された論理レプリケーションスロットの名前を設定します。PostgreSQL AWS DMS API DMS が論理レプリケーションスロットを使用して PostgreSQL の CDC ロードを開始する方法の詳細については、「RDS for PostgreSQL DB インスタンスでの CDC の使用」を参照してください。 有効な値: 文字列 例: |
|
WAL ハートビート機能はダミートランザクションを模倣するため、アイドル状態の論理レプリケーションスロットが古い WAL ログを保持せず、ソース上でストレージがいっぱいになります。このハートビートは
デフォルト値: 有効な値: true/false 例: |
|
WAL ハートビートの頻度を設定します (分単位)。 デフォルト値: 有効な値: 数値 例: |
|
ハートビートアーティファクトが作成されるスキーマ。 デフォルト値: 有効な値: 文字列 例: |
のソースデータ型PostgreSQL
次の表に、PostgreSQL を使用する場合にサポートされる AWS DMS のソースデータ型と、AWS DMS のデータ型とのデフォルトマッピングを示します。
ターゲットにマッピングされるデータ型を表示する方法については、使用しているターゲットエンドポイントのセクションを参照してください。
AWS DMS のデータ型の詳細については、「AWS Database Migration Service のデータ型.」を参照してください。
PostgreSQL のデータ型 |
AWS DMS データ型 |
---|---|
INTEGER |
INT4 |
SMALLINT |
INT2 |
BIGINT |
INT8 |
NUMERIC (p,s) |
精度が 0 ~ 38 の場合、NUMERIC を使用します。 精度が 39 以上の場合、STRING を使用します。 |
DECIMAL(P,S) |
精度が 0 ~ 38 の場合、NUMERIC を使用します。 精度が 39 以上の場合、STRING を使用します。 |
REAL |
REAL4 |
DOUBLE |
REAL8 |
SMALLSERIAL |
INT2 |
SERIAL |
INT4 |
BIGSERIAL |
INT8 |
MONEY |
NUMERIC(38,4) MONEY データ型は、SQL Server の FLOAT にマッピングされます。 |
CHAR |
WSTRING (1) |
CHAR(N) |
WSTRING (n) |
VARCHAR(N) |
WSTRING (n) |
TEXT |
NCLOB |
BYTEA |
BLOB |
TIMESTAMP |
TIMESTAMP |
TIMESTAMP (z) |
TIMESTAMP |
TIMESTAMP (タイムゾーン付き) |
サポート外 |
DATE |
DATE |
TIME |
TIME |
TIME (z) |
TIME |
INTERVAL |
STRING (128)—1 YEAR、2 MONTHS、3 DAYS、4 HOURS、5 MINUTES、6 SECONDS |
BOOLEAN |
CHAR (5) false または true |
ENUM |
STRING (64) |
CIDR |
STRING (50) |
INET |
STRING (50) |
MACADDR |
STRING (18) |
BIT (n) |
STRING (n) |
BIT VARYING (n) |
STRING (n) |
UUID |
STRING |
TSVECTOR |
CLOB |
TSQUERY |
CLOB |
XML |
CLOB |
POINT |
STRING (255) "(x,y)" |
LINE |
STRING (255) "(x,y,z)" |
LSEG |
STRING (255) "((x1,y1),(x2,y2))" |
BOX |
STRING (255) "((x1,y1),(x2,y2))" |
PATH |
CLOB "((x1,y1),(xn,yn))" |
POLYGON |
CLOB "((x1,y1),(xn,yn))" |
CIRCLE |
STRING (255) "(x,y),r" |
JSON |
NCLOB |
JSONB |
NCLOB |
ARRAY |
NCLOB |
COMPOSITE |
NCLOB |
HSTORE |
NCLOB |
INT4RANGE |
STRING (255) |
INT8RANGE |
STRING (255) |
NUMRANGE |
STRING (255) |
STRRANGE |
STRING (255) |
PostgreSQL 列サイズは、PostgreSQL LOB データ型の AWS DMS データ型への変換に影響します。これを使用するには、次の AWS DMS データ型で以下の手順を実行します。
-
BLOB – タスク作成で [Limit LOB size to (LOB サイズ制限)] 値を [Maximum LOB size (KB) (最大 LOB サイズ (KB))] に設定します。
-
CLOB – レプリケーションは各文字を UTF8 文字として処理します。次に、列で最長の文字テキストの長さを見つけ (ここでは、
max_num_chars_text
)、これを使用して [Limit LOB size to (LOB のサイズ制限).] の値を指定します。データに 4 バイト文字が含まれている場合は、2 倍にして [Limit LOB size to (LOB サイズ制限)] 値をバイト単位で指定します。この場合、[Limit LOB size to (LOB サイズ制限)] はmax_num_chars_text
の 2 乗と等しくなります。 -
NCLOB – レプリケーションは各文字を 2 バイト文字として処理します。次に、列で最長の文字テキストの長さを見つけ (
max_num_chars_text
)、2 倍にして [Limit LOB size to (LOB のサイズ制限).] の値を指定します。この場合、[Limit LOB size to (LOB サイズ制限)] はmax_num_chars_text
の 2 乗と等しくなります。データに 4 バイト文字が含まれている場合は、再度 2 倍にします。この場合、[Limit LOB size to (LOB サイズ制限)] はmax_num_chars_text
の 4 乗と等しくなります。