pg_restore比pg_dump花费更长的时间


9

我定期保存并稍后还原用于测试的较小的PostgreSQL数据库。测试会定期更新其数据,然后必须进行新的转储,并定期使用转储以良好定义的状态重新创建数据库。

我注意到转储(使用pg_dump -Fc database)仅需花费几秒钟,而还原(pg_restore -d database)则需要大约一分钟。这看起来很奇怪。我本来希望这两个过程都花费大约相同的时间(假设两个任务都受I / O约束)。

还原是否存在问题?我可以加快速度吗?还是恢复比转储花费更长的时间是正常的?(如果是,那为什么呢?)

转储文件通常具有大约3-4 MiB;DBMS是PostgreSQL V8.4,在Ubuntu Linux下运行于具有1GiB RAM的Pentium4 3GHz上。

Answers:


9

索引的内容不是备份的一部分,仅是索引的定义。这将只需要几个字节。在还原过程中创建索引并为所有数据建立索引后,它会更大。这将需要时间,但是要取决于您的情况需要多少时间。

pg_restore确实有一个用于并发还原的选项(从8.4版开始),使用--jobs=number-of-jobs


有趣,谢谢。是否还有一种方法可以转储索引以加快还原速度(以较大的转储文件为代价)?
sleske 2011年

不,索引的内容不能作为备份的一部分。对于像您这样的小型数据库(3-4 MiB),无论如何这都不是问题。
Frank Heikens'3

附加信息:pg_dump无权访问索引的内容。pg_dump使用SELECT语句获取表的所有内容和系统表的内容以创建备份。它只是一些SELECT语句和一些将结果写入磁盘的函数的包装。
Frank Heikens 2011年

@弗兰克:谢谢。不知道pg_dump的实现。在我们的情况下,加快还原速度将很有帮助,因为它需要作为自动化测试的一部分重复运行,因此将还原时间从1分钟降低到10s会有所帮助。但这显然是不可行的。我必须找到其他解决方案...
sleske 2011年

2
@sleske您可以尝试使用文件系统备份方法。这应该保留索引,并且此外,备份和还原的运行速度可能会更快
Stefano

4

为了进行还原,数据库必须完成许多其他工作:

立即想到一些事情:

  • 写作比阅读慢
  • 解析输入需要时间
  • 更新索引和其他内部结构
  • 维护参照完整性

不过,不确定这是否等于该时差。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.