备份Postgresql数据库的最佳方法

时间:2020-06-11 15:58:07

标签: database postgresql database-backups postgresql-9.6

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

当前,我每小时使用服务器上的pg_dump备份服务器。这个过程可能会花费您期望的时间,但是这个问题的原因是该过程消耗了大量的CPU,这意味着我们经常看到一天中性能下降。

我们的pg_dump像这样运行,以分别为每个表以及所有表的单个转储生成一个转储:

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" > $1/$table.bak;
done;
pg_dump -Fc -d "XXX" > $1/all_tables.bak;

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

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

任何建议将不胜感激!

1 个答案:

答案 0 :(得分:1)

如果要按小时粒度进行备份,则可能应该使用pg_basebackup和WAL归档(或流,带有副本的归档)来创建物理备份,而不要使用pg_dump来创建逻辑备份。然后,您可以使用PITR还原到几乎所需的任何时间点。您偶尔需要进行一次新的基础备份,以减少还原时间,但几乎可以肯定不是每小时一次。另外,pg_basebackup的CPU负载较低(除了压缩,如果通过网络运行pg_basebackup,则在本地端而不是数据库端完成)。