为什么 pg_restore 在 Ubuntu 上比在 Windows 上花费的时间更长?

为什么 pg_restore 在 Ubuntu 上比在 Windows 上花费的时间更长?

我生成了一个大约 21 MB 的转储文件:

pg_dump --format=tar --verbose --file=database.backup mydatabase

当我在 Windows 上导入此文件时执行以下操作:

pg_restore --dbname mydatabase --verbose database.backup

需要1小时才能完成。

在 Ubuntu 10.10 64 位机器上执行相同操作大约需要 7 个小时!

当然,我说的是相同的硬件规格(Dell Studio XPS)。相同的 RAM、CPU 等。

在这两种情况下,我都使用 PostgreSQL 8.4.7 的开箱即用配置。

也许发行版的配置不同...也许是 Windows 发行版正在做的某些优化?


额外信息:在 Windows 7 上 -> NTFS。在 Ubuntu 10.10 上 -> ext4


当我做

pg_dump --format=tar --verbose --file=workspace/work/dumps/loaded.backup mydb

只需 5 秒钟!如果我在空的新数据库上进行恢复,请执行以下操作:

pg_restore --dbname mydb-2 --verbose workspace/work/dumps/loaded.backup

只需 10 秒。(问题解决了?... 差不多)看来数据库人员使用不同的选项导出了原始转储。也许是 --inserts 选项?

Windows 和 Ubuntu 使用原始转储之间的巨大差异仍然困扰着我。对此有什么看法?

答案1

对于 21 MB 的小转储文件来说,即使一个小时也太长了。我们正在大约 30 分钟内恢复 2 GB 压缩转储文件的数据库,但我们可能有更好的硬件 ;-)

您应该首先阅读的内容:

http://www.postgresql.org/docs/8.4/static/populate.html

这完全是关于你的问题。它告诉你如何快速填充数据库。

附加尖端:

  • 首先启用所有具有持续时间的语句的日志记录,然后查看发生了什么
  • 增加 shared_buffers,ubuntu 10.10 上的默认值只有 24 MB,请参阅http://www.postgresql.org/docs/8.4/static/kernel-resources.html#SYSVIPC配置你的 Linux 系统以接受更高的值
  • 使用 --format=custom 或 -Fc 进行转储。这是最佳选择
  • 你可以使用“-j”在多个 CPU 上运行 pg_restore,但我猜你还有其他问题,无法获得最后的性能

了解更多信息:

答案2

编辑:我没注意到你说的转储只有 21MB,甚至没有压缩。即使是 1 小时也是非常恢复这么多数据需要很长时间。您能解释一下转储包含什么吗?什么样的表结构,有多少个索引以及什么类型的索引?功能索引?GiST/GIN 索引?恢复转储后会生成多少数据?

PostgreSQL 邮件列表可能是讨论此问题的更好的地方。

旧帖

默认的 PostgreSQL 配置在资源需求方面非常保守。这意味着在批量加载期间,它必须执行非常频繁的检查点(您的 Postgres 日志可能充满了检查点警告)。

我怀疑 Windows 上的 PostgreSQL 可能无法正确地将所有内容刷新到磁盘,因此检查点对性能的影响不大。如果真是这样,那么这对数据库完整性当然是不利的。

如果我的假设正确,那么checkpoint_segments在 Ubuntu 配置中将其增加到 50 应该会使其性能与 Windows 类似。(还有很多其他可调参数,但这是批量加载最重要的一个)

另外,SHOW wal_sync_method您的 Ubuntu 安装上写的是什么?它应该是fdatasync为了获得最佳性能,但有些版本默认为open_datasync

答案3

尝试在 postgresql.conf 中关闭自动清理。

如果这没有帮助,请尝试对磁盘进行碎片整理...

另外,我想知道这两种情况下的文件系统是什么?

相关内容