pgsql_fdwは、外部のPostgreSQLサーバに対して検索を実行するための外部データラッパです。
pgsql_fdwを用いると、外部のPostgreSQLサーバにあるテーブルに対応する外部テーブルを作成できます。また、、その外部テーブルを用いた通常のSELECT文を実行することで、通常のテーブルと同様に外部データを扱うことができます。
PostgreSQL 9.1では外部テーブルは読み取り専用のため、pgsql_fdwで定義した外部テーブルに対する更新(INSERT/UPDATE/DELETE)はエラーとなり実行できません。
pgsql_fdwのインストール方法について説明します。
pgsql_fdwをソースコードからビルドするには、PostgreSQL 9.1 のソースツリーか、インストール済みのpgxsが必要です。
PostgreSQLのソースツリーを使用する場合は、PostgreSQL本体のconfigureおよびビルドを済ませてから、contrib配下にpgsql_fdwのソースを展開し、makeを実施します。
$ cd postgresql-9.1.x $ ./configure $ make $ cd contrib $ tar zxvf pgsql_fdw-1.0.0.tar.gz $ cd pgsql_fdw-1.0.0 $ make $ make install
pgxsを用いる場合は、USE_PGXS変数を設定してからビルドおよびインストールを実施します。
$ tar xzvf pgsql_fdw-1.0.0.tar.gz $ cd pgsql_fdw $ make USE_PGXS=1 $ su # make USE_PGXS=1 install
pgsql_fdwはPostgreSQL 9.1で導入されたエクステンション形式に対応しているため、psqlなどでCREATE EXTENSIONコマンドを実行することで、関数などの構成要素とともに自動的に外部データラッパが作成されます。従来のcontribモジュールのように手動でSQLスクリプトを実行する必要はありません。なお、この作業にはスーパーユーザ権限が必要です。
$ psql postgres=# CREATE EXTENSION pgsql_fdw; CREATE EXTENSION postgres=# \dew List of foreign-data wrappers Name | Owner | Handler | Validator -----------+----------+-------------------+--------------------- pgsql_fdw | postgres | pgsql_fdw_handler | pgsql_fdw_validator (1 row) postgres=#
pgsql_fdwを用いて外部のPostgreSQLサーバにあるテーブルを検索する手順について説明します。なお、接続情報はサンプルですので、実際の環境に合わせて適宜読み替えてください。
スーパーユーザ権限のあるユーザでCREATE SERVERコマンドを実行して、検索対象のデータベースに対応する外部サーバを作成します。外部サーバのオプションとして、ホスト名やポート番号、データベース名を指定します。
postgres=# CREATE SERVER remote_db FOREIGN DATA WRAPPER pgsql_fdw postgres-# OPTIONS (host 'hostname', port '5432', dbname 'remote'); CREATE SERVER postgres=#
スーパーユーザ権限のあるユーザでCREATE USER MAPPINGコマンドを実行して、ローカルユーザとリモートユーザをひもづけるユーザマッピングを作成します。ユーザマッピングのオプションとして、リモートユーザのユーザ名やパスワードを指定します。
postgres=# CREATE USER MAPPING FOR postgres SERVER remote_db postgres-# OPTIONS (user 'postgres', password 'secret'); CREATE USER MAPPING postgres=#
任意のローカルユーザが外部テーブルを検索しても良いケースでは、ローカルユーザ名の変わりにpublicを指定することで、ユーザマッピングを持たないローカルユーザ用のマッピングを作成することもできます。
postgres=# CREATE USER MAPPING FOR public SERVER remote_db postgres-# OPTIONS (user 'app_user', password 'secret'); CREATE USER MAPPING postgres=#
スーパーユーザ権限のあるユーザでCREATE FOREIGN TABLEコマンドを実行して、検索対象のリモートテーブルに対応する外部テーブルを作成します。基本的な構文はCREATE TABLE文と同じですが、列リストの後に外部サーバを指定する必要があります。また、外部テーブルのオプションとして、スキーマ名とテーブル名を指定できます。以下の例では、pgbenchで使用するpgbench_accountsを検索するためのテーブルを定義しています。
postgres=# CREATE FOREIGN TABLE remote_accounts ( postgres(# aid integer, postgres(# bid integer, postgres(# abalance integer, postgres(# filler char(84)) postgres(# SERVER remote_db postgres(# OPTIONS (nspname 'public', relname 'pgbench_accounts'); CREATE FOREIGN TABLE postgres=#
外部テーブルが作成できたら、外部テーブルを使った通常のSELECT文を実行するだけで外部テーブルからデータを取得できます。実行するSELECTに制限はありませんが、外部テーブルに対する更新はできません。
postgres=# SELECT aid, bid, abalance FROM remote_accounts WHERE aid = 1; aid | bid | abalance -----+-----+---------- 1 | 1 | 0 (1 row) postgres=#
外部テーブルを作成したユーザ以外にも検索を許可したい場合は、通常のテーブルと同様にGRANT文でアクセス権限を付与します。
リモートユーザのパスワードなどの接続情報が変更された場合は、該当するオプションを定義したオブジェクトに対してALTER文を実行して、オプションの値を設定します。以下の例ではリモートユーザのパスワードを変更しています。CREATE文と異なり、既存オプションの変更にはSET指定が必要になるので注意してください。
postgres=# ALTER USER MAPPING FOR postgres SERVER remote_db postgres-# OPTIONS (SET password 'more secret'); ALTER USER MAPPING postgres=#
pgsql_fdwでは、リモートデータベースに対して検索を実行するのに必要な情報をいくつかのオブジェクトに分割して設定します。無効なオプションを指定した場合はオプション設定時にエラーが発生しますが、必須項目が省略されていたり設定した値が誤っていた場合は、検索実行時にエラーが発生するので注意してください。
有効なオプションは以下のとおりです。接続オプションの意味はlibpqでの定義と同じですので、詳細は「データベース接続制御関数」を参照してください。なお、接続オプションを省略した場合、ローカルのPostgreSQLサーバを起動したユーザの環境設定に従いますのでご注意ください。
指定対象 オブジェクト | オプション名 | 接続 オプション | 説明 | デフォルト値 |
---|---|---|---|---|
外部サーバ | service | ○ | 追加のパラメータ用に使用されるサービス名です。 | なし |
connect_timeout | ○ | 接続用の最大待機時間(秒)で、0は無制限を意味します。 | 0(無制限) | |
dbname | ○ | 接続先データベース名です。 | なし | |
host | ○ | 接続先ホスト名です。 | なし | |
hostaddr | ○ | 接続先ホストのIPアドレスです。 | なし | |
port | ○ | 接続先ポート番号です。 | なし | |
options | ○ | 実行時にサーバに送信するコマンドラインオプションです。 | なし | |
application_name | ○ | リモートデータベースへの接続で使用するapplication_name設定パラメータの値です。"pgsql_fdw"となります。 | なし | |
requiressl | ○ | 1を設定するとリモートデータベースにSSL接続を要求します。 | 0(非SSLでも可) | |
sslmode | ○ | SSL接続に関する調停の仕方です。 | prefer | |
krbsrvname | ○ | Kerberos5またはGSSAPIの認証時に使われるKerberosサービス名です。 | なし | |
gsslib | ○ | GSSAPI認証で使用されるGSSライブラリです。Windows上のみで使用されます。 | なし | |
min_cursor_rows | 外部データベースから結果を取得する際にSQLレベルカーソル(DECLARE/FETCH)を用いる最小件数で、有効な値は0以上の整数です。0 に設定すると常に通常のSELECT文を用います。1以上に設定されていると、プランナーによる見積もりがこの件数以上の場合はSQLレベルカーソルを、この件数未満の場合は通常のSELECT文を用います。 | 1,000件 | ||
fetch_count | カーソルモードで一度にフェッチする件数で、有効な値は1以上の整数です。 | 1,000件 | ||
ユーザマッピング | user | ○ | リモートユーザのユーザ名です。 | なし |
password | ○ | リモートユーザのパスワードです。 | なし | |
外部テーブル | nspname | リモートデータベース上のテーブルのスキーマ名です。リモートとローカルでスキーマが異なる場合に使用します。 | 外部テーブルのスキーマ名 | |
relname | リモートデータベース上のテーブルのテーブル名です。リモートとローカルでテーブル名が異なる場合に使用します。 | 外部テーブルのテーブル名 | ||
min_cursor_rows | 外部サーバの同名オプションと同じ意味で、両方に設定した場合は外部テーブルの設定値が優先されます。 | 1,000件 | ||
fetch_count | 外部サーバの同名オプションと同じ意味で、両方に設定した場合は外部テーブルの設定値が優先されます。 | 1,000件 |
pgsql_fdwをアンインストールするには、DROP EXTENSION文を実行します。pgsql_fdwに関連するオブジェクトが存在する場合は、先にそれらを削除しておくか、CASCADEオプションが必要です。
以下の例では一つの外部サーバとユーザマッピング、四つの外部テーブルをまとめて削除しています。
postgres=# drop EXTENSION pgsql_fdw CASCADE; NOTICE: drop cascades to 6 other objects DETAIL: drop cascades to server remote_db drop cascades to user mapping for public drop cascades to foreign table remote_accounts drop cascades to foreign table remote_branches drop cascades to foreign table remote_tellers drop cascades to foreign table remote_history DROP EXTENSION postgres=#
pgsql_fdwを使用する際には、以下の使用上の注意と制約があります。
より高度な利用方法や、内部構成について説明します。
pgsql_fdwでは、リモートデータベースに接続する際にclient_encodingとしてローカルのデータベースエンコーディングを使用します。これにより、コンバージョンが定義されていれば、エンコーディングの異なるデータベースからでもデータを取得することができます。また、内部でfallback_application_nameを「pgsql_fdw」に設定します。これにより、リモートデータベースのpg_stat_activityやサーバログで接続元がpgsql_fdwであることを確認できます。
pgsql_fdwでは、バリデータ関数として pgsql_fdw_validatorを、ハンドラ関数としてpgsql_fdw_handler関数をそれぞれ定義します。これらはCREATE EXTENSION文で自動的に作成されます。
pgsql_fdwでは、同一のローカルクエリ内で同じ外部サーバの外部テーブルを複数使用した場合、一つの接続で全ての外部テーブルスキャンを実行します。また、クエリ途中で何らかのエラーが発生した場合、この接続は自動的に切断されます。
Copyright (c) 2011, NIPPON TELEGRAPH AND TELEPHONE CORPORATION