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,结果为空 - 已重启数据库(断开所有空闲事务),但仍观察到该数值持续增长
后续排查建议
- 检查复制槽状态:执行
SELECT * FROM pg_replication_slots;,若存在active=false的复制槽,这类废弃槽会持续保留旧事务ID,需及时删除无用复制槽。 - 定位长期运行事务:执行以下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);终止。 - 检查数据库冻结年龄:执行
SELECT datname, age(datfrozenxid) FROM pg_database;,查看各数据库的事务ID年龄,若接近autovacuum_freeze_max_age(默认2亿),需对目标数据库执行VACUUM FREEZE操作。 - 排查临时对象残留:尽管已删除pg_temp_31,仍需确认是否存在其他临时对象或异常会话残留,可在重启数据库后立即监控txid变化,同时检查应用端是否存在创建临时表后未正确清理的逻辑。
内容的提问来源于stack exchange,提问作者John Smith
相关产品推荐
相关产品推荐

