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

适用版本: 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. 如何排查和解决这个异常和解决这个异常 #

建议按“先确认历史同名快照是否存在,再决定改名还是删除旧快照”的顺序处理:

  1. 查看仓库中同名快照是否真实存在。
  2. 区分它是历史成功快照,还是上一次失败后仍保留下来的记录。
  3. 如果历史快照仍需保留,改用新名称创建。
  4. 如果旧快照确实应该被替换,先删除旧快照,再重新发起创建。

相关 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");
}