Elasticsearch从S3恢复快照遇snapshot_missing_exception问题求助
快照元数据可见但恢复失败的排查方案
问题背景
我配置了Elasticsearch 9.2.1集群,通过Snapshot Lifecycle Management (SLM)每日将快照存储至S3仓库,原集群快照创建成功且S3桶中可见所有元数据。
新建同版本Elasticsearch集群并注册指向同一S3桶的仓库后,能执行以下命令查看所有快照:
GET _snapshot/nightly-snapshots-003/_all
也能获取单个快照的详细信息:
GET _snapshot/nightly-snapshots-003/snapshot-2026-06-11-00-00-00-utc
但执行恢复命令时:
POST /_snapshot/nightly-snapshots-003/snapshot-2026-06-11-00-00-00-utc/_restore?pretty
出现404错误:
{ "error": { "root_cause": [ { "type": "snapshot_missing_exception", "reason": "[nightly-snapshots-003:snapshot-2026-06-11-00-00-00-utc] is missing" } ], "type": "snapshot_missing_exception", "reason": "[nightly-snapshots-003:snapshot-2026-06-11-00-00-00-utc] is missing", "caused_by": { "type": "no_such_file_exception", "reason": "Blob object [<path-to-meta-file>] not found: The specified key does not exist. (Service: S3, Status Code: 404)" } }, "status": 404 }
多个快照均存在此问题,且存在以下矛盾点:
- 快照在仓库列表中可见
GET _snapshot/<repo>/<snapshot>命令可正常返回快照信息- 仅恢复操作失败,提示无法找到S3中的元数据Blob文件
排查与验证方法
1. 仓库连通性与元数据验证
先执行仓库验证命令,检查集群与S3桶的连通性、权限以及仓库元数据的完整性:
POST _snapshot/nightly-snapshots-003/_verify
该命令会遍历所有节点,测试对S3桶的读写权限,同时验证仓库元数据的基本一致性。
2. 快照完整性深度校验
对单个快照执行完整性检查,确认所有快照组件(元数据、分片文件)是否存在且完整:
POST _snapshot/nightly-snapshots-003/snapshot-2026-06-11-00-00-00-utc/_check
返回结果会明确指出哪些文件缺失或损坏,是定位问题的关键步骤。
3. S3权限与路径核对
- 确认新集群使用的IAM角色/AKSK拥有S3桶的GetObject权限,不能仅配置ListBucket权限(很多时候权限配置遗漏了读取对象的权限,导致能列快照但不能读文件)
- 检查新集群的仓库注册配置,确保
base_path和原集群完全一致:如果原集群仓库指定了base_path,新集群必须使用相同路径,否则会导致Elasticsearch在错误的路径下查找快照文件
4. 手动核对S3文件
根据错误提示中的<path-to-meta-file>,直接登录S3控制台检查该路径下是否存在对应的.meta文件:
- 如果文件确实不存在,说明快照在创建过程中未完整上传,或被后续的清理规则删除
- 如果文件存在,检查文件名大小写、路径是否和Elasticsearch返回的快照元数据中的路径完全匹配(S3路径区分大小写)
5. 清理规则检查
- 检查原集群的SLM策略,确认是否配置了过短的快照保留时间,导致快照数据被自动清理,但元数据未同步删除
- 检查S3桶的生命周期规则,看是否有自动删除旧对象的配置,误删了快照的Blob文件
内容的提问来源于stack exchange,提问作者shiva
相关产品推荐
相关产品推荐

