云数据库 RDS-AutoVacuum介绍和调优:autovacuum常见问题

时间:2024-12-20 17:08:41

autovacuum常见问题

  • 长事务/事务未提交影响autovacuum正常工作

    由于MVCC机制,长事务/事务未提交不允许autovacuum清理死元组,如果当前事务在执行删除或更新操作之前拍摄的数据快照,那autovacuum会跳过这些死元组;出现autovacuum不能正常工作的时候应优先排查idle in transaction中的会话。

    可以通过如下SQL查询autovacuum进程的锁信息:

    select locktype, relation::regclass, pid, mode, granted from pg_locks where pid in($autovacuum_pid);

    可以通过如下SQL查询长事务以及等待事件信息:

    select pid,wait_event_type,wait_event,state,backend_start,xact_start,query_start,state_change, query from pg_stat_activity where state not in ('idle', 'active');

    确认后通过如下SQL杀死该事务:

    select  pg_terminate_backend(pid);
  • 废弃的复制槽影响autovacuum正常工作

    复制槽中存储着备机追上主机需要的信息,如果备机宕机或者严重落后于主机,将无法清理在主节点上复制槽中的列。

    可以通过如下SQL查询包含旧事务的复制槽:

    SELECT slot_name, slot_type, database, xmin, catalog_xmin FROM pg_replication_slots ORDER BY age(xmin), age(catalog_xmin) DESC;

    使用pg_drop_replication_slot()删除废弃的复制槽。

  • autovacuum时占用资源高,或者经常导致中断

    这时一般是由于autovacuum执行次数过于频繁,需要调整参数降低其执行次数:

    • 适当增大autovacuum_vacuum_cost_delay和减少autovacuum_vacuum_cost_limit的值。
    • 减少autovacuum_max_workers的数量。

    如果业务量比较大,可以做定时任务在业务低峰期进行清理,也可以设置定时任务为特殊的表单独设置autovacuum参数。

  • 表膨胀的速度加快

    在autovacuum正常运行的情况下,如果业务量增加,可能在短时间内产生大量死元组,导致autovacuum跟不上节奏,会导致查询性能下降;可通过修改autovacuum的相关参数进行优化:

    • 适量降低autovacuum_vacuum_cost_delay,适量增加autovacuum_vacuum_cost_limit。
    • 适量增大autovacuum_max_workers增加并行。
  • autovacuum执行卡住或执行很慢

    如果autovacuum执行卡住或执行很慢,尝试手动执行vacuum。

    1. 通过SQL查询autovacuum运行情况,找到autovacuum的PID:
      SELECT datname, usename, pid, now() - xact_start AS runtime, query
      FROM pg_stat_activity 
      WHERE upper(query) LIKE '%VACUUM%' 
      ORDER BY xact_start;
    2. 多次执行以下命令,判断autovacuum是否正常运行:
      SELECT pg_terminate_backend($PID);

      确认autovacuum正常运行后,对需要清理的表手动执行vacuum freeze终止autovacuum进程:

      verbose选项可选。
      vacuum freeze verbose $TBL_NAME;
support.huaweicloud.com/usermanual-rds/rds_pg_08_00015.html