2

我目前的任务是改进数据库结构。为此,我们希望有效地转储和恢复一个巨大的数据库。(大约 1TB 并且还在增长

为了测试这个数据库,我们想把这个数据库转移到另一个服务器节点,并通过pg_dumpand pg_restore.

我们正在运行 v10 ( https://www.postgresql.org/docs/10/app-pgdump.html ) 服务器,因此我们仅限于它们可能的参数。还需要转储整个数据库,而不仅仅是部分。

为此,我尝试了几种方法,这些来源有很大帮助:

最重要的是:

问题是,您几乎只能改进其中一项任务,但不能同时改进两者。

情况1

以目录格式转储速度非常快(约 1 小时),但恢复速度却不是。

pg_dump --blobs --dbname="$DBNAME" --file=$DUMPDIR --format=directory --host=$SERVERHOSTNAME --jobs=$THREADS --port=$SERVERPORT--username="$SERVERUSERNAME"
pg_restore --clean --create --format=directory --jobs=$THREADS --host=$SERVERHOSTNAME --port=$SERVERPORT --username="$SERVERUSERNAME" "./"

这种恢复方法的问题是,即使我为它分配了多个核心,它也只使用一个,服务器核心上使用的 CPU 几乎没有 4%。

案例2

以自定义格式转储非常慢,服务器甚至无法在一夜之间完成(会话超时)。

pg_dump --blobs --compress=9 --dbname="$dbname" --file="$DUMPDIR/db.dump" --format=custom --host=$SERVERHOSTNAME --port=$SERVERPORT --username=$SERVERUSERNAME

所以我想到了不同的方法:

  1. 用方法 #1 转储它,然后转换它(如何?)并使用更快的恢复方法(变体 #2?)
  2. 在不同的核心上同时创建多个转储但具有不同的模式(总共有 6 个),然后将它们合并回来(如何?)

根据上述作者的说法,管道似乎是一种无效的倾销方式。

有没有人在这方面有更多经验?我的方法想法有用吗,还是您有完全不同的解决方案?

哦,在我忘记之前:我们目前在外部服务器上限制为 5TB,运行 db 的内部服务器不应该因为数据片段而变得臃肿,即使是暂时的。

4

1 回答 1

3

与目录格式并行pg_restore应该可以加快处理速度。

如果不是,我怀疑大部分数据都在一个大表中,pg_restore(和pg_dump)不能并行化。

确保禁用压缩 ( -z 0) 以提高速度(除非您的网络较弱)。

使用在线文件系统备份可能会快得多:

  • pg_basebackup很简单,但不能并行化。

  • 使用低级 API,您可以将备份与操作系统或存储技术并行化。

缺点是使用文件系统备份,只能复制整个数据库集群。

于 2019-03-14T14:30:27.057 回答