无法将PostgreSQL作为Windows服务运行

36

我在Windows服务中有这个:

C:/Program Files/PostgreSQL/8.4/bin/pg_ctl.exe runservice -N "postgresql-8.4" -D "D:/PostgreSQL/8.4/data" -w

它从未执行完。但是如果我在DOS命令行中这样做:

C:/Program Files/PostgreSQL/8.4/bin/pg_ctl.exe start -N "postgresql-8.4" -D "D:/PostgreSQL/8.4/data" -w

注意,我只把 "runservice" 改成了 "start",它就可以正常运行了。

有什么想法?


事件日志通常包含有关PostgreSQL启动问题的信息。 - Noman_1
14个回答

47

命令runservice只能由服务管理器执行。

为了修复我的本地Windows 7以便将Postgres作为服务启动,我使用以下命令启动数据:

 pg_ctl -D "C:\Program Files\PostgreSQL\9.1\data" start 

然后检查错误状态

 pg_ctl -D "C:\Program Files\PostgreSQL\9.1\data" status 

如果您遇到错误1063,很可能是权限问题,我执行了以下命令:

 cacls "C:\Program Files\PostgreSQL\9.1\data" /E /T /C /G postgres:F

重新运行启动/状态命令后,显示一切正常,但服务管理器仍无法启动该服务。

因此,在“服务”->“postgresql”->“选项”->“登录”中,我将登录方式设置为本地系统账户,而不是postgres用户,然后它就可以工作了。


2
这对我也起作用了。postgresql 9.5.2。简而言之:在服务中选择服务并查看其属性,将登录更改为本地系统。 - Alexander Rios
2
我使用了NETWORK_SERVICE用户,而不是postgres用户。详情请参见此处:https://dev59.com/73M_5IYBdhLWcg3wvFzJ#38563535 - Stephan
1
更好的答案:https://dev59.com/8loV5IYBdhLWcg3wJ78b - Ganesh Jadhav

11
这是因为我将我的数据目录设置在了Postgres Windows用户账户没有访问权限的地方。

这正是发生这种情况的确切原因!您必须在安装过程中更改数据目录以避免此问题。 - Anonymous
对于普通读者,这里有一个简单的方法来正确设置数据目录权限: https://dev59.com/73M_5IYBdhLWcg3wvFzJ#38563535。 - Stephan
需要注意的是,默认情况下,Windows 上的 PostgreSQL 似乎使用 NetworkService 作为用户。 - Bart Friederichs

8

在系统崩溃后,我在Windows上遇到了这个问题。 运行第一个命令显示了C:\Program Files\PostgreSQL\9.1\data\postmaster.pid中的无效数据。 删除该文件即可解决问题。 参考资料。


6

我遇到了同样的问题,这是在没有重新创建所有必要权限的情况下手动移动数据库数据文件(PG_DATA目录)后出现的。

这是我解决问题的方法:

1. 检查旧的PG_DATA目录的权限:

cacls "c:\path\to\old\pgdata\dir"

2. 检查新的PG_DATA目录权限:

cacls "d:\path\to\NEW\pgdata\dir"

3. 比较第1步和第2步的输出结果。

找出用户和/或权限之间的差异,然后进行同步。

注:我发现使用 explorer 进行同步比直接从命令行使用 cacls 更容易。


4
如果您更改了 pg_hba.conf 文件,可能在文件中错过了某些内容。例如,在该文件中 IP 后必须有 CIDR。它必须像 192.168.1.100/32 这样。
如果您忘记了输入 32,则服务器将无法重新启动。
查看启动日志可能会给您一些线索。如果问题出现在 pg_hba.conf 中,您可能会看到类似以下内容的信息:
2018-11-13 00:39:34.841 PST [8284] FATAL:  could not load pg_hba.conf
2018-11-13 00:39:34.842 PST [8284] LOG:  database system is shut down

4

您需要检查日志文件和Windows事件日志,以获取有关问题的提示。如果那里什么都没有,您需要使用类似于Process Monitor的工具并获取它挂起的堆栈跟踪。


2

我以前遇到过这个问题,原因是安装程序没有正确设置服务运行的用户的权限。


1

请确保在 C:\ 目录下没有名为 Program 的空文件,例如 C:\Program

如果存在这种情况,每次登录 Windows 时,资源管理器都会发出警告。

File Name Warning
-----------------
There is a file or folder on your computer called "C:\Program" which
could cause certain applications to not function correctly. Renaming it
to "C:\Program1" would solve this problem. Would you like to rename
it now?

1
我也遇到了postgresql在尝试初始化数据库集群后抛出错误的问题。经过分析日志文件和运行命令行脚本四个小时,我找到了解决方案,适用于Windows版本的任何人。这不是关于为什么会发生这种情况的详细描述。我已经在无数客户服务器和Windows系统上安装了odoo 10、11、12和13多次,这是我第一次遇到这个问题。我不能确定是因为我在这台机器上安装了MS VS Enterprise和Android Studio还是其他原因。但下面是简单的答案,可以解决问题并在data文件夹中初始化集群并创建数据库文件。
  1. 打开PostgreSQL的数据文件夹。-对于Odoo安装,通常是“C:\ Program Files(x86)\ Odoo 13.0 \ PostgreSQL”,除非您在安装时选择了其他位置。

  2. 从此文件夹中删除任何或所有文件-如果不这样做,则运行initdb.exe时会出现错误。

  3. 右键单击数据文件夹,打开其属性。单击“安全”选项卡,然后单击底部的“高级”按钮。

  4. 您需要将此文件夹的所有者更改为openpgsvc。单击“更改”并键入openpgsvc,然后单击“确定”。完成后,单击下面的复选框,表示您希望此更改影响包含此容器的容器。

  5. 然后,在“权限”选项卡上,单击底部的“添加”按钮。您需要将openpgsvc添加为用户,并为该用户授予完全权限。单击应用并单击确定以关闭所有文件夹属性。

  6. 现在,您需要打开cmd.exe-一旦打开,我们将调用initdb.exe并传递一些值。

  7. 首先运行chdir并将工作目录更改为initdb.exe的位置。对于我,在Windows 10计算机上运行odoo 13,位置如下。

"C:\Program Files (x86)\Odoo 13.0\PostgreSQL\bin"

需要被传递的一个变量是列表。在调用initdb.exe时需要包含此列表。

Postgres数据目录:"C:\Program Files (x86)\Odoo 13.0\PostgreSQL\data"

带有参数的最终结果如下:

"C:\Program Files (x86)\Odoo 13.0\PostgreSQL\bin\initdb.exe" -D "C:\Program Files (x86)\Odoo 13.0\PostgreSQL\data"

按Enter键并让它运行。该命令的输出应如下所示。

Cmd.exe running initdb.exe script

1
sc create "postgresql-9.2" binPath= "\"C:/Program Files (x86)/PostgreSQL/9.2/bin/pg_ctl.exe\" runservice -N \"postgresql-9.2\" -D \"C:/Program Files (x86)/PostgreSQL/9.2/data\" -w" DisplayName= "postgresql-9.2" start= auto

请在以管理员身份运行的CMD上尝试此操作(根据您的版本添加参数)


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