“致命:数据库系统正在关闭”,同时创建与 PostgreSQL 的连接

Posted

技术标签:

【中文标题】“致命:数据库系统正在关闭”,同时创建与 PostgreSQL 的连接【英文标题】:"FATAL: the database system is shutting down" while creating connection to PostgreSQL 【发布时间】:2014-06-27 01:17:37 【问题描述】:

我在创建与 PostgreSQL 9.2 服务器的 PostgreSQL JDBC 连接时收到 FATAL: the database system is shutting down 错误。我从 JDBC 得到的具体异常路径在这里:

Caused by: org.postgresql.util.PSQLException: FATAL: the database system is shutting down
    at org.postgresql.core.v3.ConnectionFactoryImpl.doAuthentication(ConnectionFactoryImpl.java:398)
    at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:173)
    at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:64)
    at org.postgresql.jdbc2.AbstractJdbc2Connection.<init>(AbstractJdbc2Connection.java:136)
    at org.postgresql.jdbc3.AbstractJdbc3Connection.<init>(AbstractJdbc3Connection.java:29)
    at org.postgresql.jdbc3g.AbstractJdbc3gConnection.<init>(AbstractJdbc3gConnection.java:21)
    at org.postgresql.jdbc4.AbstractJdbc4Connection.<init>(AbstractJdbc4Connection.java:31)
    at org.postgresql.jdbc4.Jdbc4Connection.<init>(Jdbc4Connection.java:24)
    at org.postgresql.Driver.makeConnection(Driver.java:393)
    at org.postgresql.Driver.connect(Driver.java:267)

从各种日志文件(来自 PostgreSQL,来自我们的管理层,来自使用 PostgreSQL 的应用程序),我没有看到任何实际发生的数据库关闭(其他连接像往常一样创建到 PostgreSQL,没有从我们的管理层启动关闭等),但是在 PostgreSQL 服务器日志中,我确实看到了具有相同时间戳的错误消息:

2014-06-16 12:30:00.736 GMT LOG:  connection received: host=127.0.0.1 port=38530
2014-06-16 12:30:00.737 GMT FATAL:  the database system is shutting down

上网查了一下,得知PostgreSQL关闭连接的时候都会出现这个错误信息。

为什么 PostgreSQL 会拒绝给我一个新的连接?这可能是由某种资源争用引起的吗?如何从 PostgreSQL 本身获取有关错误的更多信息?

【问题讨论】:

进一步查看数据库服务器日志以了解它被关闭的原因。你用了pg_ctl stop 什么的? PostgreSQL 安装端口是什么??? 【参考方案1】:

这个问题原来是由于对 PostgreSQL 的严重误用造成的,我们的服务器在同一个数据目录上启动了两个 PostgreSQL 实例(它删除了postmaster.pid 并使用了新的端口号,所以正常的防范措施是针对这个行为被绕过)这解释了为什么日志没有包含任何有用的信息——它们被不拒绝连接的 PostgreSQL 实例覆盖。实际问题是由竞争的 PostgreSQL 实例之间的复杂交互引起的,我希望其他人也不会遇到这个问题!

【讨论】:

修复它的解决方案是什么? 你能在这里提供解决方案吗? 我的解决方案不是在同一组文件上运行两个 PostgreSQL 服务器。如果您没有手动删除 postmaster.pid 文件,或者在删除时比我们更加小心,那么 PostgreSQL 旨在防止您这样做。【参考方案2】:

我们在重新启动服务器时遇到了这个问题。在这种情况下,重启并没有启动与 PostgreSql 的连接。只需检查状态:“/etc/init.d/postgresql status”,如果返回为:“no server running”,只需启动:“/etc/init.d/postgresql start”

【讨论】:

【参考方案3】:

可能硬盘空间不足。

【讨论】:

以上是关于“致命:数据库系统正在关闭”,同时创建与 PostgreSQL 的连接的主要内容,如果未能解决你的问题,请参考以下文章

在调度屏障中同时执行多个块

Springmvc处理post+json数据

如何防止用户向 php 文件发送如此多的 post 请求

Http put与post区别

GET请求与POST请求

angularjs指令中的compile详解