Amazon Relational Database Service
ユーザーガイド

Amazon RDS 上の PostgreSQL にデータをインポートする

Amazon RDS に移動させる既存の PostgreSQL デプロイがあるとします。タスクの複雑さは、データベースのサイズと転送するデータベースオブジェクトの種類に依存しています。たとえば、データベースにギガバイトのオーダーのデータセット、さらにストアドプロシージャとトリガーが含まれているとします。このようなデータベースは、単純なデータベース (数メガバイトのテストデータを含むだけで、トリガーやストアドプロシージャを含まないもの) よりも複雑になります。

次の条件で、ネイティブ PostgreSQL データベース移行ツールを使用することをお勧めします。

  • ターゲットデータベースエンジンと同じデータベースエンジンを持つデータベースから移行する、同機種移行である。

  • データベース全体を移行する。

  • ネイティブツールでは、最小のダウンタイムでシステムを移行することができます。

他のほとんどの場合、AWS Database Migration Service (AWS DMS) を使用してデータベースを移行するのが最善の手法です。AWS DMS はダウンタイムなしでデータベースを移行でき、多くのデータベースエンジンに対して、ターゲットデータベースに切り替える準備ができるまで、進行中のレプリケーションを続行できます。AWS DMS を使用して、同じデータベースエンジンまたは異なるデータベースエンジンに移行できます。ソースデータベースとは別のデータベースエンジンへ移行する場合は、AWS Schema Conversion Tool (AWS SCT) を使用できます。AWS SCT を使用して、AWS DMS で移行されないスキーマオブジェクトを移行します。AWS DMS の詳細については、「AWS Database Migration Service とは」を参照してください。

DB パラメータグループを変更し、次のインポート専用の設定を含めます。DB インスタンスサイズの最も効率的な設定を見つけるために、パラメータ設定をテストする必要があります。さらに、インポートが完了したら、これらのパラメータを本番稼働用の値に戻す必要があります。

DB インスタンスの設定を次のように変更します。

  • DB インスタンスのバックアップを無効にします (backup_retention を 0 に設定します)。

  • マルチ AZ を無効にする.

次の設定を含むように DB パラメータグループを変更します。これらの設定は、データのインポート時にのみ使用してください。DB インスタンスサイズの最も効率的な設定を見つけるために、パラメータ設定をテストする必要があります。さらに、インポートが完了したら、これらのパラメータを本番稼働用の値に戻す必要があります。

パラメータ インポート時の推奨値 説明

maintenance_work_mem

524288、1048576、2097152、または 4194304 (KB 単位)。これらの設定は、512 MB、1 GB、2 GB、および 4 GB と同等です。

この設定の値は、ホストのサイズによって異なります。このパラメータは、CREATE INDEX ステートメントで使用され、各並列コマンドがこの量のメモリを使用できます。この設定値が大きすぎてメモリ不足が生じることのないように、最適な値を計算します。

checkpoint_segments

256

この設定値では、ディスク容量の消費が増えますが、WAL ログの競合が少なくなります。PostgreSQL バージョン 9.5.x および 9.6.x の場合、この値は max_wal_size になります。

checkpoint_timeout

1800

この値に設定すると、WAL ローテーションの頻度を低くすることができます。

synchronous_commit

オフ

この設定を無効にすると、書き込みが速くなります。このパラメータをオフにすると、サーバークラッシュ時にデータが損失するリスクを下げることができます (FSYNC はオフにしないでください)。

wal_buffers

8192

この値は、8 KB 単位です。これも WAL の生成速度に貢献します。

autovacuum

オフ

リソースが使用されないように、データのロード時に PostgreSQL の自動バキュームパラメータを無効にします。

これらの設定で、pg_dump -Fc (圧縮) または pg_restore -j (並列) コマンドを使用します。

注記

PostgreSQL コマンド pg_dumpall の実行には SUPER_USER 権限が必要ですが、この権限は DB インスタンスの作成時に付与されません。そのため、このコマンドをデータのインポートに使用することはできません。

Amazon EC2 インスタンスから PostgreSQL データベースをインポートする

Amazon EC2 インスタンス上の PostgreSQL サーバーにデータがあり、そのデータを PostgreSQL DB インスタンスに移動する場合は、以下のプロセスを使用できます。このプロセスは以下のステップで構成されます。この後のセクションで、各ステップについて詳しく説明します。

  1. pg_dump を使用して、ロードするデータを格納したファイルを作成する

  2. ターゲット DB インスタンスを作成する

  3. psql を使用して、DB インスタンスにデータベースを作成し、データをロードする

  4. DB インスタンスの DB スナップショットを作成する

ステップ 1: ロードするデータが含まれている pg_dump を使用してファイルを作成する

pg_dump ユーティリティでは、COPY コマンドを使用して、PostgreSQL データベースのスキーマとデータダンプを作成します。pg_dump によって生成されるダンプスクリプトは、同じ名前のデータベースにデータをロードし、テーブル、インデックス、外部キーを再作成します。pg_restore コマンドと -d パラメータを使用して、データを別の名前でデータベースに復元できます。

データダンプの作成前に、ダンプするテーブルに対してクエリを実行して行数を取得し、ターゲット DB インスタンスでその行数を確認できるようにする必要があります。

以下のコマンドでは、mydb2 というデータベース用に mydb2dump.sql というダンプファイルを作成しています。

prompt>pg_dump dbname=mydb2 -f mydb2dump.sql

