
VACUUM 回收的是在事务COMMIT 后因为保留回滚可能的数据行, 将这些行重新标记成可以使用,释放空间, 这点上还有一些连续性,这点和俄罗斯方块消消看的原理是一样的.
实际上频繁的更新和删除对于POSTGRESQL 并没有什么好处,所以归并一些UPDATE 的操作对POSTGRESQL 是有利的。如果不加以控制则POSTGRESQL 会因为这样不恰当的操作导致空间的bloating,所以当有这样设计的应用的情况下,就必须有有利的回收这些空间的程序来进行这样的程序就是POSTGRESQL 称为 autovacuum 的进程。


那么到底回收是什么样的原理,回收操作对那些系统或者文件进行了操作,那么就牵扯到 visibility map , Free space map , freeze tuple 这几个问题了。visibility map 是对数据页面文件的可读文件进行标记的文件,一个比特管理一个页面文件,标记为1 则说明这个页面包含的tuples 都是可见的有效的,如果这个bit设置为0, 说明对于所有的事务,这个页面都是不可见的。

那么下面就会有一些问题提出了
问题1
问题2 VACUUM 频率应该是什么时间来进行
在autovacuum_freeze_max_age达到限定值 两亿的事务执行的上限的时候,强制冻结事务在增加了,进行强行的VACUUM 当然如果达到这样的情况,那就不大妙了,这属于极限问题了. 所以此时建议是停止业务,进行相关的回收的活动.

那么相关的autovacuum到底做了多少工作
1 清理由于UPDATE 和DELETE 所产生的 dead tuples
下面我们就捋一捋,到底在出现表bloating的情况下,我们需要做什么
1 查看当前数据库的表的autovacuum的情况
|
If your bloated table doe

1 auto_vacuum 的进程工作没有
2 stat collector 工作了没有

SELECT pid, datname, usename, state, backend_xmin,query,query_start
FROM pg_stat_activity
WHERE backend_xmin IS NOT NULL
ORDER BY age(backend_xmin) DESC;

SELECT slot_name, slot_type, database, xmin

FROM pg_replication_slots
ORDER BY age(xmin) DESC;


SELECT gid, prepared, owner, database, transaction AS xmin
FROM pg_prepared_xacts
ORDER BY age(transaction) DESC;

举例:
vacuum threshold = vacuum base threshold + vacuum scale factor * number of tuples

相关的配置参数
在是否触发vacuum 和 analyze 两个动作的情况下,有两个触发标准
表中的多少数据的百分比的问题,如果超过了某个百分比就触发vacuum 和 analyze 同时这个百分比可能必须是超过多少行的情况下

实际当中,如果 有大量的数据输入的情况下, autovacuum_vacuum_scale_factor 也是需要调整的
|
|
最后我们在对配置文件中关于autovacuum的部分过一遍
autovacuum = on # Enable autovacuum subprocess 'on'
# requires track_counts to also be on.
log_autovacuum_min_duration = -1
# -1 disables, 0 logs all actions and
# their durations, > 0 logs only
# actions running at least this number
# of milliseconds.
autovacuum_max_workers = 3 # max number of autovacuum subprocesses
# (change requires restart)
autovacuum_naptime = 1min # time between autovacuum runs
autovacuum_vacuum_threshold = 50 # min number of row updates before vacuum
在vacuum工作中最小的行变动(表级别)
autovacuum_analyze_threshold = 50 # min number of row updates before analyze
在analyze 前最少的行变动
autovacuum_vacuum_scale_factor = 0.2 # fraction of table size before vacuum
autovacuum_analyze_scale_factor = 0.1 # fraction of table size before analyze
同时对于一些不变动的表也可以关掉auto_vacuum,另外可以通过pg_class中的字段 reloptions 查看到底这个表的的auto_vacuum 是打开的状态还是关闭的状态.
ALTER TABLE table_name SET (autovacuum_enabled = false);

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/25689.html