我生成了一个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个小时!
当然,我正在谈论相同的硬件规格(戴尔Studio XPS)。 相同的RAM,CPU等
在这两种情况下,我使用PostgreSQL 8.4.7的开箱即用configuration。
也许发行版的configuration是不同的…也许有些优化,只是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秒。 (问题解决了?…差不多)似乎数据库的家伙使用不同的选项导出原始转储。 也许 – 插入选项?
Windows和Ubuntu使用原始转储之间的巨大差异仍然困扰着我的思想。 对此有何想法?
即使是一个小时,对于21 MB的小型转储文件来说也是非常长的。 我们正在恢复大约30分钟的2 GB压缩转储文件的数据库,但我们可能有更好的硬件;-)
你应该先读什么:
http://www.postgresql.org/docs/8.4/static/populate.html
这是关于你的问题。 它告诉你如何快速地清理数据库。
附加提示:
了解更多信息:
编辑:我错过了你说的转储只是21MB,甚至没有压缩。 即使是1小时也是很长时间才能恢复的数据量。 你能否对转储中包含的内容进行说明? 什么样的表结构,多less索引和什么样的? function指标? GiST / GIN索引? 转储恢复后生成多less数据?
PostgreSQL邮件列表可能是讨论这个问题的好地方。
就资源需求而言,默认的PostgreSQLconfiguration非常保守。 这意味着在批量加载时,它必须执行非常频繁的检查点(您的Postgres日志可能已满检查点警告)。
我怀疑Windows上的PostgreSQL可能无法正确地将所有内容刷新到磁盘,因此检查点不会影响性能。 如果这是真的,这对于数据库完整性当然是不利的。
如果我的假设是真实的,在Ubuntuconfiguration中将checkpoint_segments高达50,应该使其与Windows类似。 (还有很多其他的可调参数,但这是批量加载最重要的一个)
另外,在您的Ubuntu安装中, SHOW wal_sync_method说什么? 它应该是fdatasync的最佳性能,但有些版本默认为open_datasync 。
尝试在你的postgresql.conf文件中closuresautovacuum。
如果这没有帮助,请尝试对光盘进行碎片整理。
另外,我想知道两种情况下的文件系统是什么?