Elasticsearch单索引备份及修改映射/设置后恢复方法咨询
操作方案:Elasticsearch索引备份、修改Mapping/Settings后恢复
一、使用elasticdump实现(完全满足需求)
elasticdump可以轻松完成索引的备份、修改配置后恢复操作,步骤如下:
1. 安装elasticdump
确保本地已安装Node.js,然后执行:
npm install elasticdump -g
2. 备份原索引的Settings、Mapping和数据
分别导出三个核心部分到本地文件:
- 备份Settings:
elasticdump \ --input=http://<ES_HOST>:<PORT>/product \ --output=./product_settings.json \ --type=settings
- 备份Mapping:
elasticdump \ --input=http://<ES_HOST>:<PORT>/product \ --output=./product_mapping.json \ --type=mapping
- 备份数据:
elasticdump \ --input=http://<ES_HOST>:<PORT>/product \ --output=./product_data.json \ --type=data
如果ES集群开启了账号验证,需要添加--input-auth="用户名:密码"参数
3. 修改Mapping/Settings
直接编辑本地的product_settings.json和product_mapping.json文件,调整你需要修改的配置(比如字段类型、分片数、副本数、分析器等)。
4. 删除原product索引
curl -XDELETE http://<ES_HOST>:<PORT>/product
5. 创建新的product索引(应用修改后的配置)
先导入修改后的Settings:
elasticdump \ --input=./product_settings.json \ --output=http://<ES_HOST>:<PORT>/product \ --type=settings
再导入修改后的Mapping:
elasticdump \ --input=./product_mapping.json \ --output=http://<ES_HOST>:<PORT>/product \ --type=mapping
6. 导入备份的数据
elasticdump \ --input=./product_data.json \ --output=http://<ES_HOST>:<PORT>/product \ --type=data
二、是否需要重新索引?怎么操作?
当你的修改涉及无法直接在原索引上更新的Mapping配置(比如字段类型从text改成keyword、新增带特殊约束的字段),必须通过重新索引完成——因为Elasticsearch不允许修改已存在字段的核心类型。
除了elasticdump,也可以用ES原生的_reindex API实现,效率更高(适合大数据量场景):
1. 创建临时新索引(应用修改后的Mapping/Settings)
curl -XPUT http://<ES_HOST>:<PORT>/product_new \ -H "Content-Type: application/json" \ -d '{ "settings": { "number_of_shards": 2, # 你的自定义配置 "number_of_replicas": 1 }, "mappings": { "properties": { "name": {"type": "keyword"}, # 示例:修改字段类型 "price": {"type": "float"} } } }'
2. 从原索引重新索引数据到新索引
curl -XPOST http://<ES_HOST>:<PORT>/_reindex \ -H "Content-Type: application/json" \ -d '{ "source": { "index": "product" }, "dest": { "index": "product_new" } }'
3. 删除原索引并替换为新索引
# 删除原索引 curl -XDELETE http://<ES_HOST>:<PORT>/product # 通过别名将新索引映射为原名称(无感知切换) curl -XPOST http://<ES_HOST>:<PORT>/_aliases \ -H "Content-Type: application/json" \ -d '{ "actions": [ {"add": {"index": "product_new", "alias": "product"}} ] }' # 或者直接重命名(部分ES版本支持) curl -XPOST http://<ES_HOST>:<PORT>/_rename/product_new/product
三、注意事项
- 操作前务必验证备份完整性,数据量较大时可以抽样检查备份文件
- 生产环境尽量在低峰期操作,避免影响业务
- 修改Mapping时要确保新配置和数据兼容,比如不要将字符串字段强制改为数值类型,否则会导致数据导入失败
内容的提问来源于stack exchange,提问作者Whereismywall
相关产品推荐
相关产品推荐

