我生成了一个大约 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,但我猜你还有其他问题,无法获得最后的性能
了解更多信息:
- 阅读优秀在线文档
- 买Postgresql 9.0 高性能(与您的问题无关,它只是一本适合经验丰富的 PostgreSQL DBA 的优秀书籍)
答案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 中关闭自动清理。
如果这没有帮助,请尝试对磁盘进行碎片整理...
另外,我想知道这两种情况下的文件系统是什么?