如何让pg_createcluster在数据目录已存在时仍创建配置目录?
如何让pg_createcluster在数据目录已存在时仍创建配置目录?
我太懂这个烦恼了!当初用pg_createcluster搭的PostgreSQL 15集群,重装系统时特意把数据盘保留下来,结果再跑pg_createcluster直接报错,这场景明明很常见,官方居然没直接支持,确实让人头疼。
先给你理清楚为啥会报错:pg_createcluster处理已有数据目录的逻辑是——默认认为这个数据目录是用initdb直接创建的(也就是配置文件postgresql.conf这些都在数据目录里),它会把这些配置文件移到/etc/postgresql/15/[集群名]下,再修改配置里的data_directory指向数据盘。但咱们之前用pg_createcluster创建的集群,配置文件本来就不在数据目录里,重装后/etc里的配置又没了,自然就触发了move_conffile的错误。
下面给你两个靠谱的解决办法,按需选择:
方法一:手动重建配置目录(推荐)
这种方法不需要折腾数据目录,直接手动建立配置目录并关联已有数据:
- 先确保
postgresql-common和postgresql-15包已经装好:sudo apt install postgresql-common postgresql-15 - 创建对应的配置目录(假设你的集群名是
main,如果是别的名字替换成你的):sudo mkdir -p /etc/postgresql/15/main - 从官方模板复制配置文件到这个目录:
sudo cp /usr/share/postgresql/15/postgresql.conf.sample /etc/postgresql/15/main/postgresql.conf sudo cp /usr/share/postgresql/15/pg_hba.conf.sample /etc/postgresql/15/main/pg_hba.conf sudo cp /usr/share/postgresql/15/pg_ident.conf.sample /etc/postgresql/15/main/pg_ident.conf - 编辑
postgresql.conf,把data_directory改成你保留的数据盘路径,比如:data_directory = '/mnt/pg_data/15/main' # 替换成你实际的数据目录路径 - 给配置目录设置正确的权限,让postgres用户能访问:
sudo chown -R postgres:postgres /etc/postgresql/15/main - 现在直接启动集群就行,不用再跑
pg_createcluster:sudo pg_ctlcluster 15 main start
方法二:让pg_createcluster完成配置整合
如果你非要用pg_createcluster来完成这个操作,可以临时给数据目录补一份配置文件,让它符合工具的预期:
- 把模板配置文件复制到你的数据目录里:
sudo cp /usr/share/postgresql/15/postgresql.conf.sample /mnt/pg_data/15/main/postgresql.conf sudo cp /usr/share/postgresql/15/pg_hba.conf.sample /mnt/pg_data/15/main/pg_hba.conf - 执行
pg_createcluster指定已有数据目录:
这时候工具会自动把数据目录里的配置文件移到sudo pg_createcluster 15 main --data-dir=/mnt/pg_data/15/main/etc/postgresql/15/main,并自动修改postgresql.conf里的data_directory指向数据盘。 - 最后你可以把原来备份的配置文件(如果有的话)覆盖到
/etc/postgresql/15/main里,或者根据需求修改新生成的配置。
两种方法都能解决问题,个人更推荐第一种,步骤更直接,也不会折腾数据目录里的内容。
备注:内容来源于stack exchange,提问作者EM0
相关产品推荐
相关产品推荐

