メニュー
Amazon Relational Database Service
ユーザーガイド (API Version 2014-10-31)

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

既存の PostgreSQL デプロイメントを Amazon RDS に移行する必要がある場合、タスクの複雑さは、転送するデータベースのサイズとデータベースオブジェクトのタイプによって異なります。たとえば、ストアドプロシージャとトリガーがあり、数ギガバイトのデータセットを格納しているデータベースは、トリガーとストアドプロシージャがなく、数メガバイト程度のテストデータしか格納していない単純なデータベースよりも複雑になります。

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

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

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

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

他のほとんどの場合、AWS Database Migration Service (AWS DMS) を使用してデータベースを移行するのが最善の手法です。AWS DMS はダウンタイムなしでデータベースを移行でき、多くのデータベースエンジンに対して、ターゲットデータベースに切り替える準備ができるまで、進行中のレプリケーションを続行できます。AWS DMS を使用して、同じデータベースエンジンまたは異なるデータベースエンジンに移行できます。ソースデータベースとは別のデータベースエンジンへ移行する場合は、AWS Schema Conversion Tool を使用して、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 ログの競合が少なくなります。PostsgreSQL バージョン 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 というダンプファイルを作成しています。

Copy
prompt>pg_dump dbname=mydb2 -f mydb2dump.sql

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

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

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

Copy
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 の場合:

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

Windows の場合:

Copy
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 スナップショットの作成」を参照してください。

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

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

注記

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

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

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

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

Linux、OS X、Unix の場合:

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

Windows の場合:

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