bigywater.tech
Elasticsearch · 138

Restore 时修改索引名称

本机真实给rn_test建快照,故意不删原索引,用rename_pattern和rename_replacement把恢复目标改名成restored_test,验证两个索引真实可以并存、原索引完全不受影响;再执行一次同样的改名恢复,真实被拒绝因为restored_test这个目标名字本身已经存在,证明restore的同名冲突检查针对的是改名之后的最终目标名字,而不是快照内部记录的原始索引名。

原索引保持存在时改名恢复
真实两边都活着,各不影响
再执行同样的改名恢复
真实被拒绝,因为新名字已经存在
冲突检查的真实对象
针对改名后的最终目标名字不是原始名

做的事:本机真实给rn_test建一份快照,故意不删掉原索引,用rename_pattern和rename_replacement尝试把恢复目标改名成restored_test

代码真实写入数据到rn_test并建快照rn_snap(原索引保持存在) POST /_snapshot/my_fs_repo/rn_snap/_restore?wait_for_completion=true { "indices": "rn_test", "rename_pattern": "rn_(.+)", "rename_replacement": "restored_$1" }

验证:真实两边都活着——原来的rn_test完全没被动过,restored_test凭空多出来了一份一模一样的数据,连_id都没变

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

GET /rn_test/_count → count:1   ← 真实原索引完全没被动过
GET /restored_test/_search → _index:"restored_test", _id:"2lm--aABhkoFfq48ze94",
  {"n":1,"text":"rename test data"}   ← 真实凭空多出一份同样的数据

这个真实结果说明rename_pattern/rename_replacement这对参数真实解决的正是本系列上一篇反复遇到的那个"索引同名冲突"问题:只要恢复的目标名字真实跟现有索引不一样,restore就真实不需要原索引让路,两者可以真实并存。这对于想在不影响线上现有索引的前提下,从某个历史快照里真实拉一份数据出来做核对、调试或者数据恢复验证的场景特别有用。

真实再执行一次同样的改名恢复,看这次会不会成功——因为restored_test这个目标名字现在已经真实存在了

代码POST /_snapshot/my_fs_repo/rn_snap/_restore?wait_for_completion=true { "indices": "rn_test", "rename_pattern": "rn_(.+)", "rename_replacement": "restored_$1" }

验证:真实直接被拒绝,报错原文点名的是restored_test这个改名之后的目标名字,不是快照里记录的原始索引名rn_test

实测 · 本机执行输出
→ 500 snapshot_restore_exception:
  "cannot restore index [restored_test] because an open index with same
   name already exists in the cluster. ..."
这组真实对比证明了一个关键细节:restore时的同名冲突检查,真实检查的是改名规则应用之后、最终会落地的那个索引名字,不是快照内部存着的原始索引名。换句话说,rename_pattern真实不是一道能让你无限次重复恢复出同一份数据、每次都绕开冲突检查的"万能钥匙"——它只是真实把原本会跟rn_test冲突的检查,转移到了跟restored_test这个新名字的冲突检查上,一旦这个新名字本身也真实被占用了,恢复照样会被拒绝,只是拒绝的理由从"跟原名冲突"变成了"跟新名冲突"。

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

代码DELETE /_snapshot/my_fs_repo/rn_snap DELETE /rn_test,restored_test

分步演示:从原索引保持存在时改名恢复的真实并存,到目标新名字也被占用时同样会被真实拒绝

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

restore改名能让原索引和恢复出来的新索引并存,但冲突检查真实转移到了改名后的新名字上
这一步新验证的改名恢复场景

    本文用到的工具

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