Pivotal Knowledge Base

フォローする

Tip - あるデータベースやクラスターから異なるデータベースやクラスターへテーブルを複製する簡単な方法

目的

面倒なバックアップ・リストア作業を伴うことなく、クラスター間あるいはデータベース間でテーブルを移動するいくつかの簡単な方法を提供する。これは任意の開発者が、開発や他の異なるデータベース上でテストのため、大元のテーブルの複製版が必要な場合に大変有用である。

注意 : 本スクリプトは、運用環境で動作させる前に、テストクラスターで動作確認すること。

解決策

テーブルを別のデータベースに迅速に複製する必要がある場合は、以下のスクリプトを実行する。

pg_dump -t <スキーマ名.複製元テーブル名> -h <複製元ホスト名> <複製元データベース名> | psql -h <複製先ホスト名> -U <複製先ユーザー> -p <複製先ポート番号> <複製先データベース名>

注意: データベース全てを複製したい場合は、こちらの記事を参照されたい。

実例

上述のスクリプト例を理解するため、以下の簡単な例を実行してみるものとする。

  • 最初にデータベース・テーブルを作成、そちらにデータをロードし、複製元データベースを生成

-- 複製元データベースを生成

gpadmin=# create database d1;
CREATE DATABASE
Time: 8855.715 ms
gpadmin=# \c d1
You are now connected to database "d1" as user "gpadmin".

-- 複製するテーブルを生成し、それにデータをロードする

d1=# create table t1 as select * from pg_attribute;
NOTICE:  Table doesn't have 'DISTRIBUTED BY' clause -- Using column(s) named 'attrelid' as the Greenplum Database data distribution key for this table.
HINT:  The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew.
SELECT 2998
Time: 1705.794 ms

-- 複製先データベースを生成

d1=# create database d2;
CREATE DATABASE
Time: 10753.638 ms
d1=# \q
  • バックアップとデータロードを行うコマンドを同時に実行する。

以下のコマンドの通り、データのバックアップとロードを同時に行う。

gpadmin:Fullrack@mdw $ pg_dump -C -t t1 d1 | psql d2
Timing is on.
Pager usage is off.
SET
Time: 184.239 ms
SET
Time: 0.740 ms
SET
Time: 0.677 ms
SET
Time: 0.652 ms
SET
Time: 0.598 ms
SET
Time: 0.635 ms
SET
Time: 1.565 ms
SET
Time: 0.640 ms
SET
Time: 0.601 ms
CREATE TABLE
Time: 66.210 ms
ALTER TABLE
Time: 18.538 ms
Time: 1247.149 ms

要注意: ここでの例では、同一クラスター上の異なるデータベースにデータロードを行っているので、当初言及した多くのパラメーターは明示的に指定していない。異なるクラスター間で複製を実行したい場合は、psql が問題なく複製元ホストとデータベースに接続できるように、複製元において pg_hba.conf が正しい情報で更新されていることを確認したい。

  • クロス検証

以下のクロス検証にて、問題なくテーブルが複製先データベースにロードされたことが分かる。

gpadmin:Fullrack@mdw $ psql d2
Timing is on.
Pager usage is off.
psql (8.2.15)
Type "help" for help.
d2=# \d
             List of relations
 Schema | Name | Type  |  Owner  | Storage
--------+------+-------+---------+---------
 public | t1   | table | gpadmin | heap
(1 row)
d2=# select count(*) from t1;
 count
-------
  2998
(1 row)
Time: 82.246 ms

ヒント

  • 複製元テーブルに多くの権限設定が行われている場合は、pg_dump も複製先で同様の権限設定を行う。それらの権限設定を除外したい場合は、以下のようなコマンドを使用することで対応可能である。
pg_dump -t <スキーマ名.複製元テーブル名> -h <複製元ホスト名> <複製元データベース名> | egrep -v "GRANT|REVOKE" | psql -h <複製先ホスト名> -U <複製先ユーザー名> -p <複製先ポート番号> <複製先データベース名>
  • pg_dump に -a オプションを付与して、データのロードのみを行う。
pg_dump -a -t <スキーマ名.複製元テーブル名> -h <複製元ホスト名> <複製元データベース名> | psql -h <複製先ホスト名> -U <複製先ユーザー名> -p <複製先ポート番号> <複製先データベース名>
  • 上述のコマンドで使用可能な追加オプションについては、pg_dump のヘルプを参照のこと。
pg_dump --help

代替手段

データ量が非常に多い場合は、gptransfer ユーティリティーを確認したい。使用例はこちらを参照のこと。

同一の作業を行うため、psql も使用可能である。この場合、転送先に対象テーブルの DDL が存在することを確認すること。

psql -c "copy (select * from <転送元テーブル>) to stdout" <転送元データベース> | psql -c "copy <伝送先テーブル> from stdin" <転送先データベース>

関連記事

コメント

Powered by Zendesk