Pab*_*ruz 8 postgresql disk-space restore
我pg_dump
在 PostgreSQL 8.3 服务器中托管的 JIRA 数据库上做了一个。数据库后的尺寸vacuum full
为217132652
(大约207 MB)。
然后我使用以下命令在 PostgreSQL 9.4 服务器上恢复了 JIRA 数据库:
$ psql -X -v ON_ERROR_STOP=1 -d jira2 -U jira -h localhost < jiradb2017_03_12.sql
Run Code Online (Sandbox Code Playgroud)
我假设自从我使用 以来,任何错误都会退出恢复ON_ERROR_STOP=1
,但 SQL 脚本正确完成(尽管有一些与数据恢复无关的警告)。
我最终得到了一个大小为158019348
(大约 151 MB)的数据库。
那么,这里有什么故事呢?我是否可以假设数据库已成功恢复并且 PostgreSQL 优化了其存储(介于 8.3 和 9.4 版本之间)引擎并且更有效地使用了空间?
joa*_*olo 10
当你恢复一个数据库时,你的所有信息都被打包了,行之间(或索引中)没有空格,除非有一些特定的设置(基本上:FILLFACTOR
用于表和FILLFACTOR
索引)。
另一方面,当您的数据库已经使用了一段时间,并且您已经拥有了插入、更新和删除的份额时,就会出现空闲的未使用空间。这是因为 PostgreSQL 和多版本并发控制,又名 MVCC 的工作方式。MVCC 允许更少的锁定,这基本上意味着您可以节省 时间。但是您在空间方面付出了代价:
UPDATE
等价于 anINSERT
和 a DELETE
,两者都有相关的开销(至少在使用的空间方面)。INSERT
ing、UPDATE
ing 或DELETE
ing 时,您会同时拥有涉及的每一行的多个副本。Autovacuum负责在默认情况下使这个空间可重复使用,或者您可以有一些特定的程序来进行常规吸尘。
这个事实已经可以解释尺寸变化了。
版本之间的优化也可能发生了;并且可以解释进一步的改进。也可以针对速度而不是大小进行优化,实际大小实际上可以从一个版本增长到下一个版本。我真的不知道具体可以说出来;尽管@Erwin 的评论指出,自 8.3 版以来,使您的表缩小的更改和使您的表膨胀(增长)的更改都发生了。
为了区分这两种效果,如果您好奇,您可以像@Jack Douglas 建议的那样,在 8.3 上恢复您的数据库。它很可能会缩小尺寸。如果它缩小到小于 151 MB(比9.4 版本更小),那么删除未使用的空间会使您的数据库缩小,而版本更改实际上使您的数据库增长。
为了更好地理解 MVCC,请查看Bruce Momjian 的演示文稿。
归档时间: |
|
查看次数: |
1192 次 |
最近记录: |