KingbaseES V8R6 集群环境备库不结束旧事务快照将影响主库的vacuum操作
前言
昨天同事遇到了一个有关vacuum的典型问题。
V8R6读写分离集群环境,一主多备。
版本:kingbaseesv008r006c004
问题现象:
主库日常巡检发现日志大量记录:
waring :oldest xmin is far in the past,close open transactions soon to avoid wraparound problems,you mignt also need to commit or roll back old prepared transactions,or drop state replication slots.
集群同步方式:
synchronous_commit=on:保证主备不丢数据,备库接收的wal日志写入磁盘后,反馈给主库表示事务完成。
synchronous_standby_names=any 1(*):优选同步(quorum), 所有备库都显示为quorum,最先同步完成的备库为同步备库; 任意备库故障不影响其他备库。
以上参数配置说明集群传输方式为同步模式。
分析
从日志看,提示“尽快结束掉尚未完成的事务,避免发生事务回卷的可能”。判断可能有尚未提交的事务,导致 autovacuum 进程不能 vacuum freeze 释放掉表年龄。
众所周知,如果有事务持有bachend_xmin,也就是存在快照不释放,那么其快照号之后产生的age是无法回收的。但是可以通过一个参数来规定快照在一定时间内有效,old_snapshot_threshold:设置在使用快照时,一个快照可以被使用而没有发生 snapshot too old 错误风险的最大时间。这个参数只能在服务器启动时设置。如果超过该阈值,旧数据将被清理掉。这可以有助于阻止长时间使用的快照造成的快照膨胀。为了阻止由于本来对该快照可见的数据被清理导致的不正确结果,当快照比这个阈值更旧并且该快照被用来读取一个该快照建立以来被修改过的页面时,将会产生一个错误。最大可以设置为60天。
主库查看:(部分涉及敏感数据不便展示)
查询结果显示数据库和表年龄均大于4亿
相关sql
数据库年龄:
SELECT datname, age(datfrozenxid) FROM sys_database order by age(datfrozenxid) desc;
表年龄:
SELECT n.nspname as "Schema", c.relname as "Name", c.relfrozenxid
FROM sys_catalog.sys_class c
LEFT JOIN sys_catalog.sys_namespace n ON n.oid = c.relnamespace
WHERE c.relkind IN ('r','')
AND n.nspname <> 'information_schema' AND n.nspname !~ '^pg_toast'
AND sys_catalog.sys_table_is_visible(c.oid)
ORDER BY c.relfrozenxid::text::bigint DESC;
下面进行vacuum verbose table 查看详情,
如图,这里只展示了重点信息:oldest xmin is far in the past 意思是xmin28亿还没有释放,这远远超过了目前表年龄的4亿
下面的close open transactions.....提示和主库日志里报错一样,重点是oldest xmin:2828976404表示有旧的事务快照没有释放。我们需要把它查出来:



相关长事务sql:
select * from sys_stat_activity where state<>'idle' and sys_backend_pid() != pid and (backend_xid is not null or backend_xmin is not null )
或:
select * from sys_stat_activity where state<>'idle' and sys_backend_pid() != pid and (backend_xid is not null or backend_xmin is not null ) and query like '%tablename%' ;
select * from sys_prepared_statements ;
这个sql在主库查看为空,但是备库查到了相关结果,如图所示:
图片只截取一部分,原图有大量的未结束的事务,我们明显可以看到backend_xmin 正好持有的是主库显示的2828976404快照.并且事务状态为:idle in transaction状态,表示在空闲事务中,但未结束事务。
最后,经和应用沟通,结束掉这些会话连接后,主库日志不再有相关报错,并且表年龄,数据库年龄在触发autovacuum时候被回收。

