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