CentOS8 上的 Postgresql 13 无法在启动时启动,但可以手动启动

CentOS8 上的 Postgresql 13 无法在启动时启动,但可以手动启动

我在 CentOS8 上使用 postgres 13 时遇到以下问题。它安装在 /opt/pgsql/data 上的单独磁盘上(pg_wall 也安装在单独的磁盘 - /opt/pgsql/wall 上),并且在启动时无法启动,但如果我运行 systemctl start postgresql-13 就可以正常启动。

重启后,检查 postgres 服务状态出现以下错误:

● postgresql-13.service - PostgreSQL 13 database server
   Loaded: loaded (/usr/lib/systemd/system/postgresql-13.service; enabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since Mon 2020-11-16 22:50:55 EET; 32s ago
     Docs: https://www.postgresql.org/docs/13/static/
  Process: 1203 ExecStart=/usr/pgsql-13/bin/postmaster -D ${PGDATA} (code=exited, status=1/FAILURE)
  Process: 1179 ExecStartPre=/usr/pgsql-13/bin/postgresql-13-check-db-dir ${PGDATA} (code=exited, status=0/SUCCESS)
 Main PID: 1203 (code=exited, status=1/FAILURE)

Nov 16 22:50:55 srvpsql systemd[1]: Starting PostgreSQL 13 database server...
Nov 16 22:50:55 srvpsql postmaster[1203]: 2020-11-16 22:50:55.928 EET [1203] LOG:  redirecting log output to logging collector process
Nov 16 22:50:55 srvpsql postmaster[1203]: 2020-11-16 22:50:55.928 EET [1203] HINT:  Future log output will appear in directory "log".
Nov 16 22:50:55 srvpsql systemd[1]: postgresql-13.service: Main process exited, code=exited, status=1/FAILURE
Nov 16 22:50:55 srvpsql systemd[1]: postgresql-13.service: Killing process 1214 (postmaster) with signal SIGKILL.
Nov 16 22:50:55 srvpsql systemd[1]: postgresql-13.service: Failed with result 'exit-code'.
Nov 16 22:50:55 srvpsql systemd[1]: Failed to start PostgreSQL 13 database server.

/etc/systemd/system/multi-user.target.wants 中的服务文件包含以下内容:

[Unit]
Description=PostgreSQL 13 database server
Documentation=https://www.postgresql.org/docs/13/static/
After=opt-pgsql-wall.mount
After=syslog.target
After=network.target

[Service]
Type=notify
User=postgres
Group=postgres
Environment=PGDATA=/opt/pgsql/data/
OOMScoreAdjust=-1000
Environment=PG_OOM_ADJUST_FILE=/proc/self/oom_score_adj
Environment=PG_OOM_ADJUST_VALUE=0

ExecStartPre=/usr/pgsql-13/bin/postgresql-13-check-db-dir ${PGDATA}
ExecStart=/usr/pgsql-13/bin/postmaster -D ${PGDATA}
ExecReload=/bin/kill -HUP $MAINPID
KillMode=mixed
KillSignal=SIGINT


# Do not set any timeout value, so that systemd will not kill postmaster
# during crash recovery.
TimeoutSec=0

[Install]
WantedBy=multi-user.target

我添加了 opt-pgsql-wall.mount 因为我怀疑 postgres 进程是在磁盘安装完成之前启动的(这似乎不是导致错误的原因)。

另外,在 postgresql.conf 文件(在 /opt/pgsql/data 文件夹中)中,我已将当前文件夹设置为数据目录。

...
data_directory = '/opt/pgsql/data/' 
...

我究竟做错了什么 ?

答案1

我遇到了完全相同的错误!数据库也被转移到另一个已安装的磁盘,但事实证明,这不是问题所在。在 postgresql.conf 文件的第 59 行中,将

#listen_addresses = 'localhost' # what IP address (es) to listen on;

listen_addresses = '*'

这解决了我的问题。现在 postgresql 13 会在服务器启动时自动启动!

答案2

我遇到了类似的问题,但使用的是 RHEL8(PG 在启动时没有启动,而是在 systemctl start postgresql-13 之后手动启动),我通过更改 systemd 服务文件中的后续条件解决了该问题。首先,我阅读了 PG-13 日志(postgresql.log)并注意到此错误:“无法绑定 IPv4 地址“xx.xx.xx.xx”:无法分配请求的地址。因此,我必须修复文件:/usr/lib/systemd/system/postgresql-13.service 中的以下部分:

之后=网络.目标

替换为: 之后=网络在线.目标

通过此更改,PG 会在启动时自动启动。

您可以看到此参考资料,其中解释了网络和网络在线之间的区别,基本上,网络在线会等待直到网络在线,而网络只会等待服务已启动但可能尚未完成。

https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/configuring_and_managing_networking/systemd-network-targets-and-services_configuring-and-managing-networking

相关内容