--- title: "尝试删除不存在的快照 - 如何解决此 Elasticsearch 异常" date: 2026-03-07 lastmod: 2026-03-07 description: "Attempting to remove non-existent snapshot from repository data 通常表示系统试图从 RepositoryData 中删除一个根本不存在的 snapshot,本文结合快照删除流程说明常见现象和修复方式。" tags: ["快照管理", "存储库", "数据备份"] summary: "适用版本: 6.8-7.7 1. 错误异常的基本描述 # Attempting to remove non-existent snapshot [{}] from repository data 表示 Elasticsearch 在更新 RepositoryData 时,试图删除一个指定的 snapshot,但当前仓库元数据里根本没有这个 snapshot。源码片段也很清楚:如果过滤掉目标 snapshot 后,newSnapshotIds.size() 与原始大小完全相同,就说明要删的 snapshot 不存在,于是抛出 ResourceNotFoundException。 这类问题通常不是存储不可达,而是删除请求与仓库实际元数据不一致。换句话说,调用方认为某个快照还存在,但仓库元数据已经不再包含它。 常见现象 # 删除单个 snapshot 请求返回 not found 或 repository data 异常。 仓库列表中已经没有该快照,但自动化任务仍在尝试删除它。 常见于重复删除、并发删除或元数据缓存过期场景。 从运维角度看,问题更像“删错对象”而不是“删不动对象”。 典型报错与异常栈 # 这类错误通常会与下面这些关键字一起出现: Attempting to remove non-existent snapshot ResourceNotFoundException RepositoryData removeSnapshot 常见日志形态通常类似下面这样: ResourceNotFoundException: Attempting to remove non-existent snapshot [snap-20250301] from repository data 2." --- > **适用版本:** 6.8-7.7 ## 1. 错误异常的基本描述 `Attempting to remove non-existent snapshot [{}] from repository data` 表示 Elasticsearch 在更新 `RepositoryData` 时,试图删除一个指定的 snapshot,但当前仓库元数据里根本没有这个 snapshot。源码片段也很清楚:如果过滤掉目标 snapshot 后,`newSnapshotIds.size()` 与原始大小完全相同,就说明要删的 snapshot 不存在,于是抛出 `ResourceNotFoundException`。 这类问题通常不是存储不可达,而是删除请求与仓库实际元数据不一致。换句话说,调用方认为某个快照还存在,但仓库元数据已经不再包含它。 ### 常见现象 - 删除单个 snapshot 请求返回 not found 或 repository data 异常。 - 仓库列表中已经没有该快照,但自动化任务仍在尝试删除它。 - 常见于重复删除、并发删除或元数据缓存过期场景。 - 从运维角度看,问题更像“删错对象”而不是“删不动对象”。 ### 典型报错与异常栈 这类错误通常会与下面这些关键字一起出现: - `Attempting to remove non-existent snapshot` - `ResourceNotFoundException` - `RepositoryData` - `removeSnapshot` 常见日志形态通常类似下面这样: ```text ResourceNotFoundException: Attempting to remove non-existent snapshot [snap-20250301] from repository data ``` ## 2. 为什么会发生这个错误 根因是删除目标与当前仓库元数据不匹配。最常见的情况是:快照已经被删除、名称写错、调用方使用了过期 snapshot ID,或者并发删除导致第二次删除落空。 常见原因通常包括: - 快照名称或 UUID 写错。 - 同一快照已被其他任务或人工操作删除。 - 自动化脚本基于过期快照列表继续执行删除。 - 多节点/多任务并发删除同一 snapshot。 ## 3. 如何排查和解决这个异常和解决这个异常 建议按“先确认快照在仓库中是否仍然存在,再判断删除请求为何过期”的顺序处理: 1. 列出当前仓库中的 snapshot,确认目标快照是否真的存在。 2. 对照删除请求中的名称或 UUID,排查是否拼写错误或引用旧 ID。 3. 查看是否有并发删除、保留策略任务或人工操作已经提前删除该快照。 4. 修正自动化流程,避免重复删除同一对象。 ### 相关 Elasticsearch API 及调用说明 #### 1. 列出仓库快照 ```bash curl -X GET "http://localhost:9200/_snapshot/my_repo/_all?pretty" ``` 删除前先确认目标 snapshot 是否仍存在。 #### 2. 查看指定快照 ```bash curl -X GET "http://localhost:9200/_snapshot/my_repo/snap-20250301?pretty" ``` 用于验证调用方要删除的快照 ID 是否正确。 #### 3. 删除指定快照 ```bash curl -X DELETE "http://localhost:9200/_snapshot/my_repo/snap-20250301?pretty" ``` 只有在确认 snapshot 仍存在时才应执行删除。 ### 排查时需要注意的问题 - 这是元数据找不到目标对象,不要先从底层存储权限角度误判。 - 对删除型自动化任务,必须避免“按旧列表重复删除”。 - 如果仓库 recently 发生 cleanup 或 retention,要重点看时间顺序。 ## 4. 如何解决这个错误 ### 常用修复思路 - 修正删除目标,确保 snapshot 名称或 UUID 与仓库元数据一致。 - 对已不存在的对象,不要反复重试删除。 - 修复自动化脚本中的快照列表刷新逻辑,避免继续使用陈旧元数据。 ### 后续注意事项与推荐建议 - 为删除流程增加“删除前检查 snapshot 是否存在”的保护。 - 对保留策略和人工删除操作建立审计。 - 在自动化快照治理中缩短列表缓存时间,减少陈旧元数据问题。 ### 借助 INFINI 产品提升排障效率 - [INFINI Console](https://docs.infinilabs.com/console/main/) 适合查看 snapshot 保留与删除历史,帮助判断目标快照是否已被提前清理。 - [INFINI Gateway](https://docs.infinilabs.com/gateway/main/) 适合审计 delete snapshot 请求,定位是谁发起了重复删除。 ## 5. 小结 `Attempting to remove non-existent snapshot from repository data` 的核心不是删除失败,而是目标快照在仓库元数据里已经不存在。处理重点应放在删除请求的正确性和自动化流程的一致性上。 ## 相关错误 - [attempting to remove non-existent snapshots from repository data:批量删除版本会暴露同样的列表过期问题](/knowledge-base/elasticsearch_error/attempting-to-remove-non-existent-snapshots-from-repository-data-how-to-solve-this-elasticsearch-exception/) - [failed to delete snapshots:单个对象不存在时,批量或上层删除任务也会整体失败](/knowledge-base/elasticsearch_error/failed-to-delete-snapshots-how-to-solve-this-elasticsearch-exception/) - [cannot delete snapshot from a readonly repository:删除请求除了目标不存在,还可能压根没有写权限](/knowledge-base/elasticsearch_error/cannot-delete-snapshot-from-a-readonly-repository-how-to-solve-this-elasticsearch-exception/) - [cleanup snapshot step request ... failed to be acknowledged:生命周期驱动的删除任务同样依赖正确的快照存在性判断](/knowledge-base/elasticsearch_error/cleanup-snapshot-step-request-for-repository-repositoryname-and-snapshot-how-to-solve-this-elasticsearch-exception/) - [concurrent modification of the repository before cleanup started:仓库并发变化会让删除目标视图更容易过期](/knowledge-base/elasticsearch_error/concurrent-modification-of-the-repository-before-cleanup-started-how-to-solve-this-elasticsearch-exception/) ## 附:日志上下文 下面保留当前页面中的源码或日志片段,便于继续结合异常调用栈定位问题: ```java public RepositoryData removeSnapshot(final SnapshotId snapshotId, final ShardGenerations updatedShardGenerations) { Map newSnapshotIds = snapshotIds.values().stream() .filter(id -> !snapshotId.equals(id)) .collect(Collectors.toMap(SnapshotId::getUUID, Function.identity())); if (newSnapshotIds.size() == snapshotIds.size()) { throw new ResourceNotFoundException("Attempting to remove non-existent snapshot [{}] from repository data", snapshotId); } Map newSnapshotStates = new HashMap<>(snapshotStates); newSnapshotStates.remove(snapshotId.getUUID()); final Map newSnapshotVersions = new HashMap<>(snapshotVersions); newSnapshotVersions.remove(snapshotId.getUUID()); ```