![pg_restore 所花的时间比 pg_dump 长得多](https://linux22.com/image/541413/pg_restore%20%E6%89%80%E8%8A%B1%E7%9A%84%E6%97%B6%E9%97%B4%E6%AF%94%20pg_dump%20%E9%95%BF%E5%BE%97%E5%A4%9A.png)
我经常保存并恢复一个用于测试的小型 PostgreSQL 数据库。测试结果会定期更新其数据,然后必须进行新的转储,并定期使用转储重新创建处于明确状态的数据库。
我注意到转储(使用pg_dump -Fc database
)仅需几秒钟,但恢复(pg_restore -d database
)则需要大约一分钟。这似乎很奇怪。我原本以为这两项任务需要大约相同的时间(假设两项任务都受 I/O 限制)。
恢复过程中是否存在问题?我可以让它更快吗?或者恢复过程比转储过程花费的时间更长是正常的吗?(如果是,那么为什么?)
转储文件通常大约有 3-4 MiB;DBMS 是 PostgreSQL V8.4,在 Ubuntu Linux 下具有 1GiB RAM 的 Pentium4 3GHz 上运行。
答案1
索引的内容不是备份的一部分,只是索引的定义。而且这只会占用几个字节。如果在恢复期间创建索引并索引所有数据,那么索引会大得多。这会花费一些时间,但具体需要多少时间取决于您的情况。
pg_restore确实有一个并发恢复选项(从 8.4 版开始),使用--jobs=number-of-jobs
答案2
为了恢复,数据库必须做很多额外的工作:
我立即想到了一些事情:
- 写比读慢
- 解析输入需要时间
- 更新索引和其他内部结构
- 维护引用完整性
但不确定这是否相当于时差。