为什么我的 PostgreSQL 启动服务无法正常工作,直到我重启后手动重新启动它?

为什么我的 PostgreSQL 启动服务无法正常工作,直到我重启后手动重新启动它?

我的 Linux 服务器上运行着 PostgreSQL。

PostgreSQL 已启用并在重启后处于活动状态。

我在 PostgreSQL 的配置文件中启用了远程访问。但每次我重启设备后,远程访问就不再可用:


systemctl status postgresql
● postgresql.service - PostgreSQL RDBMS
     Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
     Active: active (exited) since Tue 2022-04-12 02:05:22 CEST; 10min ago
    Process: 491 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
   Main PID: 491 (code=exited, status=0/SUCCESS)
        CPU: 5ms

Apr 12 02:05:22 raspberrypi systemd[1]: Starting PostgreSQL RDBMS...
Apr 12 02:05:22 raspberrypi systemd[1]: Finished PostgreSQL RDBMS.

cat grafana.log
logger=tsdb.postgres t=2022-04-12T02:18:50.33+0200 lvl=eror msg="query error" err="dial tcp 192.1.1.1:5432: connect: connection refused"

重新启动服务后,PostgreSQL 上的远程访问就可以正常工作了:

sudo systemctl restart postgresql

systemctl status postgresql
● postgresql.service - PostgreSQL RDBMS
         Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
         Active: active (exited) since Tue 2022-04-12 02:53:47 CEST; 25min ago
        Process: 2541 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
       Main PID: 2541 (code=exited, status=0/SUCCESS)
            CPU: 5ms

Apr 12 02:53:47 raspberrypi systemd[1]: Starting PostgreSQL RDBMS...
Apr 12 02:53:47 raspberrypi systemd[1]: Finished PostgreSQL RDBMS.

答案1

Postgres 已启用并且在重启后处于活动状态。

是吗?输出看起来像是退出了:

systemctl status postgresql
● postgresql.service - PostgreSQL RDBMS
     Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
     Active: active (exited) since Tue 2022-04-12 02:05:22 CEST; 10min ago
    Process: 491 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
   Main PID: 491 (code=exited, status=0/SUCCESS)
        CPU: 5ms

Apr 12 02:05:22 raspberrypi systemd[1]: Starting PostgreSQL RDBMS...
Apr 12 02:05:22 raspberrypi systemd[1]: Finished PostgreSQL RDBMS.

具体来说,我正在查看“主 PID: 491 (代码=退出,状态=0/SUCCESS)”。

编辑:

或许看上去并非如此。ServerFault 的答案似乎可能有一些很好的提示。

鉴于这是 Raspberry Pi,如果启动过程中出现一些问题导致出现相同的症状,我不会感到惊讶这里(这是针对 Ubuntu 环境的,但是嘿,RPi 也是 Debian):

postgresql-common 包安装的 postgresql 服务单元只是一个虚拟服务,它会导致实际服务 [电子邮件保护]通过依赖项启动。

...

该依赖项不是永久的,而是由 systemd 生成器 /lib/systemd/system-generators/postgresql-generator(也随 postgresql-common 包提供)在系统启动期间生成的。生成器会检查文件 /etc/postgresql/9.6/main/start.conf 中的启动模式是否设置为自动,如果是,则设置依赖项,随后导致实例 9.6-main 启动。

...

由于 systemd 生成器的限制(请参阅 man systemd.generator),此过程可能会失败,导致重启后依赖项缺失。然后 Systemd 将仅启动虚拟服务

...

运行命令

systemctl daemon-reload

以 root 身份手动重新运行生成器,并且在大多数情况下可以解决问题,直到下次重启。

永久解决问题你必须找到发电机在启动过程中发生故障的原因。可能的原因可以在 systemd.generator 手册页中找到。在我的例子中,是 PostgreSQL 配置文件 /etc/postgresql/9.6/main/postgresql.conf 被符号链接到另一个文件系统,而当生成器在启动初期运行时,该文件系统尚不可用。postgresql-generator 会检查该文件是否存在,即使它本来不需要它。

也许生成器在启动时失败,虚拟 postgresql 服务启动,然后生成器稍后成功,因此您可以通过重新启动它来再次运行该服务sudo systemctl restart postgresql

答案2

查看systemctl status输出:

● postgresql.service - PostgreSQL RDBMS
         Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
         Active: active (exited) since Tue 2022-04-12 02:53:47 CEST; 25min ago
        Process: 2541 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
       Main PID: 2541 (code=exited, status=0/SUCCESS)
            CPU: 5ms

由于服务已启动但退出,因此表明 PostgreSQL 在尝试启动时退出。因此,这不是服务问题,而是 PostgreSQL 服务器问题。检查 PostgreSQL 日志/var/log和日志中的最后条目;这应该可以解释问题所在。

根据我的经验,这类问题都是基于与 PostgreSQL 相关的权限问题等愚蠢问题。或者您是否将 PostgreSQL 绑定到特定 IP 地址?

在某些情况下,启动服务将尝试绑定到系统中尚未设置的 IP 地址。我猜你应该bind重新0.0.0.0启动,看看是否有帮助。

相关内容