【问题标题】:psql: server closed the connection unexepectedlypsql:服务器意外关闭连接
【发布时间】:2013-04-10 19:09:53
【问题描述】:

我一直在尝试运行这个通过 Postgre DB Server 的批处理文件并运行两个不同的 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

但问题来了,有时我会在 query1 或 query2 的命令中收到以下错误:

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

这只是有时会发生,所以我不完全确定为什么会发生。有人可以解释为什么会这样,以及是否有解决此问题的方法。谢谢!

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

点击退出错误弹出窗口后,我也得到了这个 Guru Hint 的东西:

数据库编码 创建数据库 VA-trac 以使用 SQL_ASCII 编码存储数据。此编码仅针对 7 位字符定义;未定义第 8 位设置的字符(非 ASCII 字符 127-255)的含义。因此,服务器不可能将数据转换为其他编码。 如果您在数据库中存储非 ASCII 数据,强烈建议您使用代表您的语言环境字符集的正确数据库编码,以便在需要时从自动转换为不同的客户端编码中受益。如果您将非 ASCII 数据存储在 SQL_ASCII 数据库中,您可能会遇到由代码转换问题引起的写入或读取数据库的奇怪字符。当使用不同的客户端程序和驱动程序访问数据库时,这可能会让您非常头疼。 对于大多数安装,Unicode (UTF8) 编码将提供最灵活的功能。

无论如何,之后服务器仍然打开,我可以从那时起访问数据库。

【问题讨论】:

  • 交互式登录(即不使用 SQL 脚本)是否得到相同的效果? PostgreSQL 的日志文件对终止的连接有什么说明?
  • PostgreSQL 版本?如果您使用 PostgreSQL 的 bin 目录中的 psql 而不是 PgAdmin-III 中捆绑的一个,会发生什么?任何地方都涉及防火墙吗?
  • 查看我上面的更新,我的版本是1.16.1
  • 如果连接随机中止,我怀疑是网络问题。同样,PostgreSQL 服务器上的日志对这些终止的连接有什么看法? Craig 要求的是 PostgreSQL 版本,而不是 PgAdmin 版本。
  • 原来是因为我的本地和服务器之间的 postgre SQL 版本不匹配,在我的计算机上安装相同版本的 PostgreSQL 解决了这个问题。谢谢!

标签: sql postgresql cmd


【解决方案1】:

将此留在这里以获取信息,

如果 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

【讨论】:

  • 这行listen_addresses = '*'默认存在于hub.docker.com/_/postgres上的官方Dockerized镜像中
  • 这对我来说没有意义。如果从未建立连接,如何终止连接?
  • 对于 64 位 Windows,postgresql.conf 在C:\Program Files\PostgreSQL\<VERSION>\data
【解决方案2】:

原来是因为我的本地和服务器之间的 postgre SQL 版本不匹配,在我的计算机上安装相同版本的 PostgreSQL 解决了这个问题。谢谢!

【讨论】:

  • 2020 年 8 月。这仍然适用。
  • 如何将它们匹配在一起?
  • 只是一个例子:pgAdmin 4.28 不会连接到任何 postgres 服务器 12.4。如果您降级到 pgAdmin 4.27,您将能够连接到 12.4。难以置信...
  • 如何找出哪个pgAdmin版本可以连接到哪个postgres版本?
  • 我确实在我的机器上安装了相同的版本,但问题仍然存在。
【解决方案3】:

就我而言,这是因为我在 pg_hba.conf 中错误地设置了 IP 配置,该配置位于 Windows 的数据文件夹中。

# 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。

【讨论】:

  • 对于 64 位 Windows,pg_hba.conf 位于 `C:\Program Files\PostgreSQL\VERSION\data` 下
  • 可能的错误消息:状态:08001 本机错误:101 消息:致命:主机“a.b.c.d”、用户“postgres”、数据库“template1”、SSL 关闭没有 pg_hba.conf 条目
【解决方案4】:

就我而言,我使用的是 Postgresql 9.2.24,解决方案是这样的(pg_hba.conf):

host    all             all             0.0.0.0/0            trust

对于远程连接,请使用 trust。结合(如上所述)

listen_addresses = '*'

【讨论】:

  • 请注意listen_addresses = '*'不属于pg_hba.conf,而是属于postgresql.conf,默认情况下,list_addresses设置为全部(*)。 postgresql.org/message-id/…
  • 这绝对是我需要的解决方案——除了postgresql.conf 中的listen_addresses = '*' 行之外,将此行添加到pg_hba.conf
  • 但这并不安全,所以我不建议您在生产中使用它。这可能表明 pg_hba.conf 中确实存在网络允许问题需要解决。
【解决方案5】:

这是一篇旧帖子,但是...

很惊讶没有人谈论 pg_hba 文件,因为它可能是获得此错误代码的好理由。

忘记配置的人请在此处查看: http://www.postgresql.org/docs/current/static/auth-pg-hba-conf.html

【讨论】:

    【解决方案6】:

    在我的情况下,我通过 pgAdmin 使用 ssh 隧道建立连接并设置为主机字段 ip 地址,但必须设置 localhost

    【讨论】:

      【解决方案7】:

      如果您使用 Docker,请确保您没有在另一个服务中使用相同的端口,在我的情况下,我错误地为 PostgreSQL 和 Redis 使用了相同的端口。

      【讨论】:

        【解决方案8】:

        在我的情况下,我尝试通过 pgAdmin4 使用 ssh 隧道连接,然后在服务器的 /etc/ssh/sshd_config 中设置 AllowTcpForwarding no。但应该是AllowTcpForwarding yes

        【讨论】:

          【解决方案9】:

          如果您的 Postgres 正在工作,但突然遇到此错误,我的问题只需重新启动 Postgres 服务或容器即可解决。

          【讨论】:

            【解决方案10】:

            先给用户设置密码解决。

            在终端

            sudo -u <username> psql
            
            ALTER USER <username> PASSWORD 'SetPassword';
            # ALTER ROLE
            
            \q
            

            在 pgAdmin 中

            **Connection**
            
            Host name/address: 127.0.0.1
            Port: 5432
            Maintenance database: postgres
            username: postgres
            password: XXXXXX
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2017-03-31
              • 2012-09-29
              • 1970-01-01
              • 1970-01-01
              • 2022-11-30
              • 2021-12-23
              • 2021-08-24
              相关资源
              最近更新 更多