前言

昨天同事遇到了一个有关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操作的更多相关文章

  1. KingbaseES V8R6 集群环境wal日志清理

    案例说明: 1.对于集群中的wal日志,除了需要在备库执行recovery外,在集群主备切换(switchover或failover)时,sys_rewind都要读取wal日志,将数据库恢复到一致性状 ...

  2. KingbaseES R6 集群通过备库clone在线添加新节点

    案例说明: KingbaseES R6集群可以通过图形化方式在线添加新节点,但是在添加新节点clone环节时,是从主库copy数据到新的节点,这样在生产环境,如果数据量大,将会对主库的网络I/O造成压 ...

  3. kingbaseES V8R6集群备份恢复案例之---备库作为repo主机执行物理备份

    ​ 案例说明: 此案例是在KingbaseES V8R6集群环境下,当主库磁盘空间不足时,执行sys_rman备份,将集群的备库节点作为repo主机,执行备份,并将备份存储在备库的磁盘空间. 集群架构 ...

  4. KingbaseES R3 集群删除test库导致主备无法切换问题

    案例说明: 在KingbaseES R3集群中,kingbasecluster进程会通过test库访问,连接后台数据库服务测试:如果删除test数据库,导致后台数据库服务访问失败,在集群主备切换时,无 ...

  5. KingbaseES V8R6集群维护案例之--单实例数据迁移到集群案例

    案例说明: 生产环境是单实例,测试环境是集群,现需要将生产环境的数据迁移到集群中运行,本文档详细介绍了从单实例环境恢复数据到集群环境的操作步骤,可以作为生产环境迁移数据的参考. 适用版本: Kingb ...

  6. KingbaseES V8R6集群外部备份案例

    案例说明: 本案例采用sys_backup.sh执行物理备份,备份使用如下逻辑架构:集群采用CentOS 7系统,repo采用kylin V10 Server. 一主一备+外部备份 此场景为主备双机常 ...

  7. KingbaseES V8R6集群运维案例之---repmgr standby promote应用案例

    案例说明: 在容灾环境中,跨区域部署的异地备节点不会自主提升为主节点,在主节点发生故障或者人为需要切换时需要手动执行切换操作.若主节点已经失效,希望将异地备机提升为主节点. $bin/repmgr s ...

  8. KingbaseES V8R6集群维护案例之---停用集群node_export进程

    案例说明: 在KingbaseES V8R6集群启动时,会启动node_exporter进程,此进程主要用于向kmonitor监控服务输出节点状态信息.在系统安全漏洞扫描中,提示出现以下安全漏洞: 对 ...

  9. KingbaseES V8R6集群管理运维案例之---repmgr standby switchover故障

    案例说明: 在KingbaseES V8R6集群备库执行"repmgr standby switchover"时,切换失败,并且在执行过程中,伴随着"repmr stan ...

  10. KingbaseES V8R6集群维护之--修改数据库服务端口案例

    ​ 案例说明: 对于KingbaseES数据库单实例环境,只需要修改kingbase.conf文件的'port'参数即可,但是对于KingbaseES V8R6集群中涉及到多个配置文件的修改,并且在应 ...

随机推荐

  1. org.apache.http.client.ClientProtocolException: URI does not specify a valid host name:localhost:xxx

    今天部署应用的时候遇到的,总结一下我知道的有2个原因: 1.地址前要加http://  这就是标题报错的原因,他用的是localhost:xxx 2.地址本身拼错了也会报这个,例如地址:http:// ...

  2. 50从零开始用Rust编写nginx,原来TLS证书还可以这么申请

    wmproxy wmproxy已用Rust实现http/https代理, socks5代理, 反向代理, 负载均衡, 静态文件服务器,websocket代理,四层TCP/UDP转发,内网穿透等,会将实 ...

  3. rename重命名

    [root@liuwei test]# ls 11.txt 12.txt 13.txt 14.txt 15.txt 16.txt 17.txt 18.txt 19.txt 1.txt 20.txt 2 ...

  4. 利用wiile双层循环打印各种星星---day06

    # 十行十列小星星 j = 0 #定义行数 while j<10: #当行数小于10的时候 i=0 #定义列 while i <10: #当列小于10的时候 print('*',end=' ...

  5. ioutil.ReadDir读取目录下的内容

    func dirents(dir string) []os.FileInfo{ entries, err := ioutil.ReadDir(dir) // 读取目录并返回排好序的文件以及子目录名 i ...

  6. 第一百一十八篇: JavaScript 原型链式继承

    好家伙,好家伙,本篇为<JS高级程序设计>第八章"对象.类与面向对象编程"学习笔记 1.原型链 原型链是JS实现"继承"的方案之一 ECMA-262 ...

  7. 如何在 C# 中以编程的方式将 CSV 转为 Excel XLSX 文件

    前言 Microsoft Excel的XLSX格式以及基于文本的CSV(逗号分隔值)格式,是数据交换中常见的文件格式.应用程序通过实现对这些格式的读写支持,可以显著提升性能.在本文中,小编将为大家介绍 ...

  8. RPA能否创造新业态?如何优化组织结构?如何助力疫情中的企业?

    RPA能否创造新业态?如何优化组织结构?如何助力疫情中的企业? 从<爱,死亡和机器人>探讨强人工智能时代的RPA发展 文/王吉伟 本周四,王吉伟频道参加了私域流量社群的一个直播活动. 活动 ...

  9. 协议I2C

    SCL   SDA   同步,半双工 开漏+弱上拉,谁用这跟线,就下拉成低电平 想输出,去拉杆子或放手,操作杆子变化 想输入,直接放手,看电平高低就行 线与,一个低电平,全部低电平,可以利用这个执行多 ...

  10. nowrap - table td 列 宽度 不被挤 - 大表格制作

    nowrap - table td 列 宽度 不被挤 - 大表格制作 表格前几列 设置完宽度,会被右侧动态数据挤没有宽度,加上nowrap,就保证宽度了