PostgreSQL连接在大表上会被重置

4
"我有一张大型的PostgreSQL表格,它有280万行记录;大小为2345 MB;49个列,其中大部分是短VARCHAR字段,但也包含一个较大的json字段。它运行在一个Ubuntu 12.04虚拟机上,该虚拟机有4GB RAM。当我尝试对这个表格执行SELECT *操作时,我的psql连接被终止。查看错误日志,我只得到:"
2014-03-19 18:50:53 UTC LOG:  could not send data to client: Connection reset by peer
2014-03-19 18:50:53 UTC STATEMENT:  select * from all;
2014-03-19 18:50:53 UTC FATAL:  connection to client lost
2014-03-19 18:50:53 UTC STATEMENT:  select * from all;

为什么会发生这种情况?是否存在可以传输的最大数据量或其他限制,这在Postgres中是否可配置?
我们使用的系统要求只有一个大型宽表(我知道这不是理想的数据库结构)。Postgres能处理这样大小的表吗?还是我们会继续遇到问题?
谢谢任何帮助, Ben

客户端和服务器之间的网络性质是什么?我强烈怀疑你可能遇到了MTU问题,也许是有问题的路径MTU发现?或者是过于热衷于IDS或状态包检查防火墙?另外,客户端应用程序可能会出现故障:当你说你的连接被“终止”时,你具体指的是什么?能否展示一下输出结果? - Craig Ringer
我正在通过SSH连接到本地的vagrant box,然后使用sudo -u postgres psql命令连接到postgres。当我运行SELECT语句时,我被返回到终端。没有任何错误消息(只有我从postgres日志中发布的内容)。我可以通过重新运行psql ...立即重新连接,因此postgres仍在运行,只是我的会话已经结束了。 - Ben Scott
2个回答

5

服务器日志中的那些消息意味着客户端意外断开连接。在这种情况下,它可能因为内存不足而崩溃。

默认情况下,psql会将所有结果加载到内存中,然后再显示数据。这样它可以更好地决定如何格式化数据。您可以通过设置FETCH_COUNT来更改此行为。


嗨 - 这很有趣,所以如果整个表无法加载到内存中,psql会终止吗?我现在会尝试使用FETCH_COUNT,看看是否有效。感谢您的帮助。 - Ben Scott

1
我看到了一个类似的问题,但是我面临的问题可能不在客户端,而很可能在Postgres驱动程序方面。需要查询大量行,因此可能需要Postgres驱动程序暂时增加内存。结果,我正在使用的游标关闭了,我得到了完全相同的日志记录。
如果有人能验证这是否可能,我会非常感慕,但我确定客户端没有任何问题。

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