You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何并行执行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 03:31:22