Postgresql 13 - 将 pg_dump 速度从 70 分钟加快到 5 分钟

Jan*_*ing 13 postgresql pg-dump

我们每晚使用 pg_dump 来制作数据库的快照。我们用一个简单的命令就做了很长时间

pg_dump -Fc database_name

这大约需要一个小时,并生成一个 30+GByte 的文件。

我们怎样才能加快速度?

Jan*_*ing 23

我们最大的表包含列形式的原始图像数据bytea

当我们从 psql 对此表进行简单的 COPY 到 时stdout,速度相当快(1 或 2 分钟),但使用 pg_dump 则非常慢。花了大约 60 分钟。

因此,我对此进行了调查,偶然发现了这个讨论。如果数据已经像 bytea 格式的图像数据一样被压缩,那么 pg_dump 的压缩速度会相当慢。最好在 pg_dump (-Z0) 之外进行压缩。

此外,我们发现我们可以利用我们的多核 cpu(-j10 和 pigz -p 10 使用 10 个核心。您可以选择不同数量的核心)。

所以现在我们这样做:

$ pg_dump -Z0 -j 10 -Fd database_name -f dumpdir
$ tar -cf - dumpdir | pigz -p 10 > dumpdir.tar.gz
$ rm dumpdir
Run Code Online (Sandbox Code Playgroud)

时间从约 70 分钟缩短到约 5 分钟。相当惊人。

您可以像这样恢复它:

$ mkdir -p dumpdir
$ pigz -p 10 -dc dumpdir.tar.gz | tar -C dumpdir --strip-components 1 -xf -
$ pg_restore -j 10 -Fd -O -d database_name dumpdir
Run Code Online (Sandbox Code Playgroud)

  • @JosePaez 也许问题是 -j 选项。我在文档中读到: _pg_dump -j 使用多个数据库连接;[..]。如果没有同步快照功能,则无法保证不同的工作作业在每个连接中看到相同的数据,这可能会导致**不一致的备份**。_ (2认同)