暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PostgreSQL自动重启避免长时间停机

原创 梧桐 2025-03-05
306

如果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

注意:频繁的自动重启可能会对系统性能产生影响,尤其是在高负载环境下。需要合理配置重启策略。同时,要注意观察日志中的错误信息或部署监控告警系统,检查和处置可能导致中断的问题,减少重启次数及其可能带来的负面影响。

最后修改时间:2025-03-12 21:47:02
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论