以磁盘高效的方式提取 PostgreSQL 转储

以磁盘高效的方式提取 PostgreSQL 转储

我有一个 15 GB 的压缩 PostgreSQL 转储(作为 pgbackup),提取后接近 60 GB。我的云服务器只有 69 GB 的可用空间(将 pgbackup 复制到盒子上后为 54 GB),我想知道是否有一种巧妙的方法可以将 pgbackup 拆分为许多较小的压缩 pgbbackup 文件,删除原始的大型 pgbackup,然后迭代较小的 pgbackup,解压缩、执行它们,然后删除它们,这样我就可以在磁盘限制的情况下将整个数据集保存在 PostgreSQL 数据库中。

答案1

这里有很多可行的解决方法。选择一个符合您要求的。

通过标准输入

答案很简单——使用管道:

xzcat dumpFile.xz | pg_restore ....

这样,您不需要额外的磁盘空间来提取压缩的转储文件。

man pg_restore

-f 文件名, --file=文件名

指定生成的脚本的输出文件,或与 -l 一起使用时列表的输出文件。

默认是标准输出。

通过 stdin 和 ssh

如果磁盘空间不足,无法将压缩的转储文件复制到服务器,请使用以下ssh命令进行调用:

xzcat dumpFile.xz |ssh -T user@dbserver pg_restore ... 

通过网络进行 pg_restore

另一种方法是重新配置您的 postgreSQL 数据库以允许从本地工作站进行连接。在这种情况下,您可以pg_restore在本地系统上使用并设置PGHOST, PGPORT, PGUSER正确的值。

拆分垃圾

  1. 将转储下载到具有足够磁盘空间的机器上。
  2. 使用split命令(或任何类似工具)将其切割成更小的碎片。
  3. 从数据库服务器中删除转储。
  4. 在数据库服务器上创建一个等待接收部分转储文件的作业,例如

    while sleep 10
    do 
      if [ -r dumpPart ] 
      then 
        cat  dumpPart 
        echo "next part is loaded" >&2
        rm -f dumpPart
      fi
    done | pg_restore ....
    
  5. 逐步上传转储部分,目标名称为 dumpPart。确保速度合理低于上述 sleep 语句。

相关内容