在 PostgreSQL 8.3 上备份并在 PostgreSQL 9.4 中还原后,数据库大小减少

Pab*_*ruz 8 postgresql disk-space restore

pg_dump在 PostgreSQL 8.3 服务器中托管的 JIRA 数据库上做了一个。数据库后的尺寸vacuum full217132652(大约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 允许更少的锁定,这基本上意味着您可以节省 时间。但是您空间方面付出了代价

  1. EveryUPDATE等价于 anINSERT和 a DELETE,两者都有相关的开销(至少在使用的空间方面)。
  2. 当您有多个事务在运行,并且每个事务都在INSERTing、UPDATEing 或DELETEing 时,您会同时拥有涉及的每一行的多个副本。
  3. 分配给这些行版本的空间不会在提交后立即释放,并且在一段时间内,将是存储表数据(和索引)的文件中未使用的空间

Autovacuum负责在默认情况下使这个空间可重复使用,或者您可以有一些特定的程序来进行常规吸尘

这个事实已经可以解释尺寸变化了。

版本之间的优化也可能发生了;并且可以解释进一步的改进。也可以针对速度而不是大小进行优化,实际大小实际上可以从一个版本增长到下一个版本。我真的不知道具体可以说出来;尽管@Erwin 的评论指出,自 8.3 版以来,使您的表缩小的更改和使您的表膨胀(增长)的更改都发生了。

为了区分这两种效果,如果您好奇,您可以像@Jack Douglas 建议的那样,在 8.3 上恢复您的数据库。它很可能会缩小尺寸。如果它缩小到小于 151 MB9.4 版本更小),那么删除未使用的空间会使您的数据库缩小,而版本更改实际上使您的数据库增长。


为了更好地理解 MVCC,请查看Bruce Momjian 的演示文稿