es数据导入导出(es数据导入导出)
使用elasticdump导入导出数据
一 、安装elasticdump
终端中输入
1 npm install elasticdump -g
-g表示全局可用 ,直接在终端输入 elasticdump --version ,出现版本信息即表示安装成功 ,如下
1
2 C:\Users\T470s>elasticdump --version
6.3.3二 、常用的导入导出方法
1 、将索引中的数据导出到本地
1 elasticdump --input=http://localhost:9200/demo --output=D:/ES/date/demo.json
其中 ,demo是索引 。
2 、将本地数据导入es中
1 elasticdump --input=D:/ES/date/demo.json --output=http://localhost:9200/demo1
3 、将es导入另一个es
1 elasticdump --input=http://ip:9200/demo --output=http://127.0.0.1:9200/demo
4 、含有分词的导入
前文:公司正在运行的项目需要搭一个测试环境 ,需要将正式环境的ES里面存储的数据导入到该测试环境的ES服务器里面 。使用本地的windows系统来实现 。
1 ,环境准备
因为elaticdump 依赖于nodejs的环境 ,需要下载nodejs的相关依赖环境 ,去nodejs官网直接安装包 ,我下载的是msi安装程序 ,安装好之后会直接配置好环境变量 ,在cmd或者Powershell直接下载elaticdump 即可:
1 npm install elasticdump2 ,生产环境导出到测试环境
1)导出分词器,导出分词器的时候要特别注意 ,我们只能根据索引单个导入 ,不能全部导出,全部导出会出现索引不存在的错误:
1 elasticdump --input=http://ip:9200 --output=http://127.0.0.1:9200/ --type=analyzer --all=true
该全部导出导入的命令会如下错误:
1 Error Emitted => {“root_cause ”:[{“type ”:“action_request_validation_exception ”,“reason ”:“Validation Failed: 1: index is missing; ”}],“type ”:“action_request_validation_exception ”,“reason ”:“Validation Failed: 1: index is missing; ”}
所以后面改为按索引分别导入则可以:
1
2
3 elasticdump --input=http://ip:9200/applog --output=http://127.0.0.1:9200/applog --type=analyzer
elasticdump --input=http://ip:9200/cms_article --output=http://127.0.0.1:9200/cms_article --type=analyzer
elasticdump --input=http://ip:9200/followup --output=http://127.0.0.1:9200/followup --type=analyzer
坑:再倒入的时候我并不知道到底有多少个索引 ,如何确定索引的名称?
这里我是直接先导出所有映射mapping到本地 ,然后找到索引的名称再到各导入分词:
1 elasticdump --input=D:/mapping.json --output=http://127.0.0.1:9200/ --all=true --type=mapping
疑惑:我这里的索引目前只有三个 ,如果是多个怎么处理?超过100?
2)导出映射mapping
映射mapping可以直接全部导入导出,直接命令:
1 elasticdump --input=http://ip:9200/ --output=http://127.0.0.1:9200/ --all=true --type=mapping
3)导出全部数据data
每个索引下的数据可以全部一次性导入:
1 elasticdump --input=http://ip:9200/ --output=http://127.0.0.1:9200/ --all=true --type=data
3,总结
1) ,如果不导入analyzer会怎么样?
我试过如果只导入data和mapping ,则数据会导入 ,mapping会发生变化 ,最终的结果没有分词的效果 。
2) ,如果不导入mapping也不会有分词的效果 。
3) ,顺序导入最好按照:analyzer ,mapping和data这个顺序来 ,防止出现分词失效的结果 。顺序导入按照:analyzer ,mapping,data
es数据的导出
//索引的导出
// 导出 index 的 mapping 到 .json 文件
elasticdump \ --input=http://production.es.com:9200/demo \ --output=/data/demo.json \ --type=mapping//导出全部索引
elasticdump --input=http://ip:9200/ --output=http://127.0.0.1:9200/ --all=true --type=mapping//数据的导出
// 导出 index 的所有数据到 .json 文件
elasticdump \ --input=http://production.es.com:9200/demo \ --output=/data/demo.json \ --type=data//导出全部数据
elasticdump --input=http://ip:9200/ --output=http://127.0.0.1:9200/ --all=true --type=data//分词器导出
//导出分词器 ,导出分词器的时候要特别注意 ,我们只能根据索引单个导入,不能全部导出 ,全部导出会出现索引不存在的错误
//改为按索引分别导入: elasticdump --input=http://ip:9200/applog --output=http://127.0.0.1:9200/applog --type=analyzer elasticdump --input=http://ip:9200/cms_article --output=http://127.0.0.1:9200/cms_article --type=analyzer elasticdump --input=http://ip:9200/followup --output=http://127.0.0.1:9200/followup --type=analyzeres数据的导入
从本地文件导入数据
elasticdump --input=/data/demo.json --output=http://localhost:9200/demo1将es导入另一个es
elasticdump --input=http://ip:9200/demo --output=http://127.0.0.1:9200/demo#!/usr/bin/env bash
array=(“full_vehicle_portrait ” “latest_car_history_trail_dt ” “vehicle_abnormal_monitor ” “gantry_transaction-20200914” “vehicle_abnormal_summary ”)
for(( i=0;i<KaTeX parse error: Expected }, got # at position 2: {#̲array[@]};i++))…{array[i]}
#创建索引
curl -X PUT ‘http://cdh173:9200/$VAR1?pretty’elasticdump
–input=http://33.69.6.95:9200/a
r
r
a
y
[
i
]
−
−
o
u
t
p
u
t
=
h
t
t
p
:
/
/
c
d
h
219
:
9200
/
{array[i]} \ --output=http://cdh219:9200/
array[i]−−output=http://cdh219:9200/{array[i]}
–type=analyzer
elasticdump
–input=http://33.69.6.95:9200/a
r
r
a
y
[
i
]
−
−
o
u
t
p
u
t
=
h
t
t
p
:
/
/
c
d
h
219
:
9200
/
{array[i]} \ --output=http://cdh219:9200/
array[i]−−output=http://cdh219:9200/{array[i]}
–type=settings
elasticdump
–input=http://33.69.6.95:9200/a
r
r
a
y
[
i
]
−
−
o
u
t
p
u
t
=
h
t
t
p
:
/
/
c
d
h
219
:
9200
/
{array[i]} \ --output=http://cdh219:9200/
array[i]−−output=http://cdh219:9200/{array[i]}
–type=mappingccelasticdump --size=200
–input=http://33.69.6.95:9200/a
r
r
a
y
[
i
]
−
−
o
u
t
p
u
t
=
h
t
t
p
:
/
/
c
d
h
219
:
9200
/
{array[i]} \ --output=http://cdh219:9200/
array[i]−−output=http://cdh219:9200/{array[i]}
–type=data
done如果我es里索引非常多 ,这样一个一个去执行依然会耗时 ,怎么做?当然想到了shell脚本 。
脚本名字为:esExportOrInput.sh
#!/bin/sh
index_name=$1
index_data=$1"_data"
index_settings=$1"_settings"
echo “开始执行 ”导出索引Mapping数据
./elasticdump --input=http://source:9200/
i
n
d
e
x
n
a
m
e
/
−
−
o
u
t
p
u
t
=
.
/
index_name/ --output=./
indexname/−−output=./index_name.json --type=mapping
./elasticdump --input=http://source:9200/i
n
d
e
x
n
a
m
e
/
−
−
o
u
t
p
u
t
=
.
/
index_name/ --output=./
indexname/−−output=./index_settings.json --type=settings导出索引数据
./elasticdump --input=http://source:9200/
i
n
d
e
x
n
a
m
e
/
−
−
o
u
t
p
u
t
=
.
/
index_name/ --output=./
indexname/−−output=./index_data.json --type=data --limit=1000#导入索引Mapping数据
echo "执行删除目标服务的索引start:"i
n
d
e
x
n
a
m
e
c
u
r
l
−
X
D
E
L
E
T
E
h
t
t
p
:
/
/
t
a
r
g
e
t
:
9200
/
index_name curl -XDELETE http://target:9200/
indexnamecurl−XDELETEhttp://target:9200/index_name
echo "执行删除目标服务的索引end:“i
n
d
e
x
n
a
m
e
s
l
e
e
p
3
e
c
h
o
"
等待三秒 。 。 。
"
.
/
e
l
a
s
t
i
c
d
u
m
p
−
−
i
n
p
u
t
=
.
/
index_name sleep 3 echo "等待三秒 。 。。" ./elasticdump --input=./
indexnamesleep3echo"等待三秒 。 。。"./elasticdump−−input=./index_settings.json --output=http://target:9200/i
n
d
e
x
n
a
m
e
/
−
−
t
y
p
e
=
s
e
t
t
i
n
g
s
.
/
e
l
a
s
t
i
c
d
u
m
p
−
−
i
n
p
u
t
=
.
/
index_name/ --type=settings ./elasticdump --input=./
indexname/−−type=settings./elasticdump−−input=./index_name.json --output=http://target:9200/i
n
d
e
x
n
a
m
e
/
−
−
t
y
p
e
=
m
a
p
p
i
n
g
.
/
e
l
a
s
t
i
c
d
u
m
p
−
−
i
n
p
u
t
=
.
/
index_name/ --type=mapping ./elasticdump --input=./
indexname/−−type=mapping./elasticdump−−input=./index_data.json --output=http://target:9200/KaTeX parse error: Expected EOF, got # at position 39: …a --limit=1000 #̲清除生成的文件 rm -f .…index_name.json
rm -f ./i
n
d
e
x
s
e
t
t
i
n
g
s
.
j
s
o
n
r
m
−
f
.
/
index_settings.json rm -f ./
indexsettings.jsonrm−f./index_data.json
#清除生成的文件
echo “索引”$index_name"执行完毕 ”执行时候需要传递1个变量 ,就是索引名字index_name
温馨提示:
1 、这个脚本仅仅只能在安装了elasticdump服务器上使用 ,脚本目录在/root/node_modules/elasticdump/bin
2 、导出导入默认100条一批 ,可以添加–limit 每页条数 来自定义每页数量 。
3 、导入的时候一定要限制性settings的文件导入 ,在执行mapping的导入 ,不然会冲突 ,因为settings上带了uuid的唯一标识 。
样例:如果我要对bum_user这个索引的数据从测试环境迁移到压测服务器target上 ,就这样执行命令
./esExportOrInput.sh bum_user留个作业 ,可以对源服务器和目标服务器进行动态参数传递 ,就可以做到万能适配了,有兴趣就重写
创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!