我们每晚都会使用 pg_dump 来制作数据库快照。我们用一个简单的命令做了很长时间
pg_dump -Fc database_name
这大约需要一个小时并生成一个30+GByte的文件。
我们如何才能加快进程?
答案1
我们最大的表以列的形式包含原始图像数据bytea
。
当我们从 psql 对该表执行简单的 COPY 操作时stdout
,速度非常快(1 或 2 分钟),但使用 pg_dump 时速度非常慢。耗时约 60 分钟。
所以在调查这件事时,我偶然发现了这个讨论。如果数据已经压缩,pg_dump 压缩似乎会相当慢,就像字节格式的图像数据一样。最好在 pg_dump 之外进行压缩(-Z0)。
此外,我们发现我们可以利用多核 CPU(-j 10
和 pigz-p 10
使用 10 个核心。您可以选择不同数量的核心)。
所以现在我们这样做:
$ pg_dump -Z0 -j 10 -Fd database_name -f dumpdir
$ tar -cf - dumpdir | pigz -p 10 > dumpdir.tar.gz
$ rm -r dumpdir
时间从约 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