如何并行执行MySQL数据库备份与传输脚本以缩短耗时?
实现MySQL备份与传输的并行优化
问题描述
我需要使用mysqldump和rsync将MySQL数据库备份并传输至其他服务器,当前采用分步操作:备份数据库A(约25分钟)→传输数据库A(约30分钟)→备份数据库B(约35分钟)→传输数据库B(约45分钟)……7个数据库总耗时约10小时。现有Bash脚本如下:
bazy=("ast" "biog" "dbaut" "tran2" "dest" "recor" "senti") place="/backup" function dump { /usr/bin/mysqldump -u $user -p$password $baza | gzip -$cl -c > $place/$baza.sql.gz; } function transfer { rsync -Pav -e "ssh -i /usr/src/migration/ky" $place/$baza.sql.gz ro***@$dst:/backup/; } function remove { rm $place/$baza.sql.gz -f; } for baza in ${bazy[@]}; do echo $baza dump transfer remove done
请问是否可以实现并行操作?例如在传输数据库A的同时备份数据库B等。
解决方案
当然可以实现并行操作,核心思路是让传输任务在后台执行,无需等待当前库传输完成再启动下一个库的备份,以此大幅压缩总耗时。以下是两种实用优化方案:
方案一:简单后台并行(无并发控制)
将传输任务放入后台运行,同时在循环结束后等待所有后台任务完成。修改后的脚本解决了原脚本中变量覆盖、提前删除备份文件的问题:
bazy=("ast" "biog" "dbaut" "tran2" "dest" "recor" "senti") place="/backup" # 函数改用传参方式,避免循环变量覆盖 function dump { local db_name=$1 /usr/bin/mysqldump -u $user -p$password "$db_name" | gzip -$cl -c > "$place/$db_name.sql.gz" } function transfer { local db_name=$1 rsync -Pav -e "ssh -i /usr/src/migration/ky" "$place/$db_name.sql.gz" ro***@$dst:/backup/ # 传输完成后再删除备份,避免传输失败导致数据丢失 rm "$place/$db_name.sql.gz" -f echo "$db_name 传输并清理完成" } for baza in "${bazy[@]}"; do echo "开始备份 $baza" dump "$baza" echo "启动后台传输 $baza" transfer "$baza" & done # 等待所有后台传输任务结束 wait echo "所有备份与传输任务已全部完成"
关键说明:
- 备份任务保持串行,避免mysqldump并发过高耗尽数据库IO资源
- 传输任务后台运行,备份完一个库立刻启动下一个库的备份,无需等待传输完成
- 将删除操作整合到传输函数中,确保只有传输成功后才清理本地备份
方案二:控制并发数的并行(推荐)
如果需要限制整体并发量(比如同时运行2-3个备份+传输任务),可以用xargs的-P参数控制进程数,避免服务器或数据库资源过载:
bazy=("ast" "biog" "dbaut" "tran2" "dest" "recor" "senti") place="/backup" # 单个数据库的完整处理流程:备份→传输→清理 process_db() { local db_name=$1 echo "开始处理 $db_name" /usr/bin/mysqldump -u $user -p$password "$db_name" | gzip -$cl -c > "$place/$db_name.sql.gz" rsync -Pav -e "ssh -i /usr/src/migration/ky" "$place/$db_name.sql.gz" ro***@$dst:/backup/ rm "$place/$db_name.sql.gz" -f echo "$db_name 处理完成" } # -P 2 表示同时最多运行2个进程,可根据服务器性能调整 printf "%s\n" "${bazy[@]}" | xargs -I {} -P 2 bash -c 'process_db "$@"' _ {} echo "所有数据库任务已完成"
关键说明:
-P后的数字可按需调整,比如数据库IO性能较强可设为3-4,避免资源耗尽- 每个数据库的备份+传输是串行的,但多个数据库之间并行执行,总耗时会接近单个数据库最长处理时间的总和,而非所有任务时间累加
内容的提问来源于stack exchange,提问作者yarnsik
相关产品推荐
相关产品推荐

