加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-13 18:03:59 所属栏目:百科 来源:网络整理
导读:我使用pg_dump到“.sql”文件备份了我的PostgreSQL数据库. 当我恢复数据库时,其大小为2.8GB,而源(原始)数据库为3.7GB.访问数据库的应用程序似乎工作正常. 减少恢复数据库的大小的原因是什么? 简而言之,数据库存储的速度比空间更优化. 例如,如果您在表中插入
我使用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 ('information_schema','pg_catalog')
 ) tbl
 Group By oid
 Order By pg_relation_size(oid) Desc,sum(free) Desc;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读