You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Ubuntu系统同一主机上将PostgreSQL集群复制至新位置并基于复制内容初始化为新集群

我来帮你一步步搞定这个操作——从停止现有PostgreSQL集群、复制数据目录到把复制后的内容转换成一个独立的新集群,全程适配Ubuntu系统:

步骤1:彻底停止原PostgreSQL集群

一定要确保原集群完全停止后再进行复制,否则数据可能出现不一致或损坏。Ubuntu上用systemd管理PostgreSQL服务,你可以指定具体实例停止(更安全):

# 替换<版本号>和<原集群名>为实际值,比如14和main
sudo systemctl stop postgresql@<版本号>-<原集群名>.service

验证停止状态,看到inactive (dead)就说明没问题:

sudo systemctl status postgresql@<版本号>-<原集群名>.service
步骤2:复制$PGDATA目录到新位置

首先找到原集群的$PGDATA路径,默认是/var/lib/postgresql/<版本号>/<原集群名>。我们要把它复制到新路径(比如/var/lib/postgresql/<版本号>/new_cluster),复制时必须保留文件权限、所有者和时间戳,否则新集群启动会有权限问题:

# 切换到postgres用户操作,避免权限冲突
sudo su - postgres
# 递归复制并保留属性(-r递归,-p保留权限/所有者/时间戳)
cp -rp /var/lib/postgresql/14/main /var/lib/postgresql/14/new_cluster
# 退出postgres用户
exit

如果你复制的是超大集群,用rsync -a会更可靠(比如rsync -a /var/lib/postgresql/14/main/ /var/lib/postgresql/14/new_cluster/),它会自动跳过已复制的文件,中断后还能续传。

步骤3:修改新集群的核心配置文件

复制完成后,需要调整新目录里的配置,避免和原集群冲突:

修改postgresql.conf

编辑/var/lib/postgresql/<版本号>/new_cluster/postgresql.conf,重点改这几个参数:

  • port = 5433:改成和原集群不同的端口(原集群默认5432),防止端口冲突
  • cluster_name = 'new_cluster':设置新集群的名称
  • 如果原集群有绝对路径的配置(比如wal_directory),要同步改成新目录的路径

修改pg_hba.conf(按需)

这个文件控制数据库的访问权限,如果你需要调整新集群的访问规则(比如允许特定用户连接),可以在这里修改。如果只是本地测试,默认配置一般够用。

修改postmaster.opts(可选但推荐)

这个文件记录了集群的启动参数,里面可能包含原集群的路径,把所有原$PGDATA路径替换成新路径即可。

步骤4:注册新集群到Ubuntu的PostgreSQL服务管理

Ubuntu用pg_createcluster工具来统一管理集群,我们用它把复制的目录注册成正式集群,这样就能用systemd来启停了:

sudo su - postgres
# 语法:pg_createcluster --datadir=<新数据路径> <版本号> <新集群名>
pg_createcluster --datadir=/var/lib/postgresql/14/new_cluster 14 new_cluster
exit

这个命令会自动生成对应的systemd服务文件(比如postgresql@14-new_cluster.service),同时会做权限校验和配置检查。

步骤5:启动新集群并验证

现在启动新集群:

sudo systemctl start postgresql@14-new_cluster.service

验证启动状态:

sudo systemctl status postgresql@14-new_cluster.service

连接到新集群确认:

# 指定新端口连接,默认用户是postgres
psql -h localhost -p 5433 -U postgres

进入数据库后,执行这条命令确认集群名称:

SELECT current_setting('cluster_name');

返回new_cluster就说明新集群已经正常运行了!

关键注意事项
  • 复制过程中不要中断,否则数据可能损坏
  • 新集群的端口必须和原集群不同,否则启动失败
  • 如果原集群启用了SSL、归档备份等功能,记得同步调整新集群的对应配置
  • 操作完成后,可以启动原集群,两个集群会独立运行,互不影响

内容的提问来源于stack exchange,提问作者Kyosh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 21:57:36