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集群中涉及到多个配置文件的修改,并且在应 ...
随机推荐
- 配置主机访问virtualbox中redhat7.3虚拟机网络(其他系统配置也类似)
为什么默认无法访问? virtualbox默认分配一个NAT网络,这个是给虚拟机操作系统访问互联网用的,默认主机通过这个ip段无法直接访问虚拟机.[网卡1] 需要添加一块网卡 在虚拟机关闭状态下,点[ ...
- Oracle使用由字符串索引的二维数组
–参考文章:http://www.oracle.com/technetwork/issue-archive/2014/14-sep/o54plsql-2245345.html –SAMPLE DATA ...
- js根据输入字符长度自动调整textarea高度
1.编写html <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- [BUUCTF][Web][极客大挑战 2019]Havefun 1
打开靶机的URL,看到一个页面 右键查看源代码,看到有用信息 <html> ... <!-- $cat=$_GET['cat']; echo $cat; if($cat=='dog' ...
- HTML学习---day01
1.head标签 <!DOCTYPE html> <!--文档声明H5 html--> <html lang="en"> <head> ...
- 07-Redis系列之-双写一致性,缓存详解和优化点
双写一致性 双写一致性指的是当我们更新了数据库的数据之后redis中的数据也要同步去更新. redis和mysql数据同步方案 先更新缓存,再更新数据库(然并软...) 先更新数据库,再更新缓存(一般 ...
- 【Java复健指南12】OOP高级03-抽象类与接口
抽象类 引出 问题: 父类方法有时候具有不确定性 小结: 当父类的某些方法,需要声明,但是又不确定如何实现 时,可以将其声明为抽象方法,那么这个类就是抽象类 例子: public class Ab ...
- 学会了Java 8 Lambda表达式,简单而实用
OneAPM 摘要:此篇文章主要介绍Java8 Lambda 表达式产生的背景和用法,以及 Lambda 表达式与匿名类的不同等.本文系OneAPM工程师编译整理. Java是一流的面向对象语言,除了 ...
- Mysql 删除binlog日志方法
方法1 RESET MASTER; 解释: 该方法可以删除列于索引文件中的所有二进制日志,把二进制日志索引文件重新设置为空,并创建一个以.000001为后缀新的二进制日志文件. 该语法一般只用在主从环 ...
- 树莓派修改根文件系统为f2fs
目录 前言 操作简述 我的实际操作步骤 1. 准备 2. 查看树莓派分区信息 3. 备份根分区 4. 格式化树莓派TF卡根分区为f2fs文件系统 5.恢复备份 前言 在TF卡.固态硬盘之类的nand存 ...