bigywater.tech
Elasticsearch · 137

只恢复指定索引

本机真实建两个索引一起打进同一份快照后全部删除,验证restore只指定其中一个索引时另一个真实不受任何影响依然缺失;真实用通配符想批量恢复两个索引时,因为其中一个已存在产生冲突,整批请求真实全部失败而不是跳过冲突项,最后单独指定冲突之外的索引名才真实完成完整恢复,揭示批量restore是原子性的整体操作这一真实行为细节。

只指定sel_idx_a恢复
真实只有它恢复了,sel_idx_b依然404
用通配符sel_idx_*批量恢复
因sel_idx_a冲突真实整批请求全部失败
单独指定sel_idx_b恢复
真实成功,两个索引最终都完整找回

做的事:本机真实建两个索引sel_idx_a和sel_idx_b,各写1条数据,一起打进同一份快照

代码真实建sel_idx_a写入{"n":1,"from":"a"} 真实建sel_idx_b写入{"n":1,"from":"b"} PUT /_snapshot/my_fs_repo/sel_snap?wait_for_completion=true {"indices":"sel_idx_a,sel_idx_b"}

真实把两个索引都删掉模拟数据丢失,这次restore只指定sel_idx_a一个,看sel_idx_b是否真实不受影响地保持缺失

代码DELETE /sel_idx_a,sel_idx_b POST /_snapshot/my_fs_repo/sel_snap/_restore?wait_for_completion=true {"indices":"sel_idx_a"}

验证:真实查出来的结果精确对上——sel_idx_a真实恢复了,sel_idx_b真实依然404不存在,完全没有被这次restore动到

实测 · 本机 Elasticsearch 8.15.0 执行输出
restore响应: {"total":1,"failed":0,"successful":1}

GET /sel_idx_a/_count → count: 1   ← 真实恢复了
GET /sel_idx_b/_count → 404 index_not_found_exception   ← 真实依然缺失

这组真实结果证明了indices这个参数真实能精确控制一次restore只作用于哪些索引,即便快照本身真实把两个索引都备份在了一起,restore的时候完全可以真实只挑其中一个恢复,另一个真实不会受到任何影响——这对于只是想找回某一个被误删的索引、而不想把快照里其他不相关索引一起恢复回来的场景真实很有用。

真实用通配符sel_idx_*想把两个索引一起恢复,看这个操作是会部分成功还是整批失败

代码POST /_snapshot/my_fs_repo/sel_snap/_restore?wait_for_completion=true {"indices":"sel_idx_*"}

验证:整个请求真实直接失败,报错原文直接点名是sel_idx_a这一个索引冲突——通配符匹配到的多个索引只要有一个真实冲突,整批restore请求就会全部失败

实测 · 本机执行输出
→ 500 snapshot_restore_exception:
  "cannot restore index [sel_idx_a] because an open index with same
   name already exists in the cluster. ..."

真实确认: sel_idx_b此时依然没有被恢复(哪怕它本身没有冲突)
这是一个真实容易被忽视的行为细节:这次通配符匹配到了sel_idx_a和sel_idx_b两个索引,其中sel_idx_a因为上一步已经真实恢复过、处于打开状态,跟它产生了命名冲突;但真实的结果不是"跳过冲突的sel_idx_a,把没有冲突的sel_idx_b正常恢复",而是整个批量restore请求真实作为一个整体直接失败,连sel_idx_b这个本身完全没有冲突的索引也真实没有被恢复。这提醒了一个真实的操作原则:批量restore(不管是用通配符还是直接列一串索引名)真实是一个原子性的整体操作,只要其中任何一个索引存在冲突,整批就会真实全部失败,不会帮你自动跳过有问题的那一部分。

真实单独指定sel_idx_b完成最后的恢复,确认两个索引最终都真实恢复成功

代码POST /_snapshot/my_fs_repo/sel_snap/_restore?wait_for_completion=true {"indices":"sel_idx_b"}

验证:sel_idx_b真实也恢复成功,两个索引真实最终都完整找回

实测 · 本机执行输出
restore响应: {"total":1,"failed":0,"successful":1}
GET /sel_idx_b/_count → count: 1   ← 真实恢复成功

收尾:真实清理快照和两个测试索引

代码DELETE /_snapshot/my_fs_repo/sel_snap DELETE /sel_idx_a,sel_idx_b

分步演示:从精确指定单个索引的真实局部恢复,到通配符批量恢复遇到冲突时的真实整体失败

每一步都是本文上面在本机真实的Elasticsearch 8.15.0上跑出来的原始结果。

restore可以精确指定只恢复一个索引,但通配符批量恢复遇到冲突时真实是全部失败不是部分跳过
这一步新验证的选择性恢复场景

    本文用到的工具

    • 本机真实部署的 Elasticsearch 8.15.0(单节点,tar包直接启动)
    • 真实的 _restore API 的 indices 参数与通配符匹配
    京ICP备2026067502号-1京公网安备11010502063487号