开发者社区> 问答> 正文

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

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

展开
收起
卓刀 2018-03-19 23:08:16 4184 0
1 条回答
写回答
取消 提交回答
  • PostgreSQL你值得拥有。

    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

    2019-07-17 22:02:21
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
云栖大会:开源 PolarDB 架构演进、关键技术与社区建设 立即下载
2023云栖大会:和客户一起玩转PolarDB新特性 立即下载
2023云栖大会:PolarDB for AI 立即下载

相关镜像