使用工具
https://github.com/elasticsearch-dump
https://hub.docker.com/r/elasticdump/elasticsearch-dump
参数说明
更多请参考: https://github.com/elasticsearch-dump/elasticsearch-dump?tab=readme-ov-file#options
1 2 3 4 5 6
| --parallel 并发度 --direction load: 恢复, dump: 导出(默认) --input 数据来源 --match 正则匹配需要导出的索引 --includeType= 导出类型, 支持六种: data,mapping,analyzer,alias,settings,template --output 数据输出
|
环境假设
如果因为分词插件等造成同步失败, 请自行解决
- es6: http://127.0.0.1:9200
- es7 http://127.0.0.1:19200
- esdump6 存储 es6 导出的数据
- esdump7 存储 es7 导出的数据
- 需要备份的索引为
test_backup.*
es6 数据导出恢复
导出
1 2 3 4 5 6
| docker run -v `pwd`/esdump6:/esdump --rm -ti --entrypoint multielasticdump elasticdump/elasticsearch-dump \ --direction=dump \ --match='^test_backup.*$'\ --input=http://127.0.0.1:9200 \ --includeType='settings,mapping,analyzer,alias,data' \ --output=/esdump >es_dump.log 2>&1
|
恢复
1 2 3 4 5 6
| docker run -v `pwd`/esdump6:/esdump --rm -ti --entrypoint multielasticdump elasticdump/elasticsearch-dump \ --parallel=4 \ --direction=load \ --input=/esdump \ --includeType='settings,mapping,analyzer,alias,data' \ --output=http://127.0.0.1:9200 >es_load.log 2>&1
|
es7 数据导出恢复
导出
1 2 3 4 5 6
| docker run -v `pwd`/esdump6:/esdump --rm -ti --entrypoint multielasticdump elasticdump/elasticsearch-dump \ --direction=dump \ --match='^test_backup.*$'\ --input=http://127.0.0.1:19200 \ --includeType='settings,mapping,analyzer,alias,data' \ --output=/esdump >es_dump.log 2>&1
|
恢复
1 2 3 4 5 6
| docker run -v `pwd`/esdump7:/esdump --rm -ti --entrypoint multielasticdump elasticdump/elasticsearch-dump \ --parallel=4 \ --direction=load \ --input=/esdump \ --includeType='settings,mapping,analyzer,alias,data' \ --output=http://127.0.0.1:19200 >es_load.log 2>&1
|
es 跨版本导出恢复
没有 es7 向下恢复到 es6 的需求, 请自行尝试
因为 es6 和 es7 数据结构上不太一致, 所以需要先预处理数据
es6 数据导出后恢复到 es7
预处理数据
这里主要是这三个文件有问题: ‘analyzer.json’, ‘settings.json’, ‘mapping.json’
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
|
'use strict' const fs = require('fs'), path = require('path'), dir = './esdump7'
fs.readdirSync(dir, {withFileTypes: true}).filter(_ => _.isFile()) .map(_ => _.name).filter(_ => ['analyzer.json', 'settings.json'].some(__ => _.includes(__))) .map(_ => path.resolve(__dirname, dir, _)) .forEach(f => { let raw = fs.readFileSync(f, 'utf-8') let json = JSON.parse(JSON.parse(raw)) for (const k in json) { json[k].settings.index.max_ngram_diff = 50 } fs.writeFileSync(f, JSON.stringify(JSON.stringify(json))) })
fs.readdirSync(dir, {withFileTypes: true}).filter(_ => _.isFile()) .map(_ => _.name).filter(_ => ['mapping.json'].some(__ => _.includes(__))) .map(_ => path.resolve(__dirname, dir, _)) .forEach(f => { let raw = fs.readFileSync(f, 'utf-8') let json = JSON.parse(raw) for (const k in json) { for (const j in json[k].mappings) { json[k].mappings = json[k].mappings[j] } } fs.writeFileSync(f, JSON.stringify(json)) })
|
恢复
1 2 3 4 5 6
| docker run -v `pwd`/esdump7:/esdump --rm -ti --entrypoint multielasticdump elasticdump/elasticsearch-dump \ --parallel=4 \ --direction=load \ --input=/esdump \ --includeType='settings,mapping,analyzer,alias,data' \ --output=http://127.0.0.1:19200 >es_load.log 2>&1
|