如何在PostgreSQL中使用GNU parallel和GNU SQL与\ copy

时间:2013-03-01 20:44:10

标签: postgresql parallel-processing sqlbulkcopy

我想对PostgreSQL数据库进行批量加载,有几个文件并且非常大。我刚刚在Using GNU Parallel With split中了解了GNU ParallelGNU SQL,看起来很棒,有些人可以帮助我使用GNU ParallelGNU SQL\copyCOPY对PostgreSQL进行批量加载?

2 个答案:

答案 0 :(得分:1)

我只是使用pg_bulkload代替。它为您做到了,甚至更多。

答案 1 :(得分:1)

GNU parallel和pg_bulkload都很酷,但在大多数默认安装中都不可用。我认为这个任务可以通过'&'来实现。 (后台子shell)和shell脚本中的'wait',它同时调用多\ COPY操作。这是一个例子:

#!/bin/bash

PG_USER_NAME=bizusr
PG_DB_NAME=bizdb
BCP_DIR=/data/biz/bcp/input

do_bcp()
{
    TABLE_NAME=$1
    echo "`date` $$ copy $TABLE_NAME begin"
    psql -q -U $PG_USER_NAME -d $PG_DB_NAME << EOF
-- SET DATESTYLE TO 'ISO,YMD'; -- you may need this when dealing with timestamps
\COPY $TABLE_NAME FROM '${BCP_DIR}/${TABLE_NAME}.bcp' WITH (FORMAT CSV, DELIMITER '|');
EOF
    echo "`date` $$ copy $TABLE_NAME done"
}

echo "`date` $$ parallel copy started"
for BCP_FILE in `ls ${BCP_DIR}/*.bcp`; do
    TABLE_NAME=`echo $BCP_FILE|awk -F"/" '{print $NF}'|sed -e s/\.bcp$//`
    do_bcp $TABLE_NAME &
done

wait
echo "`date` $$ parallel copy finished"