CentOS 上 PostgreSQL 无法启动的原因有很多,常见情况和排查思路如下(按出现频率从高到低):
PostgreSQL 不能用 root 运行,必须由 postgres 用户启动。
典型报错:
could not create lock file: Permission denied
data directory "/var/lib/pgsql/..." has group or world access
检查与修复:
ls -ld /var/lib/pgsql/13/data
应为:
drwx------ postgres postgres
修复:
chown -R postgres:postgres /var/lib/pgsql/13/data
chmod 700 /var/lib/pgsql/13/data
新装的 PostgreSQL 不会自动初始化数据库。
检查:
ls /var/lib/pgsql/13/data
如果是空的,需要初始化:
postgresql-setup --initdb
# 或
/usr/pgsql-13/bin/initdb -D /var/lib/pgsql/13/data
非常常见但容易被忽略
查看是否 SELinux 问题:
getenforce
如果是 Enforcing,看日志:
tail /var/log/audit/audit.log | grep postgres
临时验证:
setenforce 0
systemctl start postgresql
如果能启动,就是 SELinux 问题。
修复方式(推荐):
semanage fcontext -a -t postgresql_db_t "/data/pgdata(/.*)?"
restorecon -Rv /data/pgdata
或修改:
setsebool -P postgresql_can_rsync on
ss -tunlp | grep 5432
如果有其他进程占用,修改:
vi /var/lib/pgsql/13/data/postgresql.conf
port = 5433
常见错误:
postgresql.confpg_hba.conf手动检查配置:
/usr/pgsql-13/bin/postgres -D /var/lib/pgsql/13/data
会直接打印错误。
systemctl start postgresql
systemctl status postgresql
journalctl -xe -u postgresql
systemctl status postgresql
journalctl -xe -u postgresql
ls -ld /var/lib/pgsql/13/data
getenforce
ss -tunlp | grep 5432
请把以下信息贴出来:
systemctl status postgresql 输出journalctl -xe -u postgresql 报错内容我可以直接告诉你具体原因和一行修复命令。