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

适用版本: 7.12-8.9

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

index [indexName] not found in repository [repoName] 表示当前请求需要从快照仓库中解析某个索引,但仓库元数据里不存在该索引记录。它常见于恢复指定索引、分析快照内容、按索引过滤恢复对象时。

常见现象 #

  • 恢复接口指定了某个索引名,但请求立即失败。
  • 同一个快照可以列出来,但其中某些索引名无法恢复。
  • 使用别名、旧索引名或重命名后的名称进行恢复,结果报错。

典型报错与异常栈 #

index [orders-2024.11] not found in repository [prod-backup]
org.elasticsearch.index.IndexNotFoundException

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

这个异常通常不是在线集群缺索引,而是“仓库中的快照内容”里没有这个索引。常见原因有:

  • 恢复请求写错了索引名,尤其是按日期滚动命名的索引。
  • 该快照创建时并未包含这个索引,例如快照时使用了过滤条件。
  • 当前引用的是另一份快照或另一座仓库,而不是你以为的那一份。
  • 仓库元数据存在不一致,导致快照可见但其中索引条目丢失。

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

  1. 先查看目标快照的详细内容:
GET /_snapshot/prod-backup/daily-es-2024.12.01
  1. 确认返回结果中的 indices 列表是否真的包含目标索引。
  2. 如果你是通过通配符或脚本构造索引名,检查实际展开后的值。
  3. 如果业务方传入的是别名,先解析别名对应的真实索引,再判断快照里是否存在。
  4. 若快照内容看起来异常,继续核查仓库是否被手工迁移、覆盖,或是否曾出现仓库元数据损坏。

排查时需要注意的问题 #

  • 线上集群存在该索引,不等于某个历史快照里也一定有它。
  • 恢复时的 rename_patternrename_replacement 是恢复后的命名规则,不影响仓库中原始索引是否存在。
  • 对象存储目录里看到索引相关 blob,不代表该索引在快照元数据里可恢复。

4. 如何解决这个错误 #

常用修复思路 #

  • 如果索引名写错,修正恢复请求即可。
  • 如果快照本身未包含目标索引,只能选择包含该索引的其他快照,或重新创建快照。
  • 如果调用端使用别名或业务逻辑名,增加一层名称映射校验,避免直接把应用层名称传给恢复接口。
  • 如果怀疑仓库元数据异常,先只读挂载仓库,验证 RepositoryData 与快照明细是否一致,再考虑重建引用。

相关 Elasticsearch API #

  • GET /_snapshot/{repository}/{snapshot}:查看某个快照包含哪些索引。
  • POST /_snapshot/{repository}/{snapshot}/_restore:执行恢复时可指定 indices
  • GET /_cat/indices?v:对比线上真实索引与快照历史索引的差异。

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

  • INFINI Console 可对比当前索引资产、快照任务与历史恢复请求。
  • INFINI Gateway 适合定位是哪一个调用方频繁传错索引名。

5. 小结 #

index [indexName] not found in repository [repoName] 的本质是“请求要恢复的索引不在该仓库快照元数据里”。优先校对快照内容和请求参数,再考虑仓库元数据问题,排查会更直接。

相关错误 #

附:日志上下文 #

throw new IndexNotFoundException("index [" + indexName + "] not found in repository [" + repositoryName + "]");