ステップ 2: ターゲット DB インスタンスを作成する

Amazon RDS コンソール、AWS CLI、または API のいずれかを使用して、ターゲット PostgreSQL DB インスタンスを作成します。バックアップの保持設定を 0 にし、マルチ AZ を無効にして、インスタンスを作成します。これにより、データのインポートが高速化されます。データをダンプする前に、インスタンスにデータベースを作成する必要があります。データベースは、ダンプしたデータが含まれていたデータベースと同じ名前で作成できます。または、別の名前でデータベースを作成できます。この場合は、pg_restore コマンドと -d パラメータを使用して、新しい名前のデータベース内にデータを復元します。

たとえば、データベースのダンプ、復元、名前変更に以下のコマンドを使用できます。

pg_dump -Fc -v -h [endpoint of instance] -U [master username] [database] > [database].dump createdb [new database name] pg_restore -v -h [endpoint of instance] -U [master username] -d [new database name] [database].dump

ステップ 3: psql を使用して DB インスタンスにデータベースを作成し、データをロードする

pg_dump コマンドの実行に使用した同じ接続を使用して、ターゲット DB インスタンスに接続し、データベースを再作成できます。psql により、マスターユーザー名とマスターパスワードを使用して DB インスタンスにデータベースを作成できます。

以下の例では、psql と、mydb2dump.sql という名前のダンプファイルを使用して、mypginstance という PostgreSQL DB インスタンスに mydb2 というデータベースを作成しています。

Linux、OS X、Unix の場合:

psql \ -f mydb2dump.sql \ --host mypginstance.c6c8mntzhgv0.us-west-2.rds.amazonaws.com \ --port 8199 \ --username myawsuser \ --password password \ --dbname mydb2

Windows の場合:

psql ^ -f mydb2dump.sql ^ --host mypginstance.c6c8mntzhgv0.us-west-2.rds.amazonaws.com ^ --port 8199 ^ --username myawsuser ^ --password password ^ --dbname mydb2

ステップ 4: DB インスタンスの DB スナップショットを作成する

データが DB インスタンスにロードされたことを確認したら、ターゲット PostgreSQL DB インスタンスの DB スナップショットを作成することをお勧めします。DB スナップショットは DB インスタンスの完全なバックアップであり、DB インスタンスを既知の状態に復元するために使用できます。ロード直後に DB スナップショットを作成しておくと、何らかの事故のときにそのスナップショットを使用すれば、データを再ロードせずに済みます。また、そのスナップショットを使用して、新しい DB インスタンスをシードすることもできます。DB スナップショットの作成については、「DB スナップショットの作成」を参照してください。

\copy コマンドを使用して PostgreSQL DB インスタンスのテーブルにデータをインポートする

psql プロンプトから \copy コマンドを実行して、PostgreSQL DB インスタンス上のテーブルにデータをインポートできます。DB インスタンスには、テーブルがあらかじめ存在している必要があります。\copy コマンドの詳細については、PostgreSQL ドキュメントを参照してください。

注記

\copy コマンドでは、挿入された行の数の確認など、アクションの確認は行えません。コピーコマンドがエラーのため失敗した場合、PostgreSQL によってエラーメッセージは返されません。

ソーステーブルのデータから .csv ファイルを作成したら、psql を使用して PostgreSQL インスタンス上のターゲットデータベースにログオンし、以下のコマンドを実行します。この例では、ソーステーブル名として source-table、.csv ファイルとして source-table.csv、ターゲットデータベースとして target-db を使用しています。

target-db=> \copy source-table from 'source-table.csv' with DELIMITER ',';

また、クライアントコンピュータのコマンドプロンプトから、以下のコマンドを実行することもできます。この例では、ソーステーブル名として source-table、.csv ファイルとして source-table.csv、ターゲットデータベースとして target-db を使用しています。

Linux、OS X、Unix の場合:

$psql target-db \ -U <admin user> \ -p <port> \ -h <DB instance name> \ -c "\copy source-table from 'source-table.csv' with DELIMITER ','"

Windows の場合:

$psql target-db ^ -U <admin user> ^ -p <port> ^ -h <DB instance name> ^ -c "\copy source-table from 'source-table.csv' with DELIMITER ','"

Amazon S3 データを RDS for PostgreSQL DB インスタンスにインポートする

データは、Amazon S3 から、 RDS for PostgreSQL DB インスタンスに属するテーブルにインポートすることができます。そのために、 Amazon RDS によって提供される aws_s3 PostgreSQL 拡張機能を使用します。

注記

Amazon S3 から RDS for PostgreSQL にインポートするには、データベースで PostgreSQL バージョン 10.7 以降を実行している必要があります。

Amazon S3 を使用したデータの保存の詳細については、『Amazon Simple Storage Service 入門ガイド』の「バケットの作成」を参照してください。Amazon S3 バケットにファイルをアップロードする方法の手順については、『Amazon Simple Storage Service 入門ガイド』の「バケットにオブジェクトを追加」を参照してください。

Amazon S3 データのインポートの概要

Amazon S3 バケットに保存されたデータを PostgreSQL データベーステーブルにインポートするには、次の手順を実行します。

