首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PostgreSQL -还原的数据库比原来的要小

PostgreSQL -还原的数据库比原来的要小
EN

Stack Overflow用户
提问于 2015-03-24 15:02:39
回答 2查看 4K关注 0票数 6

我使用PostgreSQL将pg_dump数据库备份为".sql“文件。还原数据库时,它的大小为2.8GB,而源(原始)数据库的大小为3.7GB。访问数据库的应用程序似乎运行良好。

还原的数据库更小的原因是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-24 15:14:25

简单地说,数据库存储在速度上比空间上更优化。

例如,如果将100行插入到表中,然后删除带有奇数ID的每一行,则DBMS可以写出一个只有50行的新表,但更有效的方法是将已删除的行标记为空闲空间,并在下次插入行时重用它们。因此,这张桌子占用的空间是目前所需的两倍。

Postgres使用"MVCC“(而不是锁定)来进行事务管理,这使得这种可能性更大,因为更新通常涉及将一个新行写入存储,然后在没有事务正在查看时标记已删除的旧行。

通过转储和还原数据库,您将重新创建一个没有所有这些空闲空间的DB。这本质上就是VACUUM FULL命令所做的-它将当前数据重写为一个新文件,然后删除旧文件。

有一个pg_freespace,它允许您检查其中的一些内容。例如,您可以列出主表大小(不包括存储在单独的“敬司”表中的索引和列)和每个表使用的空闲空间,如下所示:

代码语言:javascript
复制
Select oid::regclass::varchar as table,
      pg_size_pretty(pg_relation_size(oid)/1024 * 1024) As size,
      pg_size_pretty(sum(free)) As free
 From (
   Select c.oid,
       (pg_freespace(c.oid)).avail As free
     From pg_class c
     Join pg_namespace n on n.oid = c.relnamespace
    Where c.relkind = 'r'
      And n.nspname Not In ('information_schema', 'pg_catalog')
 ) tbl
 Group By oid
 Order By pg_relation_size(oid) Desc, sum(free) Desc;
票数 11
EN

Stack Overflow用户

发布于 2015-03-24 15:08:12

原因很简单:在其正常操作期间,当行被更新时,PostgreSQL会添加该行的新副本,并将该行的旧副本标记为已删除。这是多版本并发控制(MVCC)在行动.然后,VACUUM收回旧行为将来可以插入的数据占用的空间,但不会将这个空间返回给操作系统,因为它位于文件的中间。请注意,只有在表中修改了足够多的数据或从表中删除了足够的数据之后,VACUUM才会立即执行。

你看到的是完全正常的。它只是显示PostgreSQL数据库的大小将大于行大小之和。当您开始积极使用数据库时,您的新数据库很可能最终会增长到3.7GB。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29236005

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档