S-JIS[2012-06-04/2012-06-05]

PostgreSQL pg_bulkload

PostgreSQLのpg_bulkloadのメモ。


概要

pg_bulkloadは、PostgreSQLの高速データロードユーティリティー。

PostgreSQLでは独自SQLのCOPY文でファイルからテーブルへデータをロードすることが出来るが、
pg_bulkloadはCOPY文より高速なロードが出来るらしい。
OracleSQL*Loaderのようなもの)

pg_bulkloadのダウンロードサイトを見れば分かるが、pg_bulkloadが対応しているバージョンのPostgreSQLを使う必要がある。

pg_bulkloadのバージョン PostgreSQLのバージョン OSのバージョン
pg_bulkload 2.4 PostgreSQL8.2〜8.4 ReadHat EL 5 32bit・64bit
pg_bulkload 3.0〜3.0.2 PostgreSQL9.0 ReadHat EL 5〜6 64bit
pg_bulkload 3.1 PostgreSQL9.0 ReadHat EL 5〜6 64bit
pg_bulkload 3.1.1 PostgreSQL9.1 ReadHat EL 5〜6 64bit

例えば、32bit OSのPostgreSQL9.1では、pg_bulkloadをインストールできない。
例えば、PostgreSQL8.4が相手だと、pg_bulkload3.1.1はインストールできない。
(依存ライブラリーが見つからないというエラーが頻発するorz)


PostgreSQL8.4へのpg_bulkload2.4のインストール

CentOS5(64bit)のPostgreSQL8.4へpg_bulkload2.4をインストールする方法。

  1. pg_bulkloadのダウンロードページ(PgFoundry)からpg_bulkload2.4のrpmファイルをダウンロードする。
    (64bit OSならx86_64、32bit OSならi386のファイル)
    # cd /tmp
    # wget http://pgfoundry.org/frs/download.php/2385/pg_bulkload-2.4.0-1.pg84.rhel5.x86_64.rpm
  2. rpmファイルをインストールする。
    # rpm -ivh pg_bulkload-2.4.0-1.pg84.rhel5.x86_64.rpm
    pg_bulkloadコマンドは/usr/binに作られる。
  3. pg_bulkloadを使いたい対象のDBに、pg_bulkload関数を作っておく。(CREATE FUNCTION pg_bulkload)
    下記の例では、mydbというDBにhishidamaユーザーでpg_bulkload.sqlを実行している。
    $ psql -U hishidama -f /usr/share/pgsql/contrib/pg_bulkload.sql mydb

PostgreSQL9.1へのpg_bulkload3.1.1のインストール

CentOS5(64bit)のPostgreSQL9.1へpg_bulkload3.1.1をインストールする方法。

  1. pg_bulkloadのダウンロードページ(PgFoundry)からpg_bulkload3.1.1のrpmファイルをダウンロードする。
    # cd /tmp
    # wget http://pgfoundry.org/frs/download.php/3177/pg_bulkload-3.1.1-1.pg91.rhel5.x86_64.rpm
  2. rpmファイルをインストールする。
    # rpm -ivh pg_bulkload-3.1.1-1.pg91.rhel5.x86_64.rpm
  3. pg_bulkloadコマンドは/usr/pgsql-9.1/binに作られるので、このディレクトリーをPATHに追加しておく。
  4. pg_bulkloadを使いたい対象のDBに、pg_bulkload関数を作っておく。(CREATE FUNCTION pg_bulkload)
    下記の例では、mydbというDBにhishidamaユーザーでpg_bulkload.sqlを実行している。
    $ psql -U hishidama -f /usr/pgsql-9.1/share/contrib/pg_bulkload.sql mydb

pg_bulkload3.1の例

csvファイルにデータを書き、それをpg_bulkload 3.1でテーブルにロードする例。[2012-06-05]

$ pg_bulkload --host localhost --port 5432 --dbname mydb --username hishidama --input t1.csv --output table1

「--dbname」等の長い形式のオプションは、pg_bulkload2.4には無い新しいもの。


コントロールファイルに設定を書く方式もある。

t1.ctl:

TYPE=CSV
INFILE=t1.csv
TABLE=table1
$ pg_bulkload --dbname mydb --username hishidama --host localhost --port 5432 t1.ctl

エラーの例

csvファイルにpostgresユーザー(PostgreSQLサーバーを実行しているユーザーだと思われる)の読み込み権限が無いとエラーになる。

NOTICE: BULK LOAD START
ERROR: query failed: ERROR: could not open "/home/hishidama/pg_bulkload/t1.csv" 許可がありません

以下の様なエラーが出る場合は、対象DBに対してpg_bulkload関数の作成がされていない。

NOTICE: BULK LOAD START
ERROR: query failed: ERROR: 関数pg_bulkload(unknown)は存在しません
行 1: SELECT * FROM pg_bulkload($1)
                    ^
HINT: 指定名称、指定引数型に合う関数がありません。明示的な型キャストが必要かもしれません
DETAIL: query was: SELECT * FROM pg_bulkload($1)

PostgreSQLへ戻る / 技術メモへ戻る
メールの送信先:ひしだま