1 脚本介绍
greenplum 原数据约7TB,使用pg_dump导出分为DDL、DML(DML导出约24小时),生成文件3TB。现在需要将导出的备份文件导入单节点 greenplum 。
恢复的单节点greenplum 硬件配置为8c16G,48个小时内只恢复了60G数据。
为增加恢复速度,将备份的3TB大文件切分成单个50GB的小文件,并使用shell脚本并行导入数据。
2 脚本技术点
2.1 将数据转为数组
files=("$INPUT_DIR"/"$FILE_PREFIX"*) total_files=${#files[@]}
2.2 对数组的for循环
# 并行处理控制 for file in "${files[@]}"; do echo $file done
2.3 并行处理 &
# 并行处理控制 for file in "${files[@]}"; do process_file "$file" & # 控制并行数量 ((counter++)) if ((counter % MAX_PARALLEL == 0)); then wait # 等待当前批次完成 echo "$(fun_datetime)--INFO--已完成 $counter/$total_files 个文件" fi done
3 脚本内容
cat gp_int_data.sh #!/bin/bash # 配置参数 INPUT_DIR="/data/datasplit" # 切割文件目录 FILE_PREFIX="hyydw_part_" # 文件前缀 OUTPUT_DIR="/data/processed" # 处理结果目录 MAX_PARALLEL=10 # 最大并行数 # 创建输出目录 mkdir -p "$OUTPUT_DIR" # 获取所有切割文件 files=("$INPUT_DIR"/"$FILE_PREFIX"*) total_files=${#files[@]} counter=0 # 时间函数 function fun_datetime(){ current_time=`date "+%Y-%m-%d %H:%M:%S"` echo "$current_time--$0" } echo "$(fun_datetime)--INFO--开始处理 $total_files 个文件,并行度: $MAX_PARALLEL" # 处理单个文件的函数 process_file() { local input_file="$1" local filename=$(basename "$input_file") local output_file="$OUTPUT_DIR/${filename}.processed" echo "$(fun_datetime)--INFO--处理中: $filename" # 替换为实际处理命令,例如: # your_processing_tool "$input_file" > "$output_file" # psql -d hyydw < $filename echo "$(fun_datetime)--INFO--psql -d hyydw < $filename" |tee -a $output_file if [ $? -eq 0 ];then echo "$(fun_datetime)--INFO--$filename 导入成功" |tee -a $output_file else echo "$(fun_datetime)--ERROR-- 导入失败" |tee -a $output_file fi # 模拟处理耗时(测试用) sleep $((RANDOM % 5 + 1)) echo "$(fun_datetime)--INFO--完成: $filename → ${filename}.processed" |tee -a $output_file } # 并行处理控制 for file in "${files[@]}"; do process_file "$file" & # 控制并行数量 ((counter++)) if ((counter % MAX_PARALLEL == 0)); then wait # 等待当前批次完成 echo "$(fun_datetime)--INFO--已完成 $counter/$total_files 个文件" fi done wait # 等待剩余任务完成 echo "$(fun_datetime)--INFO--全部完成!共处理 $total_files 个文件" echo "$(fun_datetime)--INFO--结果保存在: $OUTPUT_DIR"
posted on
浙公网安备 33010602011771号