S3 データを Amazon RDS にインポートするには

  1. 必要な PostgreSQL 拡張機能をインストールします。たとえば、aws_s3 および aws_commons などがあります。これを行うには psql を起動し、以下のコマンドを使用します。

    psql=> CREATE EXTENSION aws_s3 CASCADE; NOTICE: installing required extension "aws_commons"

    aws_s3 拡張機能には、Amazon S3 データのインポートに使用する aws_s3.table_import_from_s3 関数が含まれます。aws_commons 拡張機能は、追加のヘルパー機能を提供します。

  2. 使用するデータベーステーブルと Amazon S3 ファイルを特定します。

    aws_s3.table_import_from_s3 関数には、データをインポートする PostgreSQL データベーステーブルの名前が必要です。この関数は、インポートする Amazon S3 ファイルも指定する必要があります。この情報を提供するには、次の手順を実行します。

    1. データを入力する PostgreSQL データベーステーブルを特定します。たとえば、以下はこのトピックの例で使用されるサンプル t1 データベーステーブルです。

      psql=> CREATE TABLE t1 (col1 varchar(80), col2 varchar(80), col3 varchar(80));
    2. 次の情報を取得して、インポートする Amazon S3 ファイルを特定します。

      • バケット名 – バケットは、Amazon S3 オブジェクトまたはファイルのコンテナです。

      • ファイルパス – ファイルパスは、Amazon S3 バケット内のファイルの場所を指します。

      • AWS リージョン – AWS リージョンは、Amazon S3 リージョンの場所を指します。たとえば、S3 バケットが 米国東部(バージニア北部) リージョンにある場合、us-east-1 を使用します。AWS リージョン名と関連する値のリストについては、リージョンとアベイラビリティーゾーン を参照してください。

      この情報を取得する方法については、Amazon Simple Storage Service 入門ガイド の「オブジェクトの表示」を参照してください。この情報は、AWS CLI コマンド aws s3 cp を使用して確認できます。情報が正しい場合、このコマンドは Amazon S3 ファイルのコピーをダウンロードします。

      aws s3 cp s3://sample_s3_bucket/sample_file_path ./
    3. aws_commons.create_s3_uri 関数を使用して、Amazon S3 ファイル情報を保持するための aws_commons._s3_uri_1 構造を作成します。この aws_commons._s3_uri_1 構造は、aws_s3.table_import_from_s3 関数への呼び出しパラメータとして使用します。

      psql の例については、次を参照してください。

      psql=> SELECT aws_commons.create_s3_uri( 'sample_s3_bucket', 'sample.csv', 'us-east-1' ) AS s3_uri \gset
  3. Amazon S3 ファイルへのアクセス許可を提供します。

    Amazon S3 ファイルからデータをインポートするには、RDS for PostgreSQL DB インスタンスに、ファイルが含まれている Amazon S3 バケットへのアクセス許可を与える必要があります。これを行うには、AWS Identity and Access Management (IAM) ロールまたはセキュリティ認証情報を使用します。詳細については、Amazon S3 バケットへのアクセスを設定する を参照してください。

  4. aws_s3.table_import_from_s3 関数を呼び出して Amazon S3 データをインポートします。

    前の準備タスクが完了したら、aws_s3.table_import_from_s3 関数を使用して、Amazon S3 データをインポートします。詳細については、aws_s3.table_import_from_s3 関数を使用して Amazon S3 データをインポートする を参照してください。

Amazon S3 バケットへのアクセスを設定する

Amazon S3 ファイルからデータをインポートするには、RDS for PostgreSQL DB インスタンスに、ファイルが含まれている Amazon S3 バケットへのアクセス許可を与える必要があります。次のトピックで説明する 2 つの方法のいずれかで、Amazon S3 バケットへのアクセスを提供します。

IAM ロールを使用した Amazon S3 バケットへのアクセス

Amazon S3 ファイルからデータをロードするには、ファイルが含まれる Amazon S3 バケットへのアクセス許可を RDS for PostgreSQL DB インスタンスに与えます。こうすれば、追加の資格情報を管理したり、aws_s3.table_import_from_s3 関数呼び出しで提供したりする必要はありません。

これを行うには、Amazon S3 バケットへのアクセスを提供する IAM ポリシーを作成します。IAM ロールを作成して、ポリシーをロールにアタッチします。次に、IAM ロールを DB インスタンスに割り当てます。

