前言

昨天同事遇到了一个有关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. Swoole从入门到入土(15)——WebSocket服务器[初步接触]

    WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议.换句话说,Websocket让web可以与服务端实现长连接. 在Swoole中,通过内置的 WebSock ...

  2. springboot jpa自定义SQL查询

    说明 在使用JPA实现数据持久化过程中经常会遇到这种情况:我有2张表是一对多的关系,需要通过一个外键ID去关联查询到另外一张表的字段.例如,1张商品表food_info其中存有商品分类ID categ ...

  3. win32 - 在进程之间获取事件通知(CreateEvent)

    只需要记住使用OpenEvent来同步Event对象. Project A: #define _CRT_SECURE_NO_WARNINGS #include <Windows.h> #i ...

  4. golang常用库包:redis操作库go-redis使用(02)-Redis5种基本数据类型操作

    第一篇:go-redis使用,介绍Redis基本数据结构和其他特性,以及 go-redis 连接到Redis https://www.cnblogs.com/jiujuan/p/17207166.ht ...

  5. dilb安装的三种方法

    dilb库安装失败,源码安装嘎嘎报错,所以这里记录一下 dlib库是一个很特殊的库,在下载dlib库之前需要下载两个库(cmake.boost这两个库) pip install cmake boost ...

  6. 【Azure Function App】在VS Code中,创建好Function App后部署到Azure中,无法选择Subscriptions

    问题描述 在VS Code中,创建好Function App后部署到Azure中,无法选择Subscriptions 问题解答 对于无法使用 VS Code 部署 Function App 到 Azu ...

  7. map 简单梳理【GO 基础】

    〇.map 简介 map 是一种无序的基于 key-value 的数据结构,Go 语言中的 map 是引用类型,必须初始化才能使用. 其中键可以是任何类型,但值必须是可比较的类型(如整数.字符串.布尔 ...

  8. python Ai 应用开发基础训练,字符串,字典,文件

    --------------------------------------    编程能是大模型应用的天花板............................................. ...

  9. 真实开发中-redis在项目中的应用场景

    一.需求描述 从自己当前负责参与开发的一个项目中来看,redis主要的应用场景有如下几个,第一个是保存用户信息,这个需要频繁的获取.比如 在打开某一个页面进行查询时,就先需要获取用户信息,看用户是否具 ...

  10. select 对当前选项显示文本的获取 m.options[m.selectedIndex].text | selectz

    select 对当前选项显示文本的获取 m.options[m.selectedIndex].text | selectz <html> <head> <title> ...