S-JIS[2012-06-04/2012-06-05]
PostgreSQLのpg_bulkloadのメモ。
|
|
pg_bulkloadは、PostgreSQLの高速データロードユーティリティー。
PostgreSQLでは独自SQLのCOPY文でファイルからテーブルへデータをロードすることが出来るが、
pg_bulkloadはCOPY文より高速なロードが出来るらしい。
(OracleのSQL*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)
CentOS5(64bit)のPostgreSQL8.4へpg_bulkload2.4をインストールする方法。
# cd /tmp # wget http://pgfoundry.org/frs/download.php/2385/pg_bulkload-2.4.0-1.pg84.rhel5.x86_64.rpm
# rpm -ivh pg_bulkload-2.4.0-1.pg84.rhel5.x86_64.rpmpg_bulkloadコマンドは/usr/binに作られる。
$ psql -U hishidama -f /usr/share/pgsql/contrib/pg_bulkload.sql mydb
CentOS5(64bit)のPostgreSQL9.1へpg_bulkload3.1.1をインストールする方法。
# cd /tmp # wget http://pgfoundry.org/frs/download.php/3177/pg_bulkload-3.1.1-1.pg91.rhel5.x86_64.rpm
# rpm -ivh pg_bulkload-3.1.1-1.pg91.rhel5.x86_64.rpm
$ psql -U hishidama -f /usr/pgsql-9.1/share/contrib/pg_bulkload.sql mydb
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には無い新しいもの。
コントロールファイルに設定を書く方式もある。
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)