📣 极限科技诚招搜索运维工程师(Elasticsearch/Easysearch)- 全职/北京 👉 : 立即申请加入

适用版本: 6.8-8.9

1. 错误异常的基本描述 #

snapshot does not exist 表示 Elasticsearch 已经成功读取到仓库 RepositoryData,但在 getSnapshotIds() 中找不到用户请求的 snapshotName,于是直接抛出 SnapshotRestoreException。这类问题发生在 restore、snapshot status 或其他依赖 snapshot 名称的入口校验阶段。

它说明问题还没进入分片恢复或快照文件读取,而是“目标快照名在仓库视图里根本不存在”。

常见现象 #

  • /_snapshot/{repository}/{snapshot}/_restore 或状态查询直接返回失败。
  • 仓库可访问,但指定的 snapshot 名称无效。
  • 常见于名称拼写错误、仓库 cleanup 后快照已被删除,或引用了错误的 repository。
  • 如果同时传入 snapshotUuid,还可能进一步触发 UUID 不匹配的相邻校验。

典型报错与异常栈 #

SnapshotRestoreException: [repo:snap-20260331] snapshot does not exist

2. 为什么会发生这个错误 #

Elasticsearch 先从仓库元数据中找到匹配的 SnapshotId。如果 matchingSnapshotId.isPresent() == false,就说明当前仓库视图里没有这个快照名,因此无法继续恢复、查看状态或执行后续操作。

常见原因通常包括:

  • 快照名称拼写错误,或自动化脚本拼错了时间戳后缀。
  • 指向了错误的 repository,同名快照其实在另一个仓库中。
  • 快照已被删除、cleanup,或仓库元数据尚未包含该对象。
  • 使用了旧缓存、旧配置,引用了已经不存在的 snapshot 名称。

3. 如何排查和解决这个异常和解决这个异常 #

建议按“先确认 repository 和 snapshotName 是否真实存在,再检查 UUID 或缓存问题”的顺序处理:

  1. 列出目标仓库的快照,确认 snapshotName 是否真的存在。
  2. 核对请求里的 repository 名称,确认没有指向错误仓库。
  3. 如果脚本使用了缓存清单,确认它没有引用过期快照名。
  4. 若请求还带了 snapshotUuid,继续确认名字和 UUID 是否匹配同一个快照。

相关 Elasticsearch API #

  • GET /_snapshot/{repository}/_all:列出仓库中的全部快照。
  • GET /_snapshot/{repository}/{snapshot}:确认指定快照是否存在。
  • GET /_snapshot:查看当前注册的仓库列表。

排查时需要注意的问题 #

  • 这条异常说明仓库可读,但目标快照名不可见。
  • 不要把它和“快照不可兼容”或“快照文件损坏”混淆,这里连目标 SnapshotId 都还没拿到。
  • 多环境共用脚本时,最常见问题是仓库名和快照名组合引用错了。

4. 如何解决这个错误 #

常用修复思路 #

  • 改用仓库中真实存在的快照名。
  • 修正自动化脚本里的 repository 或 snapshot 命名规则。
  • 对关键恢复流程先执行“列快照再恢复”的前置检查,避免直接拿旧名字发请求。

借助 INFINI 产品提升排障效率 #

  • INFINI Console 适合集中查看仓库、快照清单和恢复失败请求。
  • INFINI Gateway 可帮助审计哪些调用方在反复请求不存在的快照名。

5. 小结 #

snapshot does not exist 是 restore 入口最基础的仓库元数据校验失败。根因通常不复杂,但必须先把 repository、snapshot 名称和可见性关系核实清楚,后续所有恢复排查才有意义。

相关错误 #

附:日志上下文 #

final Optional<SnapshotId> matchingSnapshotId = repositoryData.getSnapshotIds()
	.stream()
	.filter(s -> snapshotName.equals(s.getName()))
	.findFirst();
if (matchingSnapshotId.isPresent() == false) {
	throw new SnapshotRestoreException(repositoryName, snapshotName, "snapshot does not exist");
}