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 2025-06-03 14:30  xibuhaohao  阅读(3)  评论(0)    收藏  举报