修改Postgres 10数据目录后集群无法开机自启问题求助
看起来你已经完成了数据目录迁移的大部分操作,但开机后集群自动停止,大概率是几个常见问题导致的,咱们一步步排查解决:
第一步:先排查最可能的低级错误——配置文件路径写错了
你提到修改postgresql.conf时设置了data_directory = '/mnt/volume-nyc1-01/postgresql/9.5/main',但你操作的是PostgreSQL 10集群啊!原来的10版本数据目录应该是/var/lib/postgresql/10/main,rsync之后对应的路径应该是/mnt/volume-nyc1-01/postgresql/10/main,你写成9.5版本的路径了,这绝对会导致Postgres找不到数据目录而启动失败!
先验证这个配置:
cat /etc/postgresql/10/main/postgresql.conf | grep data_directory
如果输出确实是9.5的路径,赶紧修改:
sudo nano /etc/postgresql/10/main/postgresql.conf
把data_directory改成:
data_directory = '/mnt/volume-nyc1-01/postgresql/10/main'
保存后先手动启动试试:
sudo systemctl start postgresql@10-main.service
如果能启动,那这个就是核心问题,接下来再处理开机自动启动的依赖问题。
第二步:解决挂载卷启动时机晚于Postgres的问题
即使路径正确,Ubuntu开机时Postgres服务可能在你的挂载卷/mnt/volume-nyc1-01完成挂载之前就启动了,导致找不到数据目录而失败。咱们需要修改Postgres的systemd服务配置,添加挂载依赖:
- 打开Postgres 10的systemd服务文件:
sudo nano /lib/systemd/system/postgresql@10-main.service
- 在
[Unit]部分添加以下两行:
After=remote-fs.target RequiresMountsFor=/mnt/volume-nyc1-01
这两行的作用是告诉systemd,必须等挂载文件系统就绪后再启动Postgres服务,并且强制要求/mnt/volume-nyc1-01已经挂载完成。
- 重新加载systemd配置:
sudo systemctl daemon-reload
- 重启服务并确保开机自启已开启:
sudo systemctl enable --now postgresql@10-main.service
第三步:验证目录权限和挂载选项
如果上面两步都没解决,再检查权限和挂载设置:
- 确认数据目录的归属和权限:
ls -ld /mnt/volume-nyc1-01/postgresql/10/main
输出应该显示drwx------ 2 postgres postgres ...,如果不是,修复权限:
sudo chown -R postgres:postgres /mnt/volume-nyc1-01/postgresql sudo chmod -R 700 /mnt/volume-nyc1-01/postgresql/10/main
- 检查挂载卷的fstab配置,确保没有限制Postgres的选项:
cat /etc/fstab | grep /mnt/volume-nyc1-01
挂载选项应该是类似defaults的正常配置,避免noexec、nodev这类可能影响Postgres运行的选项。如果有不合适的选项,修改fstab后重新挂载:
sudo mount -o remount /mnt/volume-nyc1-01
第四步:查看日志找具体错误
如果还是不行,直接看Postgres的日志文件,里面会有明确的失败原因:
tail -n 50 /var/log/postgresql/postgresql-10-main.log
根据日志里的错误信息针对性解决即可。
内容的提问来源于stack exchange,提问作者jones_junior

