autovacuum 的freeze操作是不能主动预测的,只能被动触发,如何主动去做关于vacuum freeze 的运维?
1.查询当前所有表的年龄,SQL 语句如下:
SELECT c.oid::regclass as table_name,
greatest(age(c.relfrozenxid),age(t.relfrozenxid)) as age
FROM pg_class c
LEFT JOIN pg_class t ON c.reltoastrelid = t.oid
WHERE c.relkind IN ('r', 'm');
2.查询所有数据库的年龄,SQL 语句如下:
SELECT datname, age(datfrozenxid) FROM pg_database;
3.设置vacuum_cost_delay为一个比较高的数值(例如50ms),这样可以减少普通vacuum对正常数据查询的影响
4.设置vacuum_freeze_table_age=0.5 * autovacuum_freeze_max_age,vacuum_freeze_min_age为原来值的0.1倍
5.对上面查询的表依次执行vacuum freeze,注意要预估好时间。
目前已经有很多实现好的开源PostgreSQL vacuum freeze监控管理工具,比如说flexible-freeze),它能够:
1.确定数据库的高峰和低峰期
2.在数据库低峰期创建一个cron job 去执行flexible_freeze.py
3.flexible_freeze.py 会自动对具有最老XID的表进行vacuum freeze
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。