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

适用版本: 6.8-8.11

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

index [index] wasn't fully snapshotted - cannot restore 表示当前要恢复的索引,在源快照里并没有完整快照成功,因此 Elasticsearch 拒绝执行完整恢复。

从源码逻辑看,只有当快照记录显示该索引失败且本次 restore 请求不是 partial 模式时,才会抛出这条异常。

常见现象 #

  • 执行 /_snapshot/.../_restore 时直接失败。
  • 同一个 snapshot 可能整体存在,但其中部分索引或部分分片并未成功完成快照。
  • 日志中常可看到 SnapshotRestoreException,以及更早阶段的 snapshot 失败记录。

典型报错 #

SnapshotRestoreException: index [my_index] wasn't fully snapshotted - cannot restore

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

这不是 restore 过程中新产生的损坏,而是 restore 在读取 snapshot 元数据时,发现该索引原本就没有被完整快照。

常见来源包括:

  • 创建 snapshot 时该索引已有失败分片。
  • 快照结果是 PARTIAL,但现在按完整 restore 去恢复。
  • repository 中保存的是一个不完整的索引备份状态。

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

  1. 先查看源 snapshot 的 statefailures 和索引级分片结果。
  2. 确认出错索引在创建快照时是否已经失败或仅部分成功。
  3. 检查本次 restore 是否允许 partial
  4. 若业务要求完整恢复,应改用一个对该索引完全成功的 snapshot。

重点判断 #

  • 如果你需要严格一致的完整恢复,不应对不完整 snapshot 继续恢复。
  • 如果只是尽量恢复可用数据,可以评估是否允许 partial restore

4. 如何解决这个错误 #

常用修复思路 #

  • 选择一个对该索引完全成功的快照重新恢复。
  • 若业务允许部分恢复,在 restore 请求中显式使用 partial
  • 回头修复最初导致 snapshot 不完整的 repository、分片或节点问题。

5. 小结 #

这条异常本质上是在说:问题出在“源快照不完整”,不是 restore API 本身写错。先确认 snapshot 的真实性和完整性,再决定是换快照还是接受 partial 恢复。

相关错误 #

附:日志上下文 #

// Make sure that index was fully snapshotted
if (failed(snapshotInfo, index)) {
    if (request.partial()) {
        return true;
    } else {
        throw new SnapshotRestoreException(snapshot, "index [" + index + "] wasn't fully snapshotted - cannot restore");
    }
} else {
    return false;
}