ES数据的备份和导入
·
备份ES索引:
#!/bin/bash
# 定义 Elasticsearch 地址
ELASTICSEARCH_URL="http://X.X.X.X:9200"
# 从命令行参数获取索引名
INDEX_NAME=$1
BACKUP_DIR="/data/es/lastdata"
# 定义 bulkSize 和 concurrency 参数
BULK_SIZE=500
CONCURRENCY=3
# 从命令行参数获取偏移量
OFFSET=$2
# 检查 elasticdump 是否可用
if ! command -v elasticdump &> /dev/null; then
echo "错误: elasticdump 未安装,请先安装 elasticdump。"
exit 1
fi
# 检查是否传入索引名
if [ -z "$INDEX_NAME" ]; then
echo "错误: 请提供索引名作为参数。"
exit 1
fi
# 检查是否传入偏移量
if [ -z "$OFFSET" ]; then
echo "错误: 请提供偏移量作为第二个参数。"
exit 1
fi
# 创建以索引名命名的文件夹
INDEX_BACKUP_DIR="${BACKUP_DIR}/${INDEX_NAME}"
mkdir -p "$INDEX_BACKUP_DIR"
# 记录日志函数
log() {
echo "$(date '+%Y-%m-%d %H:%M:%S'): $1"
}
# 备份函数
backup() {
local backup_type=$1
local progress_file="${INDEX_BACKUP_DIR}/${INDEX_NAME}_${backup_type}.progress.json"
local output_file="${INDEX_BACKUP_DIR}/${INDEX_NAME}_${backup_type}.json"
# 创建进度文件(如果不存在)
if [ ! -f "$progress_file" ]; then
touch "$progress_file"
log "创建了 ${backup_type} 备份进度文件: $progress_file"
fi
log "开始备份索引 ${INDEX_NAME} 的 ${backup_type} 从偏移量 $OFFSET..."
elasticdump \
--input="${ELASTICSEARCH_URL}/${INDEX_NAME}" \
--output="$output_file" \
--type="$backup_type" \
--searchBody "{\"from\": $OFFSET, \"size\": $BULK_SIZE}" \
--progressFile="$progress_file" \
--concurrency="$CONCURRENCY" \
--overwrite
if [ $? -ne 0 ]; then
log "错误: 备份索引 ${INDEX_NAME} 的 ${backup_type} 失败。"
exit 1
fi
log "索引 ${INDEX_NAME} 的 ${backup_type} 备份完成。"
}
# 备份索引数据
backup "data"
# 备份索引映射
backup "mapping"
# 备份索引设置
backup "settings"
还原ES索引:
#!/bin/bash
# 定义 Elasticsearch 地址
ELASTICSEARCH_URL="http://localhost:9200"
# 定义日志文件
LOG_FILE="/var/log/es_restore.log"
# 定义并发数
CONCURRENCY=6
# 定义批量大小
BULK_SIZE=10000
# 定义每次查询返回的文档数量
LIMIT=20000
# 定义超时时间(毫秒)
TIMEOUT=60000
# 定义重试次数
RETRY_COUNT=3
# 记录日志函数
log() {
local timestamp=$(date)
echo "$timestamp: $1" >> $LOG_FILE
echo "$timestamp: $1"
}
# 检查备份文件是否存在
check_backup_files() {
local INDEX_NAME=$1
local BACKUP_DIR="/data/es/lastdata/${INDEX_NAME}"
local files=("${BACKUP_DIR}/${INDEX_NAME}_settings.json" "${BACKUP_DIR}/${INDEX_NAME}_mapping.json" "${BACKUP_DIR}/${INDEX_NAME}_data.json")
for file in "${files[@]}"; do
if [ ! -f "$file" ]; then
log "错误: 备份文件 $file 不存在。"
exit 1
fi
done
}
# 恢复索引的通用函数
restore_index_part() {
local INDEX_NAME=$1
local part_type=$2
local BACKUP_DIR="/data/es/lastdata/${INDEX_NAME}"
local input_file="${BACKUP_DIR}/${INDEX_NAME}_${part_type}.json"
local progress_file="${BACKUP_DIR}/${INDEX_NAME}_${part_type}.progress.json"
local extra_args=""
if [ "$part_type" = "data" ]; then
extra_args="--limit=$LIMIT --concurrency=$CONCURRENCY --bulkSize=$BULK_SIZE --timeout=$TIMEOUT --sourceOnly"
fi
log "Restoring index $part_type for $INDEX_NAME..."
if [ -f "$progress_file" ]; then
log "检测到 $part_type 恢复进度文件,尝试从中断处继续恢复..."
elasticdump \
--input="$input_file" \
--output="${ELASTICSEARCH_URL}/${INDEX_NAME}" \
--type="$part_type" \
--continue="$progress_file" \
--retry=$RETRY_COUNT \
$extra_args
else
elasticdump \
--input="$input_file" \
--output="${ELASTICSEARCH_URL}/${INDEX_NAME}" \
--type="$part_type" \
--progressFile="$progress_file" \
--retry=$RETRY_COUNT \
$extra_args
fi
if [ $? -ne 0 ]; then
log "Error restoring index $part_type for $INDEX_NAME."
exit 1
fi
}
# 从指定路径的 vin.txt 中读取 INDEX_NAME 并循环处理
while IFS= read -r INDEX_NAME; do
# 检查 INDEX_NAME 是否为空
if [ -z "$INDEX_NAME" ]; then
continue
fi
# 记录开始时间和信息
log "Starting index restoration for $INDEX_NAME"
# 检查备份文件
check_backup_files "$INDEX_NAME"
# 恢复索引设置
restore_index_part "$INDEX_NAME" "settings"
# 恢复索引映射
restore_index_part "$INDEX_NAME" "mapping"
# 恢复索引数据
restore_index_part "$INDEX_NAME" "data"
# 记录结束时间和信息
log "Index restoration for $INDEX_NAME completed successfully."
done < /data/es/vin.txt
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)