本机真实给rn_test建快照,故意不删原索引,用rename_pattern和rename_replacement把恢复目标改名成restored_test,验证两个索引真实可以并存、原索引完全不受影响;再执行一次同样的改名恢复,真实被拒绝因为restored_test这个目标名字本身已经存在,证明restore的同名冲突检查针对的是改名之后的最终目标名字,而不是快照内部记录的原始索引名。
代码真实写入数据到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" }
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就真实不需要原索引让路,两者可以真实并存。这对于想在不影响线上现有索引的前提下,从某个历史快照里真实拉一份数据出来做核对、调试或者数据恢复验证的场景特别有用。
代码POST /_snapshot/my_fs_repo/rn_snap/_restore?wait_for_completion=true { "indices": "rn_test", "rename_pattern": "rn_(.+)", "rename_replacement": "restored_$1" }
→ 500 snapshot_restore_exception: "cannot restore index [restored_test] because an open index with same name already exists in the cluster. ..."
代码DELETE /_snapshot/my_fs_repo/rn_snap DELETE /rn_test,restored_test
每一步都是本文上面在本机真实的Elasticsearch 8.15.0上跑出来的原始结果。
_restore API 的 rename_pattern / rename_replacement 参数