使用Elasticdump导出Elasticsearch索引数据失败及替代方案咨询
问题根因
你遇到的406报错是因为Elasticsearch 6.0及以上版本强制要求所有携带请求体的HTTP请求必须携带Content-Type: application/json请求头。导出mapping时请求为无请求体的GET请求,ES不会校验该字段,因此执行正常;而导出数据时使用带请求体的滚动查询POST请求,触发了校验逻辑。
添加header参数未生效通常由两个原因导致:一是elasticdump版本过旧,旧版本对headers参数的解析存在bug;二是shell环境下引号转义规则导致参数未被正确识别。
解决方案
步骤1:升级elasticdump到最新版本
如果你是通过npm安装的elasticdump,执行以下命令升级:npm install elasticdump -g
如果你使用elasticdump的Docker镜像,拉取最新版本:docker pull elasticdump/elasticsearch-dump:latest
步骤2:调整参数写法
调整header参数的引号写法,避免shell转义问题:
elasticdump \ --input=http://localhost:9200/sessions2-110125 \ --output=/usr/share/elasticsearch/dump/sessions2-110125_data.json \ --type=data \ --headers="{\"Content-Type\": \"application/json\"}"
步骤3:使用Docker版本执行(可选)
如果本地环境执行仍有问题,可以直接使用官方Docker镜像运行,避免环境差异:
docker run --rm -ti -v /你的本地导出目录:/tmp elasticdump/elasticsearch-dump \ --input=http://宿主机器IP:9200/sessions2-110125 \ --output=/tmp/sessions2-110125_data.json \ --type=data \ --headers='{"Content-Type": "application/json"}'
注意将命令中的宿主机器IP替换为你运行ES服务的机器实际IP,不要使用localhost,避免容器内部网络无法访问ES服务。
替代工具推荐
如果不想排查elasticdump的问题,也可以使用以下工具完成导出需求:
- esm(elasticsearch-loader):轻量导入导出工具,支持JSON、CSV格式,使用简单,导出示例命令:
esm export -u http://localhost:9200 -i sessions2-110125 -o output.json,输出为每行单条文档的JSON格式,可读性高且便于后续处理。 - Logstash:适合大批量数据导出,通过配置elasticsearch input插件和file output插件,可灵活实现字段过滤、格式转换,支持输出为CSV、结构化JSON等多种格式。
- Python自定义脚本:使用elasticsearch官方Python客户端执行滚动查询,逐行写入文件,灵活性最高,可根据需求自定义输出格式。
内容的提问来源于stack exchange,提问作者Eric-Hoffmann
相关产品推荐
相关产品推荐

