Postgresql 服务器正在运行,但服务似乎已停止

mar*_*tin 5 postgresql postgresql-9.4

我在 Windows Server 2008 R2 上将 Postgresql 9.4 作为服务运行。它通常是一种魅力,但现在有一种情况,服务器显然正在运行(我可以连接到它,任务管理器显示正在运行的进程),但 Windows 服务似乎已停止。

我尝试使用 pg_ctl,但我得到:

$>pg_ctl restart -D c:\psqldata94
pg_ctl: old server process (PID: 1436) seems to be gone
starting server anyway
server starting
2016-02-23 09:59:00 CET  LOG:  could not bind IPv6 socket: No error
2016-02-23 09:59:00 CET  HINT:  Is another postmaster already running on port  5432? If not, wait a few seconds and retry.
2016-02-23 09:59:00 CET  LOG:  could not bind IPv4 socket: No error
2016-02-23 09:59:00 CET  HINT:  Is another postmaster already running on port 5432? If not, wait a few seconds and retry.
2016-02-23 09:59:00 CET  WARNING:  could not create listen socket for "*"
2016-02-23 09:59:00 CET  FATAL:  could not create any TCP/IP sockets

$>pg_ctl stop
pg_ctl: PID file "c:/psqldata94/postmaster.pid" does not exist
Is server running?
Run Code Online (Sandbox Code Playgroud)

我尝试在线寻求帮助,但我唯一能找到的是psql-admin mailing list 上的这篇不祥的帖子。

正如帖子的作者所描述的那样:服务器正在运行,但它不响应命令。我想我可以重新启动底层的 Windows 服务器,但显然如果我只是杀死正在运行的进程,这可能会产生严重的后果。

有人知道在这种情况下如何优雅地停止服务器吗?

mar*_*tin 3

对我来说,答案在于更仔细地阅读这本优秀的手册。特别是以下三点:

关于服务器关闭的一般讨论在这里

所以我所做的就是终止所有通过pg_stat_activity视图可见的后端pg_terminate_backend,然后登录到服务器并运行pg_ctl kill TERM <pid>到剩余的正在运行的 postgres 进程。