备份 postgresql 数据库的最佳方法

Most optimal way to backup postgresql database

我有一个中等流量的中型数据库 (postgresql 9.6)。数据库位于虚拟服务器上,描述为具有 4cpu 内核和 8192mb 内存。

目前我在服务器上使用 pg_dump 每小时备份一次服务器。如您所料,此过程可能需要一些时间,但出现此问题的原因是该过程消耗了大量 CPU,这意味着我们经常会看到全天性能下降。

我们的 pg_dump 就像这样 运行,为每个 table 单独生成转储,以及所有 table 的单个转储:

for table in $(psql -d "XXX" -t -c "SELECT table_name FROM information_schema.tables WHERE table_type = 'BASE TABLE' AND table_schema = 'public'");
    do pg_dump -Fc -t $table -d "XXX" > /$table.bak;
done;
pg_dump -Fc -d "XXX" > /all_tables.bak;

所以我的问题是:如何优化备份过程?理想情况下,我正在寻找 CPU.

方面的最佳流程

到目前为止,我已经尝试了一些方法,例如尝试将转储过程卸载到另一台服务器,但我发现结果有限...

如有任何建议,我们将不胜感激!

如果你想以小时为粒度进行备份,你应该使用 pg_basebackup 和 WAL 归档(或流式传输,从副本归档)来创建物理备份,而不是 pg_dump 创建逻辑的。然后您可以使用 PITR 恢复到几乎任何您想要的时间点。您将不得不偶尔进行新的基本备份以缩短恢复时间,但几乎可以肯定不是每小时一次。此外,pg_basebackup 具有较低的 CPU 负载(除了压缩,但如果您通过网络 运行 pg_basebackup,则压缩是在本地而不是数据库端完成的)。