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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 19:01:20