IAM ロールを使用して、Amazon S3 へのアクセス権を RDS for PostgreSQL DB インスタンスに付与するには

  1. IAM ポリシーを作成します。ポリシーは、RDS for PostgreSQL DB インスタンスに Amazon S3 へのアクセスを許可するバケットとオブジェクトのアクセス許可を付与します。

    ポリシーに、Amazon S3 バケットから Amazon RDS へのファイル転送を許可ための次の必須アクションを含めます。

    • s3:GetObject

    • s3:ListBucket

    ポリシーに次のリソースを含めて、Amazon S3 バケットとバケット内のオブジェクトを識別します。これは、Amazon S3 にアクセスするための Amazon リソースネーム (ARN) 形式を示しています。

    • arn:aws:s3:::your-s3-bucket

    • arn:aws:s3:::your-s3-bucket/*

    Amazon RDS for PostgreSQL の IAM ポリシーの作成の詳細については、IAM データベースアクセス用の IAM ポリシーの作成と使用 を参照してください。IAM ユーザーガイド の「チュートリアル: はじめてのカスタマー管理ポリシーの作成とアタッチ」も参照してください。

    以下の AWS CLI コマンドでは、これらのオプションを指定して、rds-s3-import-policy という名前の IAM ポリシーを作成します。このポリシーでは、your-s3-bucket という名前のバケットへのアクセス権が付与されます。

    注記

    ポリシーを作成したら、そのポリシーの Amazon リソースネーム (ARN) を書き留めます。ポリシーを IAM ロールにアタッチする場合、後続のステップで ARN が必要です。

    Linux、OS X、Unix の場合:

    aws iam create-policy \ --policy-name rds-s3-import-policy \ --policy-document '{ "Version": "2012-10-17", "Statement": [ { "Sid": "s3import", "Action": [ "s3:GetObject", "s3:ListBucket" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::your-s3-bucket", "arn:aws:s3:::your-s3-bucket/*" ] } ] }'

    Windows の場合:

    aws iam create-policy ^ --policy-name rds-s3-import-policy ^ --policy-document '{ "Version": "2012-10-17", "Statement": [ { "Sid": "s3import", "Action": [ "s3:GetObject", "s3:ListBucket" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::your-s3-bucket", "arn:aws:s3:::your-s3-bucket/*" ] } ] }'
  2. IAM ロールを作成します。これを行うと、Amazon RDS がユーザーに代わってこの IAM ロールを引き受け、Amazon S3 バケットにアクセスできます。詳細については、IAM ユーザーガイド の「IAM ユーザーにアクセス権限を委任するロールの作成」を参照してください。

    以下の例は、AWS CLI コマンドを使用して、rds-s3-import-role という名前のロールを作成する例を示しています。

    Linux、OS X、Unix の場合:

    aws iam create-role \ --role-name rds-s3-import-role \ --assume-role-policy-document '{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "rds.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }'

    Windows の場合:

    aws iam create-role ^ --role-name rds-s3-import-role ^ --assume-role-policy-document '{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "rds.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }'
  3. 作成した IAM ポリシーを、作成した IAM ロールにアタッチします。

    次の AWS CLI コマンドは、先ほど作成したポリシーを rds-s3-import-role という名前のロールにアタッチします。your-policy-arn を前の手順でメモしたポリシー ARN に置き換えます。

    Linux、OS X、Unix の場合:

    aws iam attach-role-policy \ --policy-arn your-policy-arn \ --role-name rds-s3-import-role

    Windows の場合:

    aws iam attach-role-policy ^ --policy-arn your-policy-arn ^ --role-name rds-s3-import-role
  4. DB インスタンスに IAM ロールを追加します。これを行うには、以下で説明するように、AWS マネジメントコンソール または AWS CLI を使用します。

コンソール

コンソールを使用して PostgreSQL DB インスタンスの IAM ロールを追加するには

  1. AWS マネジメントコンソール にサインインして、Amazon RDS コンソール (https://console.aws.amazon.com/rds/) を開きます。

  2. 詳細を表示するには、PostgreSQL DB インスタンスの名前を選択します。

  3. [接続とセキュリティ] タブの [IAM ロールの管理] セクションで、[このインスタンスに IAM ロールを追加] で追加するロールを選択します。

  4. [Feature] で、[s3Import] を選択します。

  5. [Add role] を選択します。

AWS CLI

CLI を使用して PostgreSQL DB インスタンスの IAM ロールを追加するには

  • 次のコマンドを使用して、my-db-instance という名前の PostgreSQL DB インスタンスにロールを追加します。your-role-arn を、以前のステップで書き留めたロール ARN に置き換えます。--feature-name オプションの値に s3Import を使用します。

    Linux、OS X、Unix の場合:

    aws rds add-role-to-db-instance \ --db-instance-identifier my-db-instance \ --feature-name s3Import \ --role-arn your-role-arn \ --region your-region

    Windows の場合:

    aws rds add-role-to-db-instance ^ --db-instance-identifier my-dbi-nstance ^ --feature-name s3Import ^ --role-arn your-role-arn ^ --region your-region

セキュリティ認証情報を使用して Amazon S3 バケットにアクセスする

必要に応じて、IAM ロールでアクセスを提供する代わりに、セキュリティ認証情報を使用して Amazon S3 バケットへのアクセスを提供できますこれを行うには、aws_s3.table_import_from_s3 関数呼び出しで credentials パラメータを使用します。

credentials パラメータは、型の構造体 aws_commons._aws_credentials_1 で、AWS 認証情報を含みます。aws_commons.create_aws_credentials 関数を使用して、aws_commons._aws_credentials_1 構造でアクセスキーおよびシークレットキーを設定します。以下に例を示します。

psql=> SELECT aws_commons.create_aws_credentials( 'sample_access_key', 'sample_secret_key', '') AS creds \gset

aws_commons._aws_credentials_1 構造を作成したら、以下に示すように、aws_s3.table_import_from_s3 関数を credentials パラメータと共に使用してデータをインポートします。

psql=> SELECT aws_s3.table_import_from_s3( 't', '', '(format csv)', :'s3_uri', :'creds' );

または、aws_commons.create_aws_credentials 関数の呼び出しのインラインを aws_s3.table_import_from_s3 関数の呼び出し内に含めることもできます。

psql=> SELECT aws_s3.table_import_from_s3( 't', '', '(format csv)', :'s3_uri', aws_commons.create_aws_credentials('sample_access_key', 'sample_secret_key', '') );

Amazon S3 へのアクセスのトラブルシューティング

Amazon S3 ファイルデータをインポートしようとしたときに接続の問題が発生した場合は、次の推奨事項を参照してください。

aws_s3.table_import_from_s3 関数を使用して Amazon S3 データをインポートする

aws_s3.table_import_from_s3 関数を呼び出して Amazon S3 データをインポートします。

注記

以下の例では、IAM ロールメソッドを使用して、Amazon S3 バケットへのアクセス権を付与します。このように、aws_s3.table_import_from_s3 関数の呼び出しに認証情報パラメータはありません。

psql を使用した従来の PostgreSQL の例を以下に示します。

psql=> SELECT aws_s3.table_import_from_s3( 't1', '', '(format csv)', :'s3_uri' );

パラメータは次のとおりです。

  • t1 – データのコピー先となる PostgreSQL DB インスタンス内のテーブルの名前。

  • '' – データベーステーブル内の列のオプションのリスト。S3 データをコピーする列とテーブル列を指定するには、このパラメータを使用します。列を指定しない場合は、すべての列がテーブルにコピーされます。列のリストの使用例については、カスタム区切り文字を使用する Amazon S3 ファイルをインポートする を参照してください。

  • (format csv) – PostgreSQL COPY 引数。このコピープロセスでは、PostgreSQL COPY コマンドの引数と形式を使用します。前述の例では、COPY コマンドは、カンマ区切り値 (CSV) ファイル形式を使用してデータをコピーします。

  • s3_uri – Amazon S3 ファイルを識別する情報を含む構造。aws_commons.create_s3_uri 関数を使用して s3_uri 構造を作成する例については、「Amazon S3 データのインポートの概要」を参照してください。

この関数の完全なリファレンスについては、aws_s3.table_import_from_s3 を参照してください。

以下の例は、Amazon S3 データのインポート時にさまざまな種類のファイルを指定する方法を示します。

カスタム区切り文字を使用する Amazon S3 ファイルをインポートする

以下の例では、カスタム区切り文字を使用するファイルのインポート方法を示します。また、aws_s3.table_import_from_s3 関数の column_list パラメータを使用して、データベースのデータを置く場所を制御する方法を示します。

この例では、次の情報が Amazon S3 ファイル内のパイプ区切りの列に編成されているとします。

1|foo1|bar1|elephant1 2|foo2|bar2|elephant2 3|foo3|bar3|elephant3 4|foo4|bar4|elephant4 ...

カスタム区切り文字を使用するファイルをインポートするには

  1. インポートされたデータのテーブルをデータベースに作成します。

    psql=> CREATE TABLE test (a text, b text, c text, d text, e text); CREATE TABLE
  2. データを Amazon S3 からインポートするには、次の形式の aws_s3.table_import_from_s3 関数を使用します。

    または、aws_commons.create_s3_uri 関数の呼び出しのインラインを aws_s3.table_import_from_s3 関数の呼び出し内に含めて、ファイルを指定することもできます。

    psql=> SELECT aws_s3.table_import_from_s3( 'test', 'a,b,d,e', 'DELIMITER ''|''', aws_commons.create_s3_uri('sampleBucket', 'pipeDelimitedSampleFile', 'us-east-2') );

データが、次の列のテーブル内に入りました。

psql=> SELECT * FROM test; a | b | c | d | e ---+------+---+---+------+----------- 1 | foo1 | | bar1 | elephant1 2 | foo2 | | bar2 | elephant2 3 | foo3 | | bar3 | elephant3 4 | foo4 | | bar4 | elephant4

Amazon S3 圧縮 (gzip) ファイルをインポートする

以下の例では、gzip で圧縮されているファイルを Amazon S3 からインポートする方法を示します。

ファイルに次の Amazon S3 メタデータが含まれていることを確認します。

  • キー: Content-Encoding

  • 値: gzip

これらの値を Amazon S3 メタデータに追加する詳細については、Amazon Simple Storage Service コンソールユーザーガイド の「S3 オブジェクトにメタデータを追加する方法」を参照してください。

以下に示されているように、gzip ファイルを RDS for PostgreSQL DB インスタンスにインポートします。

psql=> CREATE TABLE test_gzip(id int, a text, b text, c text, d text); CREATE TABLE psql=> SELECT aws_s3.table_import_from_s3( 'test_gzip', '', '(format csv)', 'myS3Bucket', 'test-data.gz', 'us-east-2' );

エンコードされた Amazon S3 ファイルをインポートする

以下の例では、Windows-1252 でエンコードされているファイルを Amazon S3 からインポートする方法を示します。

psql=> SELECT aws_s3.table_import_from_s3( 'test_table', '', 'encoding ''WIN1252''', aws_commons.create_s3_uri('sampleBucket', 'SampleFile', 'us-east-2') );

関数リファレンス

aws_s3.table_import_from_s3

Amazon S3 データを Amazon RDS テーブルにインポートします。aws_s3 拡張機能には、aws_s3.table_import_from_s3 関数が含まれます。

3 つの必須のパラメータは、table_namecolumn_listoptions です。これらのパラメータを使用して、データベースを特定し、データをテーブルにコピーする方法を指定します。

また、以下のパラメータを使用することもできます。

  • s3_info パラメータは、インポートする Amazon S3 ファイルを指定します。このパラメータを使用する場合、PostgreSQL DB インスタンスの IAM ロールを使用して、Amazon S3 へのアクセス権を付与します。

    aws_s3.table_import_from_s3 ( table_name text, column_list text, options text, s3_info aws_commons._s3_uri_1 )
  • credentials パラメータは、Amazon S3 にアクセスするための認証情報を指定します。このパラメータを使用する場合、IAM ロールは使用しません。

    aws_s3.table_import_from_s3 ( table_name text, column_list text, options text, s3_info aws_commons._s3_uri_1, credentials aws_commons._aws_credentials_1 )

aws_s3.table_import_from_s3 パラメータを次の表に示します。

パラメータ 説明
table_name データのインポート先となる PostgreSQL データベーステーブルの名前を含む必須のテキスト文字列。
column_list

データをコピーする PostgreSQL データベーステーブル列のオプションリストを含む必須のテキスト文字列。文字列が空の場合、テーブルの列がすべて使用されます。例については、「カスタム区切り文字を使用する Amazon S3 ファイルをインポートする」を参照してください。

options

PostgreSQL COPY コマンドの引数を含む必須のテキスト文字列。これらの引数は PostgreSQL のテーブルにデータをコピーする方法を指定します。詳細については、「PostgreSQL COPY ドキュメント」を参照してください。

s3_info

S3 オブジェクトに関する以下の情報を含む aws_commons._s3_uri_1 複合型。

  • bucket – ファイルを含む Amazon S3 バケット名。

  • file_path – ファイルの Amazon S3 パス。

  • region – ファイルがある AWS リージョン。AWS リージョン名と関連するリージョン値のリストについては、リージョンとアベイラビリティーゾーン を参照してください。

aws_commons._s3_uri_1 複合型構造を作成するには、aws_commons.create_s3_uri を参照してください。

credentials

インポートオペレーションに使用する次の認証情報を含む aws_commons._aws_credentials_1 複合型。

  • アクセスキー

  • シークレットキー

  • セッショントークン

aws_commons._aws_credentials_1 複合型構造を作成するには、aws_commons.create_aws_credentials を参照してください。

代替パラメータ

テストしやすいように、s3_info パラメータや credentials パラメータではなく、拡張されたパラメータセットを使用することができます。以下は、aws_s3.table_import_from_s3 関数の構文のバリエーションです。

  • Amazon S3 ファイルを識別するために s3_info パラメータを使用する代わりに、bucketfile_path、および region パラメータの組み合わせを使用します。この関数の形式を使用する場合は、PostgreSQL DB インスタンスの IAM ロールを使用して、Amazon S3 へのアクセス権を付与します。

    aws_s3.table_import_from_s3 ( table_name text, column_list text, options text, bucket text, file_path text, region text )
  • Amazon S3 アクセスを指定するために credentials パラメータを使用する代わりに、access_keysession_key、および session_token パラメータの組み合わせを使用します。

    aws_s3.table_import_from_s3 ( table_name text, column_list text, options text, bucket text, file_path text, region text, access_key text, secret_key text, session_token text )

これらの代替パラメータについて次の表で説明します。

パラメータ 説明
bucket

ファイルを含む Amazon S3 バケットの名前を含むテキスト文字列。

file_path

ファイルの Amazon S3 パスを含むテキスト文字列。

region ファイルがある AWS リージョンを含むテキスト文字列。AWS リージョン名と関連する値のリストについては、リージョンとアベイラビリティーゾーン を参照してください。
access_key インポートオペレーションに使用するアクセスキーを含むテキスト文字列。デフォルトは NULL です。
secret_key インポートオペレーションに使用するシークレットキーを含むテキスト文字列。デフォルトは NULL です。
session_token (オプション) インポートオペレーションに使用するセッションキーを含むテキスト文字列。デフォルトは NULL です。

aws_commons.create_s3_uri

Amazon S3 ファイル情報を保持するように、aws_commons._s3_uri_1 構造を作成します。aws_commons.create_s3_uri 関数の結果は、aws_s3.table_import_from_s3 関数の s3_info パラメータで使用します。関数の構文は次のとおりです。

aws_commons.create_s3_uri( bucket text, file_path text, region text )

aws_commons.create_s3_uri 関数のパラメータを以下の表で説明します。

パラメータ 説明
bucket

ファイルの Amazon S3 バケット名を含む必須のテキスト文字列。

file_path

ファイルの Amazon S3 パスを含む必須のテキスト文字列。

region

ファイルがある AWS リージョンを含む必須のテキスト文字列。AWS リージョン名と関連するリージョン値のリストについては、リージョンとアベイラビリティーゾーン を参照してください。

aws_commons.create_aws_credentials

aws_commons._aws_credentials_1 構造でアクセスキーとシークレットキーを設定します。aws_commons.create_aws_credentials 関数の結果は、aws_s3.table_import_from_s3 関数の credentials パラメータで使用します。関数の構文は次のとおりです。

aws_commons.create_aws_credentials( access_key text, secret_key text, session_token text )

aws_commons.create_aws_credentials 関数のパラメータは以下の表で説明します。

パラメータ 説明
access_key

Amazon S3 ファイルのインポートに使用するアクセスキーを含む必須のテキスト文字列。デフォルトは NULL です。

secret_key Amazon S3 ファイルのインポートに使用するシークレットキーを含む必須のテキスト文字列。デフォルトは NULL です。
session_token Amazon S3 ファイルのインポートに使用するセッショントークンを含む必須のテキスト文字列。デフォルトは NULL です。オプションの session_token を指定した場合は、一時的な認証情報を使用することができます。

および DB インスタンス 間での PostgreSQL データベースの移行

Amazon RDS に対する PostgreSQL トランスポータブルデータベースを使用することで、2 つの DB インスタンス間で PostgreSQL データベースを移行できます。この方法で、別々の DB インスタンス間で大規模なデータベースを高速で移行させることが可能になります。この方法を使って、データベースを移行するには、両方の DB インスタンスが PostgreSQL の同じ主要バージョンを実行する必要があります。

トランスポータブルデータベースを使うには、pg_transport 拡張機能をインストールします。この拡張機能は、物理的な移行メカニズムで各データベースを移行させます。最小限のプロセスでデータベースファイルをストリーミングすることで、物理的な移行は、従来のダンプおよびロードプロセスよりもはるかに早くデータを移動でき、ダウンタイムを最小限に抑えます。PostgreSQL トランスポータブルデータベースは、移行先 DB インスタンスが移行元 DB インスタンスからデータベースをインポートするプルモデルを使用します。

注記

PostgreSQL トランスポータブルデータベースは、10.10 およびそれ以降および 11.5 かそれ以降のバージョンの PostgreSQL 向けの RDS で利用可能です。

PostgreSQL トランスポータブルデータベースの使用制約

トランスポータブルデータベースには以下の制限があります。

  • リードレプリカ – リードレプリカまたはリードレプリカの親インスタンスでは、トランスポータブルデータベースを使用できません。

  • 未対応のコラムタイプ –この方法を使い移行する全てのデータベーステーブル内の reg データタイプは使用不可です。これらタイプは、システムカタログオブジェクト ID (OID) に依存し、移行中に変わることがあります。

  • テーブルスペース –すべてのソースデータベースオブジェクトは既定の pg_default テーブルスペースに既存しなければいけません。

  • 互換性 – 移行先および移行元両方の DB インスタンスは、PostgreSQL の同じ主要バージョンを実行しなければなりません。

    移行を開始する前に、transport.import_from_server 機能が移行先/元の DB インスタンスを比較し、データベースの互換性を確認します。これは、PostgreSQL 主要バージョンの互換性も確認します。また、この機能は、移行先 DB インスタンスが、移行元 DB を受け入れるのに十分なスペースがあるかどうかを確認します。この機能には、移行を滞りなく完了させるためのその他確認も含まれています。

  • 拡張機能 – 移行中に、移行元 DB インスタンスにインストールできる唯一の拡張機能は pg_transport です。

  • ロールおよび ACL – 移行元データベースのアクセス権限および所有権情報は、移行先データベースには移行されません。すべてのデータベースオブジェクトは、移行するローカルの移行先ユーザーが作成および所有します。

  • 同時移行 – DB インスタンスでは、インポートおよびエクスポートを含み、最大 32 の移行を同時に実行することが可能です。各移行に使用するワーカープロセスを定義するには、pg_transport.work_mem および pg_transport.num_workers のパラメータを使用します。同時移行に対応するため、max_worker_processes のパラメータをかなり増やさなければならない場合があります。詳細については、「 pg_transport 拡張機能に対する設定パラメータ」を参照してください。

PostgreSQL データベース移行の設定

DB インスタンス間で、PostgreSQL データベースを移行には、以下の手順を実行します。

PostgreSQL データベース移行の設定

  1. 移行元 DB インスタンスのセキュリティグループが、移行先 DB インスタンスからのインバウンドトラフィックを許可していることを確認してください。これは、移行先 DB インスタンスが、移行元 DB インスタンスへのインポートコールを使用してデータベース移行を開始するためです。セキュリティグループの使用方法については、「セキュリティグループによるアクセスの制御」を参照してください。

  2. 移行先/元 DB インスタンスの両方に関して、各パラメータグループの shared_preload_libraries パラメータに pg_transport を追加します。shared_preload_libraries パラメータは静的であるため、変更を有効にするには、データベースを再起動する必要があります。パラメータグループの詳細については、「DB パラメータグループを使用する」を参照してください。

  3. 移行先/元 DB インスタンスの両方に対して、必要な pg_transport PostgreSQL 拡張機能をインストールしてください。

    インストールするには、各 DB インスタンスで rds_superuser のロールであるユーザーが、psql を開始し、次のコマンドを実行する必要アあります。

    psql=> CREATE EXTENSION pg_transport;

transport.import_from_server 関数を使った PostgreSQL データベースの移行

PostgreSQL データベース移行の設定 で記載したプロセスを完了すると、移行を開始することが可能です。移行を開始するには、移行先 DB インスタンスで transport.import_from_server 関数を実行します。

注記

移行への移行先ユーザーおよび接続する移行元ユーザーは、rds_superuser ロールのメンバーでなければなりません。

移行先 DB インスタンスには、まだ移行される移行元データベースと同じ名前のデータベースを含めることはできません。含めた場合移行は失敗します。

移行の例を以下に示します。

SELECT transport.import_from_server( 'source-db-instance-endpoint', source-db-instance-port, 'source-db-instance-user', 'source-user-password', 'source-database-name', 'destination-user-password', false);

この関数には、データベースユーザーパスワードを入力する必要があります。よって、移行完了後は、使用したユーザーロールのパスワードを変更することをお勧めします。または、SQL のバインド変数を使用するとユーザーロールを一時的に作成することができます。このような一時ロールを移行に使ったら、破棄することが可能です。

transport.import_from_server の関数やそのパラメータの詳細に関しては、 transport.import_from_server 関数リファレンス をご参照ください。

データベースの移行中に何が起こるか

transport.import_from_server 関数を使うと、移行先 DB インスタンスで移行中のデータベースが作成されます。移行中、移行中のデータベースは、移行先 DB インスタンスではアクセスすることはできません。

移行開始の際は、移行元データベースのすべての現在のセッションが終了します。移行元 DB インスタンスの移行元データベース以外のすべてのデータベースには移行による影響はありません。

移行元データベースは、特別な読み取り専用モードとなります。このモードの最中は、移行元データベースにアクセス可能で、読み取り専用のクエリを実行できます。ですが、書き込み可能なクエリやその他の種類のコマンドはブロックされます。移行された特定の移行元データベースのみがこれら制限による影響を受けます。

移行中、移行元 DB インスタンスは、ポイントインタイムの復元はできません。これは、移行がトランザクションではなく、変更を記録するための PostgreSQL ログ先行書き込みを使用しないからです。移行先 DB インスタンスの自動バックアップが有効になっていれば、移行後に、バックアップが自動で実行されます。ポイントインタイムの復元は、バックアップの終了後に可能です。

移行に失敗した場合、pg_transport の拡張機能が、移行先/元 DB インスタンスで行ったすべての変更をやり直します。これには、移行先で一部のみ移行されたデータベースの削除も含まれます。失敗の内容によっては、移行元データベースで引き続き、書き込み可能クエリが拒否されます。これが発生した場合、以下のコマンドを使い、書き込み可能クエリを許可します。

ALTER DATABASE my-database SET default_transaction_read_only = false;

transport.import_from_server 関数リファレンス

transport.import_from_server 関数は、PostgreSQL データベースを移行元 DB インスタンスから移行先 DB インスタンスにインポートします。これは、物理的なデータベース接続移行メカニズムを使って実行されます。

[構文]

transport.import_from_server( host text, port int, username text, password text, database text, local_password text, dry_run bool )

戻り値

なし。

パラメータ

transport.import_from_server 関数パラメータの説明に関しては、以下のテーブルをご参照ください。

パラメータ 説明
host

移行元 DB インスタンスのエンドポイント。

port 整数は、移行元 DB インスタンスを表しています。

PostgreSQL DB インスタンスは、通常ポート 5432 を使います。

username

移行元 DB インスタンスのユーザー。このユーザーは、rds_superuser ロールのメンバーでなければなりません。

password

移行元 DB インスタンスのユーザーパスワード。

database

移行する移行元 DB インスタンスのデータベース名。

local_password

移行先 DB インスタンスの現在のユーザーのローカルパスワード。このユーザーは、rds_superuser ロールのメンバーでなければなりません。

dry_run

リハーサルを実施するかどうかを判断する任意のブール値。デフォルトは、false で、移行を実行することを意味します。

実際に移行せずに、移行元と移行先 DB インスタンスの互換性を確認するには、dry_runtrue に設定します。

例については、「 transport.import_from_server 関数を使った PostgreSQL データベースの移行」を参照してください。

pg_transport 拡張機能に対する設定パラメータ

以下のパラメータを使用して、pg_transport 拡張機能を設定します。

SET pg_transport.num_workers = integer; SET pg_transport.work_mem = kilobytes; SET pg_transport.timing = Boolean;

これらのパラメータの説明に関しては、以下のテーブルを参照してください。

パラメータ 説明
pg_transport.num_workers

物理的な移行に対するワーカー数。デフォルト: 3。有効な値は、1–32 です。通常、大規模の移行でも 8 人未満のワーカーで最大スループットに達します。

移行中、移行先 DB インスタンスの pg_transport.num_workers 設定が、移行先および移行元 DB インスタンスで使用されます。

関連パラメーターは、PostgreSQL max_worker_processes パラメータです。移行プロセスでは、いくつかのバックグラウンドワーカープロセスが作成されます。このため、pg_transport.num_workers のパラメータへの設定では、移行元 DB インスタンスと移行先 DB インスタンスの両方で max_worker_processes パラメータを大幅に高くする必要があります。

移行元 DB インスタンスと移行先 DB インスタンスの両方でmax_worker_processesを、移行先 DB インスタンスのpg_transport.num_workers パラメータ設定の 3 倍に設定することをお勧めします。非移行バックグラウンドワーカープロセスを提供するために、さらにいくつか追加します。

max_worker_processes パラメータの詳細に関しては、PostgreSQL ドキュメントの 非同期動作を参照してください。

pg_transport.timing

移行中にタイミング情報を報告するかどうかを指定するブール値。デフォルト: true。タイミング情報を報告するための有効な値は、true で、タイミング情報の報告を無効化する値は、false です。

このパラメータを、false に設定することは推奨しません。pg_transport.timing を無効にすることで、移行進捗をトラックする機能が大幅に低下します。

pg_transport.work_mem

メモリの最大容量を各ワーカーに配分する。デフォルトは、131,072 キロバイト (KB) です。最小値は 64 メガバイト (65,536 KB) です。2 進法ベースの 2 ユニット (1 KB = 1,024 バイト) なので、有効値は、キロバイト (KB) で表記されます。

移行は、このパラメータで指定されたメモリより少ないメモリを使う場合があります。大規模な移行でも、通常は各ワーカー当たり 256 MB (262,144 KB) 未満のメモリで最大スループットに達します。