精华内容
下载资源
问答
  • VacuumVacuum Full 的处理过程

    千次阅读 2019-03-29 15:13:00
     Vacuum FullVacuum最大的不同就是,Vacuum Full是物理删除dead tuples,并把释放的空间重新交给操作系统,所以在vacuum full后,表的大小会减小为实际的空间大小。其处理过程和vacuum大不相同,处理步骤如下: ...

    对于数据库系统的并发控制,PostgreSQL采用MVCC(多版本并发控制)进行处理。这种机制有一个缺点,就是随着时间的推移,数据文件中积累的dead tuples会越来越多。怎么去清理这些dead tuples,这个时候就需要vacuum处理。

    PostgreSQL系统的vacuum是一个例行性的维护过程,系统也会在启动服务时启动autovacuum守护进程对此进行维护,当然也有vacuum命令可以让用户进行手动执行vacuum操作。除了清理dead tuples,vacuum还有冻结事务ID的功能,因为现在PostgreSQL的事务ID只支持32位(大概40亿个事务),当事务ID达到最大值后,它会重新从0开始,这时以前的事务都会变成“未来”的事务变得不可见。

    下面主要介绍vacuum清理dead tuples的过程。 在清理dead tuples时,系统有两种处理方式:vacuum 和 vacuum full。主要区别在如下:

    vacuum vacuum full

    只是把表中的dead tuples进行删除标记,并没有真正物理删除;vacuum过程中,可以正常访问数据表

    物理删除表中的dead tuples,释放空间给操作系统;vacuum full过程中,表被锁定,不允许访问

    Vacuum过程

    vacuum的执行过程主要分为以下三步:

        1. 清除dead tuples指向的index tuples

            该过程中,vacuum会顺序扫描目标表,并构建一个dead tuples组成的list链表,该list链表会存储在maintenance_work_mem缓存中。然后vacuum根据dead  tuples list移除dead tuples指向的index。

        2. 移除dead tuples,更新VM和FSM

            这里的移除dead tuples只是标记为可重用该空间,并没有真正物理删除。所以vacuum清理表后,表的实际空间并没有减小。dead tuples在做移除标记后,vacuum会重新排列剩余的元组以进行碎片化整理。然后,需要更新目标表的VM(可见性映射文件)和FSM(空闲空间映射文件)。

        3. 更新统计信息和相关系统表

            最后,需要更新vacuum目标表的统计信息(以适应最新的查询优化)和相关系统表。

    Vacuum Full过程

        Vacuum Full和Vacuum最大的不同就是,Vacuum Full是物理删除dead tuples,并把释放的空间重新交给操作系统,所以在vacuum full后,表的大小会减小为实际的空间大小。其处理过程和vacuum大不相同,处理步骤如下:

        1.  vacuum full开始执行时,系统会先对目标创建一个AccessExclusiveLock ,不允许外界再进行访问(为后面拷贝做准备),然后创建一个表结构和目标表相同的新表。

        2. 扫描目标表,把表中的live tuples 拷贝到新表中。

        3. 删除目标表,在新表上,重新创建索引,更新VM, FSM以及统计信息,相关系统表等。

        所以,vacuum full的本质是生成一个新的数据文件,然后把原有表的live tuples存放到该数据文件中。对比vacuum, vacuum full缺点就是在执行期间不能对表进行访问,由于需要往新表中导入live tuples数据,其执行效率也会很慢。优点是执行后,表空间只存放live tuples,没有冗余的dead tuples,在执行查询效率上会有所提高。

     

    AutoVacuum守护进程

        由于vacuum是数据库系统的一个例行性维护,所以系统启动后,会开启一个autovacuum守护进程专门对此处理。autovacuum清理进程一般用vacuum而避免使用vacuum full。理由是,vacuum尽管可以保持表的最小尺寸,但是如果表还有继续增长的空间,这么做就意义不大了,特别是对于频繁写入的表。而且vacuum在执行效率上也比vacuum full好。

        上面所说的autovacuum进程是一个launcher进程,它不进行vacuum操作,它负责启动vacuum worker进程,然后由vacuum worker进程进行相应的vacuum和analyze操作。

                                                    6d3a60b6d87741180bd4914ba18176430cc.jpg

    autovacuum进程会在每autovacuum_naptime时间间隔内为数据库启动autovacuum worker进程。然后每个worker进程会检查数据库中的每一个表,在需要时执行vacuum或analyze操作。如果有N个数据库,则每 autovacuum_naptime/N秒将启动一个新worker进程,在同一时间只允许最多autovacuum_max_workers 个worker进程运行,如果有超过autovacuum_max_workers 个数据库需要被处理,下一个数据库将在第一个worker结束后马上被处理。

    转载于:https://my.oschina.net/tianbing/blog/3029706

    展开全文
  • Postgresql之VACUUMVACUUM FULL对比

    万次阅读 2018-03-08 22:10:27
    VACUUM命令存在两种形式,VACUUMVACUUM FULL,它们之间的区别见如下表格:无VACUUMVACUUMVACUUM FULL删除大量数据之后只是将删除数据的状态置为已删除,该空间不能记录被重新使用。如果删除的记录位于表的末端,其...

    作者:瀚高PG实验室 (Highgo PG Lab)- 波罗

    VACUUM命令存在两种形式,VACUUM和VACUUM FULL,它们之间的区别见如下表格:

     

    VACUUM

    VACUUM

    VACUUM FULL

    删除大量数据之后

    只是将删除数据的状态置为已删除,该空间不能记录被重新使用。

    如果删除的记录位于表的末端,其所占用的空间将会被物理释放并归还操作系统。如果不是末端数据,该命令会将指定表或索引中被删除数据所占用空间重新置为可用状态,那么在今后有新数据插入时,将优先使用该空间,直到所有被重用的空间用完时,再考虑使用新增的磁盘页面。

    不论被删除的数据是否处于数据表的末端,这些数据所占用的空间都将被物理的释放并归还于操作系统。之后再有新数据插入时,将分配新的磁盘页面以供使用。

    执行效率

     

    由于只是状态置为操作,因此效率较高。

    在当前版本的PostgreSQL(v9.1)中,该命令会为指定的表或索引重新生成一个数据文件,并将原有文件中可用的数据导入到新文件中,之后再删除原来的数据文件。因此在导入过程中,要求当前磁盘有更多的空间可用于此操作。由此可见,该命令的执行效率相对较低。

    被删除的数据所占用的物理空间是否被重新规划给操作系统。

    不会

    不会

    在执行VACUUM命令时,是否可以并发执行针对该表的其他操作。

     

    由于该操作是共享锁,因此可以与其他操作并行进行。

    由于该操作需要在指定的表上应用排它锁,因此在执行该操作期间,任何基于该表的操作都将被挂起,知道该操作完成。

    推荐使用方式

    在进行数据清空时,可以使用truncate操作,因为该操作将会物理的清空数据表,并将其所占用的空间直接归还于操作系统。

    为了保证数据表的磁盘页面数量能够保持在一个相对稳定值,可以定期执行该操作,如每天或每周中数据操作相对较少的时段。

    考虑到该操作的开销,以及对其他错误的排斥,推荐的方式是,定期监控数据量变化较大的表,只有确认其磁盘页面占有量接近临界值时,才考虑执行一次该操作。即便如此,也需要注意尽量选择数据操作较少的时段来完成该操作。

    执行后其它操作的效率

    对于查询而言,由于存在大量的磁盘页面碎片,因此效率会逐步降低。

    相比于不执行任何VACUUM操作,其效率更高,但是插入的效率会有所降低。

    在执行完该操作后,所有基于该表的操作效率都会得到极大的提升。

    展开全文
  • PostgreSQL的autovacuum 与 vacuum full

    千次阅读 2015-08-06 14:44:04
    首先要了解 vacuumvacuum all的区别: vacuum 就是进行扫除,找到那些旧的“死”数据,把它们所知的行标记为可用状态。...vacuum full,就是除了 vacuum,还进行空间合并,因此它需要lock table。 而

    尊重原创:http://www.cnblogs.com/gaojian/p/3272620.html

    首先要了解 vacuum 与  vacuum all的区别:

    vacuum 就是进行扫除,找到那些旧的“死”数据,把它们所知的行标记为可用状态。但是它不进行空间合并。

    vacuum full,就是除了 vacuum,还进行空间合并,因此它需要lock table。

    而 autovacuum,可以理解为 定时自动进行  vacuum 。

    对于有大量update 的表,vacuum full是没有必要的,因为它的空间还会再次增长,所以vacuum就足够了。

    所以说: standard VACUUMs often enough to avoid needing VACUUM FULL

    并且:    The autovacuum daemon attempts to work this way, and in fact will never issue VACUUM FULL. 

    http://www.postgresql.org/docs/9.2/static/routine-vacuuming.html#AUTOVACUUM

    The usual goal of routine vacuuming is to do standard VACUUMs often enough to avoid needing VACUUM FULL. The autovacuum daemon attempts to work this way, and in fact will never issue VACUUM FULL. In this approach, the idea is not to keep tables at their minimum size, but to maintain steady-state usage of disk space: each table occupies space equivalent to its minimum size plus however much space gets used up between vacuumings. Although VACUUM FULL can be used to shrink a table back to its minimum size and return the disk space to the operating system, there is not much point in this if the table will just grow again in the future. Thus, moderately-frequent standard VACUUM runs are a better approach than infrequent VACUUM FULL runs for maintaining heavily-updated tables.

    因此:

    Moderately-frequent standard VACUUM runs are a better approach than infrequent VACUUM FULL runs for maintaining heavily-updated tables.

     关于 VACUUM FULL:

    VACUUM FULL requires exclusive lock on the table it is working on, and therefore cannot be done in parallel with other use of the table. Generally, therefore, administrators should strive to use standard VACUUM and avoid VACUUM FULL.

    VACUUM FULL要写新表、新文件的:

    The standard form of VACUUM removes dead row versions in tables and indexes and marks the space available for future reuse. However, it will not return the space to the operating system, except in the special case where one or more pages at the end of a table become entirely free and an exclusive table lock can be easily obtained. In contrast, VACUUM FULL actively compacts tables by writing a complete new version of the table file with no dead space. This minimizes the size of the table, but can take a long time. It also requires extra disk space for the new copy of the table, until the operation completes.

    对于 大量 update/delete 的表,普通的vacuum可能是不合适的,此时需要VACUUM FULL:

    (有点前后矛盾,可能是指数据变更量更大的情况)

    Plain VACUUM may not be satisfactory when a table contains large numbers of dead row versions as a result of massive update or delete activity. If you have such a table and you need to reclaim the excess disk space it occupies, you will need to use VACUUM FULL, or alternatively CLUSTER or one of the table-rewriting variants of ALTER TABLE. These commands rewrite an entire new copy of the table and build new indexes for it. All these options require exclusive lock.

     


    展开全文
  • 我们知道,postgresql(以下简称pg)多版本控制mvcc和oracle有所不同,oracle通过回滚段实现,数据更新之前先将旧版本数据写入回滚段,然后再将待更新数据写入...vacuum的作用则是回收这些这些无效的空间。 vacuum命令

    我们知道,postgresql(以下简称pg)多版本控制mvcc和oracle有所不同,oracle通过回滚段实现,数据更新之前先将旧版本数据写入回滚段,然后再将待更新数据写入原data block,而pg mvcc则是当元组发生更改时,直接在原数据data page插入一条新的记录,同时将原元组逻辑上标识为删除,这些标识为删除的元组也叫死元组。这就导致当进行多次更新和删除操作,磁盘上会多出很多死元组,占用了很多磁盘空间并且导致系统性能下降。
    vacuum的作用则是回收这些这些无效的空间。

    vacuum命令

    VACUUM [ ( option [, ...] ) ] [ table_and_columns [, ...] ]
    VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [ ANALYZE ] [ table_and_columns [, ...] ]
    
    其中option可以是下列之一:
    
        FULL [ boolean ]
        FREEZE [ boolean ]
        VERBOSE [ boolean ]
        ANALYZE [ boolean ]
        DISABLE_PAGE_SKIPPING [ boolean ]
        SKIP_LOCKED [ boolean ]
        INDEX_CLEANUP [ boolean ]
        TRUNCATE [ boolean ]
    
    而table_and_columns是:
    
        table_name [ ( column_name [, ...] ) ]
    

    full vacuum和lazy vacuum

    full vacuum:会加上排他锁,这意味着full vacuum期间,读写操作会被阻塞起来。并在执行过程中会生成fraged_pages和vacuum_pages两个链表,fraged_pages是可填充元组的文件块,而vacuum_pages是待清理的死元组文件块。当扫完关系表后,通过fraged_pages对有效元组跨块移动,通过vacuum_pages对死元组进行清理,并把清理后的磁盘空间归还给操作系统。
    lazy vacuum: 不会加上排他锁,读写操作可并行,只是简单死元组块标识为未使用,这些文件块不会归还给操作系统。

    analyze

    更新优化器的统计信息。当一张表(特别是大表)短时间频繁更新,优化器的统计信息是不及时的,或者是不准确的。这样会导致优化器执行查询sql时选择错误的执行计划,导致sql查询性能差。可功过analyze更新指定表(甚至指定列)的统计信息。

    参考文献

    1、http://www.postgres.cn/docs/12/sql-vacuum.html
    2、《postgresql数据库内核分析》

    展开全文
  • VACUUM FULL了解

    千次阅读 2018-02-24 16:53:00
    在上一篇博客的基础上执行vacuum full:mydb=# vacuum full tbl_kenyon ; VACUUM mydb=# select pg_size_pretty(pg_relation_size('tbl_kenyon')); pg_size_pretty ---------------- 1289 MB (1 row) mydb=# ...
  • vacuum表 ... vacuum full 表 1.彻底回收磁盘资源,包括块移动,有排它锁,速度慢 2.将空间碎片后面的数据上移 以下部分转自:https://blog.csdn.net/pg_hgdb/article/details/79490875 ...
  • postgresql vacuum操作

    2020-10-15 21:08:16
    PostgreSQL数据库管理工作中,定期vacuum是一个重要的工作. vacuum的效果: 1.1释放,再利用 更新/删除的行所占据的磁盘空间. 1.2更新POSTGRESQL查询计划中使用的统计数据 1.3防止因事务ID的重置而使非常老的数据丢失...
  • 摘要:本文主要介绍如何进行正常的VACUUM FULL 维护,及时释放磁盘存储。 1、背景 目前根据某项目情况,其DWS的磁盘IO性能低、库内数据量大、对象多、数据膨胀严重。若毫无目的性的进行空间释放,一方面对IO压力很...
  • vacuumvacuum full区别

    2014-05-30 10:34:00
    1:vacuum full会lock table ,vacuum不会。 2:vacuum只是将deadtuple的行的空间转换为能够使用的状态,vacuum full会将这些空间碎片后面的数据上移。 ... ...
  • 摘要:在数据库中用于维护数据库磁盘空间的工具是VACUUM,其重要的作用是删除那些已经标示为删除的数据并释放空间。 vacuum的功能 回收空间 数据库总是不断地在执行删除,更新等操作。良好的空间管理非常重要,...
  • 官方文档 ...个人实验得出的一些总结 1、官方文档说vacuum full会释放磁盘空间,标准VACUUM(即不带FULL)不会,标准VACUUM也能把该表文件空间交还给操作系统的情况:表尾部有空页就能释放这个空页的空间,页包含
  • vacuum清理数据库

    千次阅读 2017-11-14 20:44:43
    因此我们有必须周期地运行 VACUUM, 特别是在常更新的表上,如果没有参数,VACUUM 处理当前数据库里每个表, 如果有参数,VACUUM 只处理那个表,简单的 VACUUM (没有FULL) 只是简单地回收空间并且令其可以再次...
  • Greenplum中的vacuum和analyze

    万次阅读 2014-01-16 11:06:31
    Greenplum中的vacuum和analyze 首先说说vacuum,该选项主要是清理数据库表中的垃圾空间 定义: VACUUM reclaims storage occupied by deleted tuples. In normal Greenplum Database operation, tuples that are ...
  • PostgreSQL中的VACUUM

    2021-04-15 09:04:18
    最近搞了一个公众号PostgreSQL运维技术,欢迎来踩~ 悄悄放一张: PostgreSQL运维技术 ...为了删除死亡元组,VACUUM提供了两种模式,即Concurrent VacuumFull Vacuum。 Concurrent Vacuum通常简称为VACUUM。...
  • postgresql :vacuum full

    2012-01-06 14:30:19
    http://wiki.postgresql.org/wiki/VACUUM_FULL 清理垃圾空间 [code="...请教一个问题:我这边有个表数据内容没有变化,但是运行了一段时间,...对表执行vacuum full就能清理垃圾空间 有没有自动清理...
  • PostgreSQL系统的vacuum是一个例行性的维护过程,系统也会在启动服务时启动autovacuum守护进程对此进行维护,当然也有vacuum命令可以让用户进行手动执行vacuum操作。除了清理dead tuples,vacuum还有冻结事...
  • Greenplum中的VACUUMVACUUM FULL

    千次阅读 2011-02-20 21:17:00
    Greenplum postgresql VACUUM VACUUM FULL
  • HINT: To avoid a database shutdown, execute a full-database VACUUM in DB 这是数据库库龄超出阈值的一个提醒 数据库的年轮值: select datname,age(datfrozenxid) from pg_database; 数据库设置的阀值: ...
  • 在PostgreSQL的各种技术讨论和日常运维中,vacuum基本离不开讨论范围。在日常运维中由于各种原因导致数据库中产生的垃圾数据无法被回收,会造成表/索引的垃圾比例可能一直高于阈值,造成表/索引膨胀。所以在...
  • vacuum 初步使用

    千次阅读 2018-08-07 10:00:16
    postgres=# vacuum verbose tmp_t0; INFO: vacuuming "public.tmp_t0" INFO: "tmp_t0": removed 1780975 row versions in 155570 pages INFO: "tmp_t0": found 1780975 removable, 5930272 nonremovable row ...
  • vacuum操作是一个维护进程, 便于...为了删除dead tuples, vacuum提供了两种模式, 即并发vacuumfull vacuum。并发vacuum(通常简称 “VACUUM”)为表文件的每一页删除dead tuples, 而其他事务可以在此过程中读取...
  • vacuum命令详解

    千次阅读 2020-05-13 15:12:01
    VACUUM收回由死亡元组占用的存储空间。在通常的PostgreSQL操作中,被删除或者被更 新废弃的元组并没有在物理上从它们的表中移除,它们将一直存在直到一次VACUUM被执 行。因此有必要周期性地做VACUUM,特别是在频繁被...
  • Vacuum使用心得

    千次阅读 2018-11-05 17:40:37
    最近在优化PG,在vacuum过程中发现了 (to prevent wrap)。于是花了一周实践深入了解并实践了一把。下面把这一周的心得分享一下,以备遇到同样情况的 朋友以及将来的自己 使用。   数据库总是不断地在执行删除...
  • 我觉得下面这段文字应该能够描述清楚 PostgreSQL 的 vacuum. 日常数据库维护工作 作者:小P 来自: LinuxSir.Org 摘要:为了保持所安装的 PostgreSQL 服务器平稳运行, 我们必须做一些日常性的维护工作。我们在这里...
  • VACUUM概述2. VACUUM分类2.1 2.2 1. VACUUM概述 VACUUM是PostgreSQL中的一个辅助进程,它主要负责完成两个主要任务:删除死元组(Dead Tuples)和冻结事务ID(Freezing Tansaction Ids)。本文主要分享VACUUM删除死...
  •  vacuum full会锁表,而且效率很低,在实际中不可能使用vacuum来缩小pg_class,这样会有很长的停机时间。  其实要实现vacuum full最简单的方法就是将一个表重新复制一遍,create table b as select * ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,719
精华内容 1,487
关键字:

fullvacuum