目录标题
好的,以下是一个用于记录和处理 KingbaseES 数据库中的“事务 ID wraparound”告警问题:
📌 KingbaseES 警告处理笔记(事务 ID wraparound)
🧾 告警信息:
数据库实例
db-instance-A (10.0.0.1:5432)
中的数据库mydb
的表schema_a.tbl_example
距离 wraparound 回收的事务 ID 不足 20000000,当前剩余为 0。
⚠️ 问题背景说明:
KingbaseES 基于 PostgreSQL,在其内部使用 32 位的事务 ID(xid
)。每个表都有一个 relfrozenxid
,代表最早可见的数据事务。如果某表长时间未执行 VACUUM
操作,其 xid
年龄可能逐渐逼近最大值(autovacuum_freeze_max_age
),会导致数据库警告甚至停止服务。
✅ 处理步骤:
1. 手动确认表是否存在
SELECT * FROM schema_a.tbl_example LIMIT 1;
若提示表不存在,可能是:
- 表名/模式名大小写或拼写错误;
- 表是视图或已被删除;
- 连接的并非告警中对应的实例(应核实 IP/端口)。
2. 查找所有表中 xid 年龄高的对象
SELECT
n.nspname AS schema,
c.relname AS table,
age(c.relfrozenxid) AS xid_age,
current_setting('autovacuum_freeze_max_age')::int AS freeze_max_age
FROM
pg_class c
JOIN
pg_namespace n ON c.relnamespace = n.oid
WHERE
c.relkind = 'r'
ORDER BY
age(c.relfrozenxid) DESC
LIMIT 20;
3. 手动执行 VACUUM FREEZE(如表存在)
VACUUM FREEZE schema_a.tbl_example;
建议先在业务低峰期操作,以避免对性能造成影响。
4. 检查 autovacuum 参数是否合理
SHOW autovacuum;
SHOW autovacuum_freeze_max_age;
SHOW autovacuum_naptime;
SHOW vacuum_freeze_min_age;
如需要修改,可在 kingbase.conf
中调整:
autovacuum = on
autovacuum_freeze_max_age = 200000000
autovacuum_naptime = 1min
🔁 建议维护机制:
- 每周巡检所有表的 xid 使用情况;
- 关键表设置手动 VACUUM 计划任务;
- 监控工具应过滤不存在表的告警(避免误报);
- 确保连接的是主节点实例,非只读从库。