今天早上,一台运行 Postgres 8.4.x 服务器的 Windows 7 机器停止正常工作。错误非常奇怪:
- 该服务是不是根据服务控制面板,正在运行。
- 令人惊讶的是,服务器是实际运行,因为我们可以连接 pgAdmin 和我们自己的基于 ODBC 的软件,但是一些查询崩溃(这就是我们发现它坏了的方式)。
- 启动或停止服务器都不起作用,并且都返回错误,要么无法访问数据目录,要么根本没有有用的错误(net helpmsg 没有给我任何东西)。
事件查看器,其中大多数会出现多次,并且在启动或尝试启动/停止服务器时发生。
PostgreSQL - Error - Se agotó el tiempo de espera al inicio del servidor
2013-12-03 21:33:32 GMT FATAL: el archivo de bloqueo «postmaster.pid» ya existe
2013-12-03 21:33:32 GMT HINT: ¿Hay otro postmaster (PID 2952) corriendo en el directorio de datos «C:/Program Files (x86)/PostgreSQL/8.4/data»?
pg_ctl: no se pudo encontrar el ejecutable postgres
2013-12-03 18:46:34 CET FATAL: no se pudo crear ningún socket TCP/IP
pg_dump
能够提取完整的备份(所以我在乱搞之前就这样做了),尽管服务仍然没有标记为正在运行。
我尝试删除 pid 文件,因为我发现到处都推荐这样做,但这没有帮助。
通过查看日志文件,实际上在查询中发现了一个真正的错误,但这仍然不能解决我无法停止或启动 postgres 服务的问题。编辑:修复该无效查询并不能解决任何问题,应用程序仍然崩溃。
pg_hba.conf的相关部分:
host all all 127.0.0.1/32 md5
host all all 192.168.0.0/16 md5
host all all fe80::/48 md5
一些日志(其他的有同等内容):
http://pastebin.com/v9gtiDmJ
http://pastebin.com/wxYr8TUM
答案1
首先,出于对你数据的热爱请停止对系统进行更改。
在开始进行更改之前,您需要充分分析问题,否则您很有可能使问题变得更糟。
正如你所猜测的Postgres 正在你的系统上运行- 我们知道这一点,因为pg_dump
有效。如果没有 Postgres 服务器,pg_dump
就没有任何可以交流的东西。
这意味着你的问题(因为它一开始就存在)是完全是装饰性的(因此服务经理认为它坏了 - 谁在乎?!它已经好了,这才是最重要的。)
在这种情况下,“简单的解决方法”就是忽略这种情况 - 如果它没坏,就不要弄坏它!
下一个简单修复(如果服务管理器的意见对您很重要)是使用 手动停止 Postgres pg_ctl
,然后使用服务管理器重新启动它。
这对您来说不再是一个选项,因为您删除了 PID 文件。现在pg_ctl
不知道要向哪个 Postgres 进程发出信号。(在 Unix 上,这很容易解决 - 只需向具有最低 PID 的 Postgres 进程发出信号终止,数据库就会关闭。我不确定 Windows 上的等效方法是什么,但如果您知道,您可以这样做。)
最后一个选项是重新启动。如果上述两个选项都无法使服务管理器报告与实际情况一致的状态,则需要重新启动。
在 Unix 上,当所有系统进程都收到信号时,这应该会正常关闭 Postgres TERM
,我认为 Windows 也有相同的行为(但即使没有,也没关系 - Postgres 会将其视为崩溃并在下次启动时恢复)。
由于您升级了 Postgres 安装,因此现在必须执行第二个或第三个选项 - 您不能让系统保持当前状态。
您当前处于磁盘上的二进制文件/库与正在运行的二进制文件/库不匹配的状态,这就是不是处于一个良好的状态。为了确保您的系统处于已知的、一致的状态,您需要必须重新启动 Postgres。
对于您的情况,我建议停止数据库服务器,重新安装二进制文件(以确保没有遗漏任何文件,因为它们被锁定了),然后重新启动它。您通常不会在 Postgres 运行时升级二进制文件 - 您首先要关闭它。至少在 Unix 系统上,您大多数时候都可以“侥幸逃脱”,但为什么要冒出错的风险呢?