适用版本: 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 或缓存问题”的顺序处理:
- 列出目标仓库的快照,确认
snapshotName是否真的存在。 - 核对请求里的 repository 名称,确认没有指向错误仓库。
- 如果脚本使用了缓存清单,确认它没有引用过期快照名。
- 若请求还带了
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 名称和可见性关系核实清楚,后续所有恢复排查才有意义。
相关错误 #
- 无法获取不兼容快照的状态:快照存在,但因兼容性问题无法继续取状态
- 无法恢复不兼容的快照:快照存在,但恢复入口因兼容性被拒绝
- 无法恢复索引因为它无法升级:快照和索引都找到了,但索引元数据升级失败
- 快照无法读取:拿到 snapshotId 后继续读取快照元数据时失败
附:日志上下文 #
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");
}





