psql: 服务器意外关闭了连接

64

我一直在尝试运行这个批处理文件,它会通过Postgre DB服务器运行两个不同的sql文件,如下所示:

set PGPASSWORD=blah
cls
@echo on
"C:\Progra~1\pgAdmin III\1.16\psql" -d [db name] -h [server name] -p 5432 -U postgres -f C:\query1.sql
"C:\Progra~1\pgAdmin III\1.16\psql" -d [db name] -h [server name] -p 5432 -U postgres -f C:\query2.sql

但问题在于,有时候我会在执行查询1或查询2的命令时遇到以下错误:

psql: server closed the connection unexpectedly 
This probably means the server terminated abnormally
before or while processing the request.

这种情况有时会发生,所以我不确定为什么会出现这种情况。是否有人能解释一下为什么会出现这种情况,以及是否有解决此问题的方法。谢谢!

更新:在尝试在实际的Postgre应用程序中打开远程服务器时,有时也会出现相同的错误:“发生错误:“服务器意外关闭连接。这可能意味着服务器在处理请求之前或期间异常终止。”

当我单击错误弹出窗口后,我还会得到这个Guru提示:

数据库编码 数据库VA-trac是使用SQL_ASCII编码创建的,用于存储数据。该编码仅针对7位字符定义;未定义带有第8位设置(非ASCII字符127-255)的字符的含义。因此,无法将数据转换为其他编码。 如果您正在数据库中存储非ASCII数据,则强烈建议您使用表示您本地字符集的适当数据库编码,以便在需要时从自动转换为不同的客户端编码中受益。如果您将非ASCII数据存储在SQL_ASCII数据库中,则可能会遇到写入或读取数据库时出现的奇怪字符,这是由于代码转换问题引起的。当使用不同的客户端程序和驱动程序访问数据库时,这可能会给您带来很多麻烦。 对于大多数安装而言,Unicode(UTF8)编码提供了最灵活的功能。

无论如何,服务器仍然会打开,此后我就能够访问数据库。


当您交互式登录(即不使用SQL脚本)时,是否会得到相同的效果?PostgreSQL的日志文件对终止的连接有何说法? - Ansgar Wiechers
1
PostgreSQL 版本是多少?如果使用 PostgreSQL 的 bin 目录中的 psql 而不是 PgAdmin-III 中打包的 psql,会发生什么?是否有任何涉及防火墙的情况? - Craig Ringer
请查看我上面的更新,我的版本是1.16.1。 - user974047
2
如果连接随机中断,我会怀疑是网络问题。另外,PostgreSQL服务器日志中有关于这些断开的连接的信息吗?而且Craig询问的是PostgreSQL版本,而不是PgAdmin版本。 - Ansgar Wiechers
事实证明,这是因为我的本地计算机和服务器之间的PostgreSQL版本不匹配,安装相同版本的PostgreSQL解决了问题。谢谢! - user974047
我曾经遇到过同样的问题,但当我尝试在Excel宏中使用ADO连接到数据库以运行查询并在Excel中填充记录集时。我运行了VACUUM/ANALYZE,重新运行了宏,然后记录集在不到5秒钟内填充完毕。 - jones-chris
14个回答

43

以下信息供参考:

如果PostgreSQL服务器在另一台机器上且未侦听外部接口,则也可能导致此错误。

要调试此特定问题,您可以按照以下步骤操作:

  • 查看您的postgresql.conf文件,sudo vim /etc/postgresql/9.3/main/postgresql.conf
  • 添加此行:listen_addresses = '*'
  • 重新启动服务 sudo /etc/init.d/postgresql restart

(注意,以上命令适用于Ubuntu。其他Linux发行版或操作系统可能具有不同的路径到这些文件)

注意:使用'*'来侦听地址将侦听所有接口。 如果您使用'0.0.0.0',则它将侦听所有IPv4,如果您使用'::',则它将侦听所有IPv6。

http://www.postgresql.org/docs/9.3/static/runtime-config-connection.html


3
在 https://hub.docker.com/_/postgres 上的官方 Docker 化镜像中,默认存在这一行 listen_addresses = '*' - Devy
10
我不理解这句话。如果连接从未建立,它怎么会被终止呢? - Michael Mior
对于64位的Windows系统,postgresql.conf文件位于C:\Program Files\PostgreSQL\<VERSION>\data路径下。 - Ivan Chau

29

原来问题是由于本地和服务器上的PostgreSQL版本不匹配,安装相同版本的PostgreSQL解决了问题。谢谢!


5
2020年8月。这仍然相关。 - t_sologub
1
我该如何将它们匹配在一起? - k_afr
仅举一个例子:pgAdmin 4.28无法连接到任何Postgres服务器12.4。如果您降级到pgAdmin 4.27,则可以连接到12.4。难以置信... - FireEmerald
3
你如何找出哪个pgAdmin版本可以连接到哪个postgres版本? - Huiting
我已经在我的电脑上安装了相同的版本,但问题仍然存在。 - gary
2022年10月仍然相关。对我来说,使用匹配的主要版本解决了问题。 - ryuzakyl

8
在我的情况下,是因为我在Windows的data文件夹中设置了pg_hba.conf中的IP配置错误。
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
host    all             all             192.168.1.0/24            md5

我错误地输入(复制粘贴 :-))了192.168.0.0而不是192.168.1.0。


1
对于64位Windows系统,pg_hba.conf文件位于C:\Program Files\PostgreSQL\VERSION\data\目录下。 - Ivan Chau
可能的错误信息:状态:08001 本地错误:101 消息:致命错误:没有针对主机“a.b.c.d”,用户“postgres”,数据库“template1”的pg_hba.conf条目,SSL关闭。 - Ivan Chau

7

在我的情况下,我通过使用ssh隧道来连接pgAdmin,并设置主机字段的IP地址,但是必须将其设置为localhost


5

5
在我的情况下,我正在使用PostgreSQL 9.2.24,解决方案如下(pg_hba.conf):
host    all             all             0.0.0.0/0            trust

对于远程连接,请使用信任。与上面提到的内容相结合。

listen_addresses = '*'

3
请注意,listen_addresses = '*' 不属于 pg_hba.conf,而是属于 postgresql.conf。默认情况下,listen_addresses 被设置为所有地址(*)。 - Devy
1
这绝对是我所需要的解决方案——在postgresql.conf中添加listen_addresses = '*'行之外,还需在pg_hba.conf中添加此行。 - bunkerdive
2
这并不安全,因此我不建议您在生产中使用它。这可能表明pg_hba.conf中确实存在网络允许问题需要解决。 - Robert Casey

1
如果你的Postgres一直在运行,突然出现了这个错误,我的问题只需重新启动Postgres服务或容器即可解决。

1
如果您正在使用Docker,请确保没有在其他服务中使用相同的端口,我的情况是我错误地同时为PostgreSQL和Redis使用了相同的端口。

1
在我的情况下,我试图通过pgAdmin4使用ssh隧道连接,在此之前需要在服务器的/etc/ssh/sshd_config中设置AllowTcpForwarding no。但实际上应该设置为AllowTcpForwarding yes

1
如果您通过SSH隧道连接,这可能意味着您在目标计算机上进行了错误的端口重定向,请检查跳板机上的sshd日志以查看是否存在此错误。

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