Postgres复制查询连接丢失错误。

3

我正在尝试使用以下命令将大约2亿行(3.5GB)的数据批量加载到Amazon RDS postgresql数据库中:

cat data.csv | psql -h<host>.rds.amazonaws.com -U<user> <db> -c "COPY table FROM STDIN  DELIMITER AS ','"

几分钟后,我收到了以下错误信息:
connection not open
connection to server was lost

如果我运行head -n 100000000 data.csv只发送前1亿行而不是全部的2亿行,那么命令就会成功。我猜测在使用完整数据集进行查询时,某处存在超时导致失败。但是我找不到任何超时设置或参数。

如何使批量插入成功处理完整数据集呢?


尝试过这些方法吗?http://stackoverflow.com/questions/3602976/bulk-loading-into-postgresql-from-a-remote-client - Denis de Bernardy
这几乎就是我正在做的事情,但对于完整的数据集来说,它超时了。 - Ben Dowling
1
它们相似,但并不完全相同。就我所看到的语句而言,它基本上是创建一个巨大的字符串,然后连接到SQL,接着试图将整个字符串作为参数传递。如果您加载psql并运行类似于\copy ...from '/path/to/data.csv'...这样的命令,我想连接可能会保持活动状态,同时文件内容会被分块流式传输。虽然这只是我的猜测,但我认为这可能是为什么10M行的数据可以正常工作(即在连接超时之前成功推送所有参数),但整个文件无法工作(即参数上传仍在进行中)的原因。 - Denis de Bernardy
哦,我忽略了那个。你说得对极了。文档在这里http://www.postgresql.org/docs/9.2/static/app-psql.html#APP-PSQL-META-COMMANDS-COPY。那确实解决了问题!想把它写成答案并获得积分吗? - Ben Dowling
发布为答案。 - Denis de Bernardy
1个回答

3
当我阅读您使用的语句时,它基本上创建了一个巨大的字符串,然后连接到SQL,然后尝试将整个字符串作为参数传递。如果您加载psql并运行类似于\copy ... from '/path/to/data.csv'这样的命令,我想连接可能会保持活动状态,同时文件内容会一块一块地流式传输。这就是我认为为什么10M行有效(在连接超时之前完全推送了参数),但整个文件无效(参数仍在上传)的原因。

是的,使用 \copy psql 命令替代 COPY 语句解决了超时问题。谢谢! - Ben Dowling

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接