You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

txid_exhaustion_oldest_txid_num持续增长是否属于异常情况?

txid_exhaustion_oldest_txid_num持续增长是否属于异常情况?

txid_exhaustion_oldest_txid_num持续增长属于异常情况。正常PostgreSQL环境中,旧事务ID会被VACUUM(包括自动清理进程)定期回收,不会出现持续单向增长的现象,这通常意味着存在阻止事务ID回收的阻塞因素。

已执行操作

  • PostgreSQL运行版本为v13
  • 对所有逻辑数据库执行全量清理命令:vacuumdb --full --all --jobs=1 --verbose --analyze --username=XXXX --password,执行过程中仅出现以下错误:

    ERROR: relation "pg_temp_31.temp_lig_plo"
    ERROR: relation "pg_temp_31.lst_lig_plo"

  • 已删除schema "pg_temp_31",但问题仍未解决
  • 配置项max_prepared_transactions值为0
  • 在所有数据库执行SELECT * FROM pg_prepared_xacts,结果为空
  • 已重启数据库(断开所有空闲事务),但仍观察到该数值持续增长

后续排查建议

  1. 检查复制槽状态:执行SELECT * FROM pg_replication_slots;,若存在active=false的复制槽,这类废弃槽会持续保留旧事务ID,需及时删除无用复制槽。
  2. 定位长期运行事务:执行以下SQL查找长时间未结束的事务:
    SELECT pid, datname, usename, state, now() - xact_start AS xact_duration 
    FROM pg_stat_activity 
    WHERE state IN ('idle in transaction', 'active');
    
    针对异常长事务,可通过SELECT pg_terminate_backend(pid);终止。
  3. 检查数据库冻结年龄:执行SELECT datname, age(datfrozenxid) FROM pg_database;,查看各数据库的事务ID年龄,若接近autovacuum_freeze_max_age(默认2亿),需对目标数据库执行VACUUM FREEZE操作。
  4. 排查临时对象残留:尽管已删除pg_temp_31,仍需确认是否存在其他临时对象或异常会话残留,可在重启数据库后立即监控txid变化,同时检查应用端是否存在创建临时表后未正确清理的逻辑。

内容的提问来源于stack exchange,提问作者John Smith

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 07:38:19