微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PostgreSQL – 恢复的数据库比原始数据库小

我使用pg_dump到“.sql文件备份了我的Postgresql数据库.
当我恢复数据库时,其大小为2.8GB,而源(原始)数据库为3.7GB.访问数据库的应用程序似乎工作正常.

减少恢复数据库的大小的原因是什么?

简而言之,数据库存储的速度比空间更优化.

例如,如果您在表中插入100行,然后删除每个具有奇数编号ID的行,则DBMS可以写出仅包含50行的新表,但是将删除的行标记为可用空间会更有效并在下次插入行时重用它们.因此,该表占用的空间是目前所需的两倍.

Postgres使用“MVCC”,而不是锁定,用于事务管理使得这更有可能,因为UPDATE通常涉及将新行写入存储,然后在没有事务查看它时将旧行标记删除.

通过转储和还原数据库,您将重新创建没有所有可用空间的数据库.这基本上是VACUUM FULL命令的作用 – 它将当前数据重写为新文件,然后删除文件.

一个extension distributed with Postgres called pg_freespace可以让你检查一些.例如您可以列出主表大小(不包括存储在单独的“TOAST”表中的索引和列)以及每个表使用的可用空间,如下所示:

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 ('@R_871_4045@ion_schema','pg_catalog')
 ) tbl
 Group By oid
 Order By pg_relation_size(oid) Desc,sum(free) Desc;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