使用systemctl edit调整启动策略
方案一、设置PostgreSQL延迟5秒启动
创建文件夹用于systemctl edit配置
sudo mkdir -p /etc/systemd/system/postgresql@15-main.service.d
新增片段覆盖文件
sudo nano /etc/systemd/system/postgresql@15-main.service.d/override.conf
在打开的编辑器中添加以下内容
[Service]
ExecStartPre=/bin/sleep 5
保存并退出,然后重新加载systemd配置
sudo systemctl daemon-reload
重新启动验证
reboot
确认PostgreSQL运行状况
启动成功:
root@Pine-Tree:~# sudo systemctl status postgresql@15-main
● postgresql@15-main.service - PostgreSQL Cluster 15-main
Loaded: loaded (/lib/systemd/system/postgresql@.service; enabled; vendor preset: enabled)
Drop-In: /etc/systemd/system/postgresql@15-main.service.d
└─override.conf
Active: active (running) since Sat 2025-04-19 11:20:15 CST; 2min 14s ago
Process: 814 ExecStartPre=/bin/sleep 5 (code=exited, status=0/SUCCESS)
Process: 1440 ExecStart=/usr/bin/pg_ctlcluster --skip-systemctl-redirect 15-main start (code=exited, status=0/SUCCESS)
Main PID: 1446 (postgres)
Ubuntu
启动时间:
root@Pine-Tree:~# uptime -s
2025-04-19 11:19:56
确认PostgreSQL启动时间,可知延迟启动生效
root@Pine-Tree:~# ps -eo pid,lstart,cmd | grep postgres | grep -v grep
1446 Sat Apr 19 11:20:05 2025 /usr/lib/postgresql/15/bin/postgres -D /mnt/pgdata/main -c config_file=/etc/postgresql/15/main/postgresql.conf
1483 Sat Apr 19 11:20:08 2025 postgres: 15/main: checkpointer
1484 Sat Apr 19 11:20:08 2025 postgres: 15/main: background writer
1486 Sat Apr 19 11:20:10 2025 postgres: 15/main: walwriter
1487 Sat Apr 19 11:20:10 2025 postgres: 15/main: autovacuum launcher
1488 Sat Apr 19 11:20:10 2025 postgres: 15/main: logical replication launcher
1838 Sat Apr 19 11:22:32 2025 postgres: 15/main: postgres dbname 192.168.125.2(6139) idle
方案二、PostgreSQL开机自启动失败后重试2次(间隔10秒)
修改override.conf
sudo nano /etc/systemd/system/postgresql@15-main.service.d/override.conf
配置调整为:
[Service]
Restart=on-failure
RestartSec=10s
StartLimitBurst=2
保存并退出,然后重新加载systemd配置
sudo systemctl daemon-reload
重新启动验证
reboot
确认PostgreSQL运行状况
启动成功:
root@Pine-Tree:~# sudo systemctl status postgresql@15-main
● postgresql@15-main.service - PostgreSQL Cluster 15-main
Loaded: loaded (/lib/systemd/system/postgresql@.service; enabled; vendor preset: enabled)
Drop-In: /etc/systemd/system/postgresql@15-main.service.d
└─override.conf
Active: active (running) since Sat 2025-04-19 12:30:06 CST; 7min ago
Process: 1479 ExecStart=/usr/bin/pg_ctlcluster --skip-systemctl-redirect 15-main start (code=exited, status=0/SUCCESS)
Main PID: 1487 (postgres)
Ubuntu
启动时间:
root@Pine-Tree:~# uptime -s
2025-04-19 12:29:47
查看PostgreSQL
历史启动记录,可知12:29:50s
首次启动PostgreSQL
失败,10
秒过后启动成功:
root@Pine-Tree:~# sudo journalctl -u postgresql@15-main --no-pager -n 50
-- Boot 0ba0937613c14ba8b47c6bb17de28bcd --
4月 19 12:29:50 Pine-Tree systemd[1]: Starting PostgreSQL Cluster 15-main...
4月 19 12:29:50 Pine-Tree postgresql@15-main[794]: Error: /mnt/pgdata/main is not accessible or does not exist
4月 19 12:29:50 Pine-Tree systemd[1]: postgresql@15-main.service: Can't open PID file /run/postgresql/15-main.pid (yet?) after start: Operation not permitted
4月 19 12:29:50 Pine-Tree systemd[1]: postgresql@15-main.service: Failed with result 'protocol'.
4月 19 12:29:50 Pine-Tree systemd[1]: Failed to start PostgreSQL Cluster 15-main.
4月 19 12:30:00 Pine-Tree systemd[1]: postgresql@15-main.service: Scheduled restart job, restart counter is at 1.
4月 19 12:30:00 Pine-Tree systemd[1]: Stopped PostgreSQL Cluster 15-main.
4月 19 12:30:00 Pine-Tree systemd[1]: Starting PostgreSQL Cluster 15-main...
4月 19 12:30:06 Pine-Tree systemd[1]: Started PostgreSQL Cluster 15-main.
方案三、设置PostgreSQL延迟5秒启动同时设置启动失败后重试2次(间隔10秒 )
修改override.conf
后重新验证
sudo nano /etc/systemd/system/postgresql@15-main.service.d/override.conf
配置调整为:
[Service]
ExecStartPre=/bin/sleep 5
Restart=on-failure
RestartSec=10s
StartLimitBurst=2
保存并退出,然后重新加载systemd配置
大部分情况下,延迟5秒即可保证启动成功,不会走到重试逻辑
sudo systemctl daemon-reload