在PostgreSQL 怎么主动地进行vacuum freeze 操作-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

在PostgreSQL 怎么主动地进行vacuum freeze 操作

卓刀 2018-03-19 23:08:16 2487

autovacuum 的freeze操作是不能主动预测的,只能被动触发,如何主动去做关于vacuum freeze 的运维?

运维 关系型数据库 PostgreSQL
分享到
取消 提交回答
全部回答(1)
  • 卓刀
    2019-07-17 22:02:21

    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

    0 0
数据库
使用钉钉扫一扫加入圈子
+ 订阅

分享数据库前沿,解构实战干货,推动数据库技术变革

推荐文章
相似问题