- 执行一条耗时很久的历史数据统计查询时,直接抛出报错:snapshot is outdated;
- 平时快速的简单查询、新增修改数据都不会出现这个报错;
- 重新打开会话、重新执行查询就能正常查到数据。
不同版本行为有差异,先确认版本。
长查询启动时获取了一个旧快照 TS,查询耗时太久,TiDB GC 安全点已经推进到这个 TS 之后,旧快照对应的 MVCC 版本已被 GC 清理,读取时就报snapshot is outdated;新开会话会拿到全新的当前快照 TS,自然恢复正常。
长查询使用的旧快照版本被 GC 清理,新会话会获取新快照,因此恢复正常
快照过期,因查询耗时久、快照被回收,重连重试可临时恢复。
长时统计查询触发快照过期,是 TiDB GC 回收了查询依赖的旧快照,重连重试会获取新快照即可恢复
把超大范围统计拆成分段分页查询,单段执行时长控制在 GC 保留窗口之内。
查询执行时长超过 gc_life_time,快照被 GC 回收;调大该参数、拆分长查询、分批执行
这个 snapshot is outdated 报错,是因为 TiDB 中 MVCC 数据的历史版本保留时间有限,默认 tikv_gc_life_time 是 10 分钟,当你的慢查询执行时间过长,超过了 GC 保留窗口,查询依赖的历史快照被 GC 清理后就会触发报错,简单查询 / 新会话能正常执行是因为它们使用的是当前最新快照,不会受历史版本清理影响。解决建议:优先优化查询本身,比如为统计查询添加合适索引、拆分大查询为分批执行,缩短单次执行耗时;如果业务确实需要长时间运行的历史统计,可临时调大 tikv_gc_life_time(比如改为 1 小时),或使用 tidb_snapshot 指定一个具体时间点的快照,配合 SET @@tidb_snapshot = "yyyy-mm-dd hh:mm:ss"; 实现稳定的历史数据读取,避免依赖自动快照导致超时。
用Dashboard看看集群健康度。
此话题已在最后回复的 7 天后被自动关闭。不再允许新回复。