在大型表上重置PostgreSQL连接

在大型表上重置PostgreSQL连接,postgresql,Postgresql,我有一个很大的PostgreSQL表——280万行;2345MB大小;49列,主要是短VARCHAR字段,但有一个大json字段 它运行在一个带有4GB内存的Ubuntu12.04虚拟机上 当我尝试对此表执行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 ST

我有一个很大的PostgreSQL表——280万行;2345MB大小;49列,主要是短VARCHAR字段,但有一个大json字段

它运行在一个带有4GB内存的Ubuntu12.04虚拟机上

当我尝试对此表执行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

服务器日志中的这些消息只意味着客户端意外地离开了。在这种情况下,它可能死于内存不足错误


默认情况下,psql会在显示任何内容之前将整个结果加载到内存中。这样,它可以最好地决定如何格式化数据。您可以通过设置FETCH_COUNT来改变这种行为。我看到了一个类似的问题,但是,我遇到的问题不在客户端,而很可能在postgres驱动程序端。该查询需要获取大量行,因此,postgres驱动程序可能需要临时内存峰值。结果,我用来获取记录的游标关闭了,我得到了完全相同的日志


如果有人验证了这一点,我会非常高兴。如果可能的话,我可以肯定的是,客户端没有任何问题。

这是客户端问题。客户端和服务器之间的网络的性质是什么?我强烈怀疑你的MTU有问题,也许MTU发现路径有问题?或者,过度热心的IDS或有状态的数据包检查防火墙?或者,客户端应用程序可能正在消亡:当你说你的连接“终止”时,你的确切意思是什么?显示输出吗?我正在将文件发送到一个本地的vagrant框中,然后使用sudo-u postgres psql命令连接到postgres。当我运行SELECT语句时,我将返回到终端。根本没有错误消息(只是上面我从postgres日志发布的内容)。我可以通过重新运行psql立即重新连接…,所以postgres仍然在运行,只是我的会话已经结束。嗨-这很有趣,所以如果整个表无法加载到内存中,psql会终止吗?我现在要和伯爵玩一玩,看看这是否管用。谢谢你的帮助。