Pivotal Knowledge Base

フォローする

Tip - お互いに接続していないあるサーバーから他のサーバーへのテーブルデータの複製(gpfdist を使用)

目的

あるサーバーから他のサーバーへテーブルのデータコピーするにはどのようにすれば良いのか?

解決策

転送元サーバーにおいて

1. /data ファイルシステム配下かどこか使用可能な領域にディレクトリーを作成する。

cd /data
mkdir transfer_tables

2. 作成したディレクトリーに対して、"gpfdist" プロセスを開始する。

gpfdist -d /data/transfer_tables -p 8080 -l /tmp/gpfdist.log &

--"ps -ef|grep gpfdist" といったコマンドラインで gpfdist プロセスが開始したかどうかを確認する。出力結果が以下のようであれば良い。

[gpadmin@mdw ~]$ ps -ef|grep dist
gpadmin657610 May03 ?00:00:00 gpfdist -d /data/transfer_tables -p 8080 -l gpfdist.log
gpadmin1543993210 17:00 pts/100:00:00 grep dist

3. データベースに接続し、転送元テーブルそれぞれに対し "書き込み可能" な外部テーブルを作成する。-- ここでは、転送元テーブルは "move_me" とする。

gpadmin=# \d move_me
Table "public.move_me"
Column |Type| Modifiers
--------+-------------------+-----------
id| integer|
name| character varying |
Distributed by: (id)

-- 次に、以下のコマンドを使用して、move_me と同様な、書き込み可能な外部テーブル ext_of_move_me を作成する。

gpadmin=# CREATE WRITABLE EXTERNAL TABLE ext_of_move_me(like move_me) location ('gpfdist://mdw:8080/move_me.csv') format 'text';
NOTICE:Table doesn't have 'distributed by' clause, defaulting to distribution columns from LIKE table
CREATE EXTERNAL TABLE

-- 作成した外部テーブルに insert を行うことによって、フラットファイルにデータを転送する。

gpadmin=# insert into ext_of_move_me select * from move_me;
INSERT 0 1000

-- gpfdist 稼働中、事前に設定したディレクトリーにファイルが生成されていることが分かる。

ls -ltrh /data/transfer_tables

4. 上述の手順 3. にて、一度、コピーする必要がある全てのテーブルに対するフラットファイルを作成すると、転送元・転送先サーバー間でネットワーク接続がない場合、転送先マシンへファイルを転送するために外付けのハードディスク経由で行うことが可能となる。

転送先サーバーにおいて

5. 転送先のマシンに全てのフラットファイルをコピーした後(それらのフラットファイルを保持するだけの十分なディスク領域があることが前提)、(上述の手順 2. のように)gpfdist プロセスを実施する。ここでは、転送元と同じ箇所にファイルをコピーするものとする(異なる箇所にすることも可能だが、gpfdist コマンドにおいてディレクトリーを変更する必要がある)。

gpfdist -d /data/transfer_tables -p 8080 -l /tmp/gpfdist.log &

6. データベースに接続し、データをテーブルにロードするため「読み込み可能」な外部テーブルを生成する。ただし、それらの外部テーブルは転送元と同じ構造で生成する必要がある。すでに転送先テーブルがそのような構造であれば、それを使用する。

-- データベースに接続し、全てのカラム名を指定し、以下のように読み込み可能な外部テーブルを生成(転送先に、転送元と同一構造のテーブルがない場合)。

checkcat=# CREATE READABLE EXTERNAL TABLE ext_to_load_move_me(id int, name varchar) location ('gpfdist://mdw:8080/move_me.csv') FORMAT 'TEXT';
CREATE EXTERNAL TABLE
checkcat=#

注意: ここでは、"move_me.csv" という名前のファイルを使用しているが、他のテーブルに対しては別のファイル名でコピーするかもしれない。したがって、コマンドに対して適宜適切なファイル名を指定すること。

-- データをロードするテーブルを生成。

checkcat=# CREATE TABLE move_me(id INT, name VARCHAR);
NOTICE:Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'id' 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.
CREATE TABLE

-- 以下のコマンドを使用してデータを挿入。

checkcat=# insert into move_me select * from ext_to_load_move_me ;
INSERT 0 1000
checkcat=# select count(*) from move_me;
count
-------
1000
(1 row)

関連記事

コメント

Powered by Zendesk