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

Nas*_*ash 6 postgresql

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

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

IMS*_*SoP 8

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

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

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

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

有一个与Postgres一起分发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;
Run Code Online (Sandbox Code Playgroud)