diff --git a/Makefile b/Makefile index db107ba..56fdd9d 100644 --- a/Makefile +++ b/Makefile @@ -12,7 +12,7 @@ endif endif ifdef USE_PGXS -PG_CONFIG = pg_config +PG_CONFIG ?= pg_config PGXS := $(shell $(PG_CONFIG) --pgxs) include $(PGXS) else diff --git a/bin/Makefile b/bin/Makefile index eb9a88f..bac63ac 100644 --- a/bin/Makefile +++ b/bin/Makefile @@ -21,7 +21,7 @@ endif endif ifdef USE_PGXS -PG_CONFIG = pg_config +PG_CONFIG ?= pg_config PGXS := $(shell $(PG_CONFIG) --pgxs) include $(PGXS) else diff --git a/docs/pg_bulkload-ja.html b/docs/pg_bulkload-ja.html index 740a4e5..a81df0d 100644 --- a/docs/pg_bulkload-ja.html +++ b/docs/pg_bulkload-ja.html @@ -471,8 +471,9 @@

フォーマット共通の設定項目

「WRITER=PARALLEL」と指定した場合は、MULTI_PROCESS は無視されます。 なお、ロード先のデータベースに対してパスワード認証を必要とする場合には .pgpass を設定しなければなりません。 詳細は使用上の注意と制約を参照して下さい。 -pg_bulkloadのMULTI_PROCESSやPARALLELを有効にして実行する場合、他のPostgreSQLバックエンドプロセスがテーブルスキーマを変更しないようにしてください。 -データを読み取るプロセスとデータを書き出すプロセスで見られるテーブルスキーマが異なり、問題が発生する可能性があります。 +リーダーおよびライターのバックエンドが対象テーブルをどのようにロックするか、 +および他セッションがスキーマを変更してはいけない条件については、 +パラレルモードにおけるテーブルロックを参照してください。 @@ -664,6 +665,36 @@

kill -9は使わない

パラレルロードで使用する場合

パラレルロードで使用する場合(MULTI_PROCESS=YES または WRITER=PARALLEL)、以下のことに注意しなければなりません:

+

+pg_bulkload は 2 つの PostgreSQL バックエンドを使います。 +リーダーバックエンドがメインの pg_bulkload() を実行し(入力の読み取り・パース・検証)、 +ライターバックエンドが libpq 経由で起動され、TYPE=TUPLE の pg_bulkload() でテーブルへのダイレクトライトを行います。 +

+

パラレルモードにおけるテーブルロック

+

+PostgreSQL 9.6 以降では、リーダーバックエンドが PostgreSQL のロックグループのリーダーとなり、 +対象テーブルに AccessShareLock を保持したまま動作します。 +ライターバックエンドはテーブルにロックを取得する前にそのロックグループに参加し、 +ダイレクトライトのために AccessExclusiveLock を取得します。 +両バックエンドが同一ロックグループに属するため、これらのロックは互いにブロックせず、 +ライターが動作している間もリーダーは共有ロックを解放しません。 +ロードが進行中はライターの AccessExclusiveLock により、 +他セッションが対象テーブルに対する DDL を実行することもブロックされます。 +そのため、リーダーとライターが一貫したテーブル定義を参照するために、 +対象テーブルについて他セッションにスキーマ変更を避けるよう特別に注意する必要は通常ありません。 +

+

+PostgreSQL 9.6 より前のバージョン向けにビルドした場合は、 +リーダーバックエンドがライターバックエンドが AccessExclusiveLock を取得する前に +AccessShareLock を解放します。その間に他セッションがテーブル定義を変更できるため、 +リーダーとライターで異なるテーブル定義を参照する可能性があります。 +ロード中は他セッションから対象テーブルに対する DDL などのスキーマ変更を行わないでください。 +

+

+PostgreSQL のバージョンにかかわらず、ロードが参照する他のオブジェクト +(例: FILTER 関数が参照する型やテーブル)の定義を、 +ロード中に変更しないでください。 +

認証における制約

MULTI_PROCESS=YESかつロード対象のデータベースにlocalhostから接続するのにパスワードが必要な場合、たとえパスワードを正しくプロンプトに入力しても、パスワード認証に失敗してしまいます。この問題を回避するには、以下のいずれかを設定してください。