总结
在同步模式读写分离集群或者单机环境,应避免有关session长时间持有 xmin快照并不结束事务。这样在触发vauum时,相关表的年龄以及死亡元组不会释放。当然最老的快照号之前产生的年龄或死亡元组会释放。此案例并没有调整 autovacuum有关参数阈值,无论是vacuum_freeze_table_age,autovacuum_freeze_max_age,均保持默认。
最后,怎么彻底避免这类问题呢?
1,调整业务逻辑,应用控制长事务时间。或调整在备库的有关查询sql的执行时间。
2、设置参数old_snapshot_threshold,超时后,快照被移除,有关查询报错。
3、关闭备库的hot_standby_feedback,该参数指备库定时将最小活跃事务ID(xmin)告诉master主库,使得 主库在执行vacuum 时对备库还需要的tuple暂不回收,但这样容易导致主库膨胀,反馈消息的发送频度不会高于每个 wal_receiver_status_interval 周期发送一次。默认值是 off 。这个参数只能在 kingbase.conf文件中或在服务器命令行上设置。并且此设置不会覆盖在主数据库上的old_snapshot_threshold参数行为。
KingbaseES V8R6 集群环境备库不结束旧事务快照将影响主库的vacuum操作的更多相关文章
- KingbaseES V8R6 集群环境wal日志清理
案例说明: 1.对于集群中的wal日志,除了需要在备库执行recovery外,在集群主备切换(switchover或failover)时,sys_rewind都要读取wal日志,将数据库恢复到一致性状 ...
- KingbaseES R6 集群通过备库clone在线添加新节点
案例说明: KingbaseES R6集群可以通过图形化方式在线添加新节点,但是在添加新节点clone环节时,是从主库copy数据到新的节点,这样在生产环境,如果数据量大,将会对主库的网络I/O造成压 ...
- kingbaseES V8R6集群备份恢复案例之---备库作为repo主机执行物理备份
案例说明: 此案例是在KingbaseES V8R6集群环境下,当主库磁盘空间不足时,执行sys_rman备份,将集群的备库节点作为repo主机,执行备份,并将备份存储在备库的磁盘空间. 集群架构 ...
- KingbaseES R3 集群删除test库导致主备无法切换问题
案例说明: 在KingbaseES R3集群中,kingbasecluster进程会通过test库访问,连接后台数据库服务测试:如果删除test数据库,导致后台数据库服务访问失败,在集群主备切换时,无 ...
- KingbaseES V8R6集群维护案例之--单实例数据迁移到集群案例
案例说明: 生产环境是单实例,测试环境是集群,现需要将生产环境的数据迁移到集群中运行,本文档详细介绍了从单实例环境恢复数据到集群环境的操作步骤,可以作为生产环境迁移数据的参考. 适用版本: Kingb ...
- KingbaseES V8R6集群外部备份案例
案例说明: 本案例采用sys_backup.sh执行物理备份,备份使用如下逻辑架构:集群采用CentOS 7系统,repo采用kylin V10 Server. 一主一备+外部备份 此场景为主备双机常 ...
- KingbaseES V8R6集群运维案例之---repmgr standby promote应用案例
案例说明: 在容灾环境中,跨区域部署的异地备节点不会自主提升为主节点,在主节点发生故障或者人为需要切换时需要手动执行切换操作.若主节点已经失效,希望将异地备机提升为主节点. $bin/repmgr s ...
- KingbaseES V8R6集群维护案例之---停用集群node_export进程
案例说明: 在KingbaseES V8R6集群启动时,会启动node_exporter进程,此进程主要用于向kmonitor监控服务输出节点状态信息.在系统安全漏洞扫描中,提示出现以下安全漏洞: 对 ...
- KingbaseES V8R6集群管理运维案例之---repmgr standby switchover故障
案例说明: 在KingbaseES V8R6集群备库执行"repmgr standby switchover"时,切换失败,并且在执行过程中,伴随着"repmr stan ...
- KingbaseES V8R6集群维护之--修改数据库服务端口案例
案例说明: 对于KingbaseES数据库单实例环境,只需要修改kingbase.conf文件的'port'参数即可,但是对于KingbaseES V8R6集群中涉及到多个配置文件的修改,并且在应 ...
随机推荐
- Java设计模式-桥接模式Bridge
传统模式 案例 要求对不同手机类型的不同品牌实现操作编程(比如:开机.关机.上网,打电话等),如图: 类图 问题 扩展性问题(类爆炸),如果我们再增加手机的样式(旋转式),就需要增加各个品牌手机的类, ...
- spring boot整合spring security自定义登录跳转地址
说明 在博客用户登录后我想跳转到各自用户的博客首页,我们知道这个地址是动态的. 例如: http://localhost:8080/blog/zhangsan, 每个用户地址不一样.这时候我就用到了自 ...
- P3374 【模板】树状数组 1(线段树)
[模板]树状数组 1 题目描述 如题,已知一个数列,你需要进行下面两种操作: 将某一个数加上 x 求出某区间每一个数的和 输入格式 第一行包含两个正整数 n,m ,分别表示该数列数字的个数和操作的总个 ...
- 2019年在浏览器用原生js写WebGL,绘制图形;
因为JavaScript高级程序设计(第三版)中的运行书上15.3WebGL部分的代码时在chrome和firefox浏览器下报错,在后面我网上初步找了一圈,好像没人做出真正可以用的代码;所以我就自己 ...
- JSON排除指定字段的4种方法
转自:https://blog.csdn.net/Sn_Keys/article/details/122443407
- Generating equals/hashCode implementation but without a call to superclass
Generating equals/hashCode implementation but without a call to superclass1.lombok 警告,没有注入父类的字段当我们给一 ...
- RK3588开发笔记(二):基于方案商提供sdk搭建引入mpp和sdk的宿主机交叉编译Qt5.12.10环境
前言 上一篇项目已经构建好了Qt,板子接入mipi屏幕也跑起来了,Qt也能正常运行了,现在需要接入定制开发的sdk,sdk中使用了硬解码等资源涉及到bsp的mpp,所以下一步就是引入mpp和sdk ...
- iOS 面向对象与类
至于未来会怎样,要走下去才知道反正路还很长,天总会亮. 1. 面向对象 1.1 什么是面向对象(OOP) 面向对象 Object Oriented Programming.在软件开发中,我们虽然用的是 ...
- 【webserver 前置知识 03】Linux网络编程入门其二,I/O多路复用
I/O多路复用 I/O多路复用使得程序能够同时监听多个文件描述符 LInux下实现I/O多路复用的系统调用主要由select.poll以及epoll(常问,要会自己写出来) 例子 阻塞等待 阻塞等待可 ...
- 【Azure 环境】当Azure Key Vault中存储的证书即将过期时,如何设置Alert邮件警报?
问题描述 当Azure Key Vault 中存储的证书即将过期时, 如何设置Alert邮件警报? 问题解答 首先,在创建完一个证书后,需要为证书添加一个"证书联系人" 然后,点击 ...