Amazon Linux 2023上PostgreSQL 12服务无法启动求助
嗨,我仔细看了你的问题描述、服务文件配置和错误日志,一眼就发现了问题所在——你的systemd服务文件犯了一个低级但关键的错误,导致系统尝试去执行服务配置文件本身,而不是PostgreSQL的可执行程序,这才抛出了Exec format error错误。
问题根源分析
看错误日志里的这两行:
Oct 20 11:55:36 ip- systemd[364804]: postgresql.service: Failed to execute /usr/lib/systemd/system/postgresql.service: Exec format error
Oct 20 11:55:36 ip- systemd[364804]: postgresql.service: Failed at step EXEC spawning /usr/lib/systemd/system/postgresql.service: Exec format error
你的ExecStart配置写的是"/usr/lib/systemd/system/postgresql.service",这是systemd的配置文件路径,本身是文本格式,根本不是可执行程序,系统当然没法执行它。另外还有两个小问题:
WorkingDirectory设置成了systemd的目录,PostgreSQL需要运行在自己的数据目录下- 没有指定运行服务的用户,用root跑PostgreSQL既不安全也会有权限问题
解决方案:修正systemd服务配置
咱一步步来解决:
1. 确认PostgreSQL可执行文件位置
源码编译安装的PostgreSQL,默认安装路径是/usr/local/pgsql,可执行文件在/usr/local/pgsql/bin/postgres。你可以用下面的命令确认:
find /usr/local -name postgres -type f
2. 修正postgresql.service文件
把/usr/lib/systemd/system/postgresql.service替换成下面的配置(注意替换实际的路径,如果你的安装目录不一样):
[Unit] Description=PostgreSQL database server After=network.target # 确保网络启动后再启动服务 [Service] Type=forking # PostgreSQL是后台守护进程,用forking模式 User=postgres # 指定用postgres用户运行,源码安装通常会自动创建这个用户,如果没有就用useradd postgres创建 Group=postgres WorkingDirectory=/usr/local/pgsql/data # PostgreSQL的数据目录,需要先初始化 ExecStart=/usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data # 正确的可执行文件路径+指定数据目录 ExecReload=/bin/kill -HUP $MAINPID # 重载配置的命令 TimeoutSec=300 Restart=on-failure # 服务失败时自动重启 [Install] WantedBy=multi-user.target
3. 初始化数据库(如果还没做)
切换到postgres用户,初始化数据目录:
su - postgres /usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data exit
4. 修复权限(确保数据目录属于postgres)
chown -R postgres:postgres /usr/local/pgsql/data
5. 重新加载systemd并启动服务
systemctl stop postgresql # 先停止之前的失败服务 systemctl daemon-reload # 重新加载systemd配置 systemctl enable --now postgresql # 启用并立即启动服务 systemctl status postgresql # 检查服务状态
额外必要配置(可选但常用)
如果需要远程连接PostgreSQL,还需要做以下两步:
- 修改
/usr/local/pgsql/data/postgresql.conf,监听所有地址:listen_addresses = '*' - 修改
/usr/local/pgsql/data/pg_hba.conf,添加允许远程连接的规则(比如允许所有IP用md5密码登录):host all all 0.0.0.0/0 md5 - 重启服务生效:
systemctl restart postgresql - 开放防火墙端口(如果用firewalld):
firewall-cmd --add-port=5432/tcp --permanent firewall-cmd --reload
备注:内容来源于stack exchange,提问作者justaguy

