PostgreSQL集群及副本升级时rsync致数据目录重复、磁盘耗尽求解
PostgreSQL rsync同步时目录重复、磁盘耗尽的解决思路
1. 先修正rsync命令的源路径逻辑
你现在的命令把old_cluster和new_cluster两个完整集群都作为源同步到remote_dir,相当于把两份集群数据都复制过去,磁盘直接翻倍占用,不崩才怪。赶紧改命令:
- 如果是要把升级后的新集群同步到副本,只指定
new_cluster作为源:
注意路径末尾的rsync --archive --delete --hard-links --no-inc-recursive new_cluster/ remote_dir//,确保是把目录内的内容同步过去,而不是在远程创建嵌套的new_cluster目录。
2. 用pg_upgrade的硬链接模式省本地空间
执行pg_upgrade的时候加--link参数,新集群会直接硬链接旧集群的data文件,而不是复制一份,这样本地新旧集群几乎不额外占磁盘。之后rsync新集群到远程时,只会同步升级过程中真正修改/新增的文件,不会重复传整个旧集群的数据。
3. 调整rsync参数避免冗余
- 删掉
--size-only:这个参数只看文件大小判断是否同步,PostgreSQL有些文件(比如WAL、元数据)内容变了大小可能不变,用这个参数会漏同步,反而可能导致后续重复同步占空间。 - 保留
--hard-links:确保rsync能识别硬链接,不会把硬链接文件当成独立文件重复复制,节省远程端的磁盘。 - 可以加
--compress:如果网络不差,压缩传输能减少远程节点临时缓存的磁盘占用。
4. 同步前先做磁盘和目录检查
- 先看远程节点的剩余磁盘空间,至少要能装下一个完整集群的大小(首次同步)或者增量变化的大小(后续同步)。
- 确认
remote_dir里没有旧的集群目录,要是有,先清掉或者明确覆盖,别让新旧目录叠在一起占空间。
5. 分阶段同步降低磁盘峰值
- 先同步静态数据(比如
base目录里的历史数据文件),再同步动态文件(pg_wal、pg_stat_tmp这些),最后停掉旧集群后同步剩余的关键文件。这样能避免一次性同步所有文件导致磁盘占用瞬间拉满。
内容的提问来源于stack exchange,提问作者argdenis
相关产品推荐
相关产品推荐

