如果PostgreSQL服务因网络闪断或资源竞争而意外停止,自动重启可以快速将其恢复到正常状态,确保服务在开机时和意外中断后能够快速恢复,避免由此导致的长时间停机,减少了管理员手动干预,尤其是在无人值守的环境中。
以下在CentOS7.9下PostgreSQL17 Server编译版中通过:
1、启用日志(推荐,非必须)
在 postgresql.conf 文件中配置日志参数
# 启用日志收集器
logging_collector = on
# 设置日志存放的目录
log_directory = '/var/postgresql/data/pg_log'
# 设置日志文件的命名规则
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
# 设置日志文件的最大大小,以便日志轮换
log_rotation_size = 100MB
log_rotation_age = 1d
2、编辑postgresql.service
编辑postgresql自启动配置文件
vim /etc/systemd/system/postgresql.service
[Unit]
Description=PostgreSQL RDBMS
After=syslog.target
After=network.target
[Service]
Type=forking
User=postgres
Group=postgres
ExecStart=/usr/local/pgsql/bin/pg_ctl start -D /var/postgresql/data
ExecStop=/usr/local/pgsql/bin/pg_ctl stop -D /var/postgresql/data -m fast
ExecReload=/usr/local/pgsql/bin/pg_ctl reload -D /var/postgresql/data
Restart=on-failure
RestartSec=30
[Install]
WantedBy=multi-user.target
说明:
- Restart=on-failure:表示当服务因为错误或崩溃停止时,systemd会自动重启它。
- RestartSec=5:表示重启前等待5秒。
也可以设置为最小值0,即立即重启。(适合测试环境)
Restart=always
RestartSec=0
RestartSec 的最小值可以是0秒,但设置过小的值可能会导致资源问题或触发 systemd 的启动频率限制。
根据您的需求和环境,选择一个合适的值,并考虑调整 StartLimitIntervalSec 和 StartLimitBurst 以更好地控制服务的重启行为。
StartLimitIntervalSec=300s #表示在 300 秒内,最多允许服务重启 5 次。
StartLimitBurst=5 #表示如果服务在500秒内连续重启超过5次,则systemd会停止尝试重新启动该服务。
3、重载服务
sudo systemctl daemon-reload #重载systemd 配置
sudo systemctl enable postgresql #注意,此处即设置开机自动启动
sudo systemctl start postgresql #启动postgresql服务
4、验证自动重启是否正常
a、查看服务进程ID:
sudo netstat -tulnp | grep 5432 tcp 0 0 127.0.0.1:5432 0.0.0.0:* LISTEN 6931/postgres
b、分别以下三种方式停止服务
/usr/local/pgsql/bin/pg_ctl stop -D /var/postgresql/data
kill 6931
kill -9 6931
c、查看postgresql服务是否重启成功
注意:不做任何操作,等10s后(该时长为RestartSec=10设置项),使用以下命令查询postgresql服务状态
/usr/local/pgsql/bin/pg_ctl status -D /var/postgresql/data
或查询端口状态
sudo netstat -tulnp | grep 5432
d、如每次停止一定时间后,均正常显示端口和进程,即重启正常
tcp 0 0 127.0.0.1:5432 0.0.0.0:* LISTEN 6961/postgres
e、如果启动失败,执行以下命令检查错误信息,回到第2步,检查配置
sudo systemctl status postgresql sudo journalctl -u postgresql 或 ls /var/postgresql/data/pg_log 找到当前的日志,使用cat查阅
5、停止或禁用自动重启服务
a、临时停止服务,不会影响其自动重启功能
sudo systemctl stop postgresql
b、立即停止服务,并禁用自动重启功能
sudo systemctl disable --now postgresql
c、不再使用自动重启功能,需修改服务配置
编辑 /etc/systemd/system/postgresql.service 文件,将 Restart 设置为 no,然后重新加载服务配置:
sudo systemctl daemon-reload sudo systemctl stop postgresql
6、FAQ
假如由于留下postmaster.pid文件,导致postgresql无法启动,可以在‘’ExecStart=“上一行加入
ExecStartPre=/bin/rm -f /var/postgresql/data/postmaster.pid
注意:频繁的自动重启可能会对系统性能产生影响,尤其是在高负载环境下。需要合理配置重启策略。同时,要注意观察日志中的错误信息或部署监控告警系统,检查和处置可能导致中断的问题,减少重启次数及其可能带来的负面影响。




