适用版本: 6.8-7.4
1. 错误异常的基本描述 #
snapshot with the same name already exists 表示 Elasticsearch 在真正写快照前,发现仓库的 RepositoryData 中已经存在同名历史快照,因此直接拒绝本次创建。根据源码,这个检查发生在写全局元数据之前,触发的是 InvalidSnapshotNameException。
它和“同名快照已在进行中”不同,这里说的是历史态重名,而不是运行态重名。
常见现象 #
- 新建快照立即失败,但仓库里能查到同名旧快照。
- 定时任务使用固定命名规则,天级或小时级重复运行后撞名。
- 运维删除旧快照失败后,又试图用同名重新创建。
- 仓库元数据恢复后,历史同名记录重新可见,导致旧命名方案失效。
典型报错与异常栈 #
InvalidSnapshotNameException: [repo:snap-20260331] snapshot with the same name already exists
2. 为什么会发生这个错误 #
Elasticsearch 要保证同一仓库中的快照名称唯一。只要 RepositoryData.getSnapshotIds() 里已有同名记录,就不会允许再次创建同名快照。
常见原因通常包括:
- 快照命名规则过于简单,重复执行后撞名。
- 旧快照确实存在,但调用方误以为已经删除。
- 自动化脚本没有在创建前查询仓库已有快照列表。
- 仓库元数据在恢复或重新挂载后,之前不可见的历史快照重新出现。
3. 如何排查和解决这个异常和解决这个异常 #
建议按“先确认历史同名快照是否存在,再决定改名还是删除旧快照”的顺序处理:
- 查看仓库中同名快照是否真实存在。
- 区分它是历史成功快照,还是上一次失败后仍保留下来的记录。
- 如果历史快照仍需保留,改用新名称创建。
- 如果旧快照确实应该被替换,先删除旧快照,再重新发起创建。
相关 Elasticsearch API #
GET /_snapshot/{repository}/_all:列出仓库全部快照名称。GET /_snapshot/{repository}/{snapshot}:确认同名快照详情。DELETE /_snapshot/{repository}/{snapshot}:在确认不再需要旧快照后删除。
排查时需要注意的问题 #
- 不要把它和
snapshot with the same name is already in-progress混淆,一个是历史态,一个是运行态。 - 如果删除旧快照失败,先解决删除链路问题,再考虑复用名称。
- 命名策略如果只到分钟或小时,极易在自动化任务中碰撞。
4. 如何解决这个错误 #
常用修复思路 #
- 使用新的唯一快照名称重新创建。
- 如果确实需要覆盖旧快照,先删除历史同名快照。
- 给自动化备份命名增加更高精度时间戳或任务 ID。
- 在创建前增加一次仓库快照清单检查,避免重复失败。
借助 INFINI 产品提升排障效率 #
- INFINI Console 可帮助对比仓库历史快照与新提交请求的名称冲突。
- INFINI Gateway 可审计哪些上游系统在持续复用同一快照名。
5. 小结 #
snapshot with the same name already exists 的核心是仓库历史元数据里已经有这个名字。处理时要么更换名称,要么先处理旧快照,再重新创建,而不是盲目重试同一个请求。
相关错误 #
附:日志上下文 #
final String snapshotName = snapshotId.getName();
final RepositoryData repositoryData = getRepositoryData();
if (repositoryData.getSnapshotIds().stream().anyMatch(s -> s.getName().equals(snapshotName))) {
throw new InvalidSnapshotNameException(metadata.name(), snapshotId.getName(), "snapshot with the same name already exists");
}





