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

如何在Cygwin中通过pipe viewer获取数据库导入出错时的进度百分比

解决方案

核心思路是捕获pv输出到标准错误流的进度数据,加载失败时先判断最终进度是否达到100%,如果是则直接判定为加载完成,不再重试。

实现关键点

  • pv默认将进度统计信息输出到标准错误(stderr),真实文件内容输出到标准输出(stdout)传给mysql,二者互不干扰
  • 重定向pv的stderr到临时文件存储,加载失败时读取临时文件最后一行的进度值判断是否已完成全量传输

修改后的脚本代码

try_Load_date_schema(){
    var=$(date +%Y-%m-%d -d "$1").sql;
    count=0;    
    echo $var;
    cddumps;
    echo "starting load ${var}" $2; 
    # 创建临时文件存储pv进度输出
    pv_log=$(mktemp)
    while true; do
        loadSucceeded=1;
        echo "attempt: "$((count+1));
        dropSchema $2;
        createSchema $2;
        # 重定向pv的stderr到临时文件
        pv $var 2> "$pv_log" | mysql --defaults-extra-file=~/localhost.mysql.conf -h 127.0.0.1 -u root --default-character-set=utf8 $2 || loadSucceeded=0;
        if(("$loadSucceeded" == 0));then
            echo "Loading failed"
            # 读取pv最终进度百分比
            final_progress=$(tail -n1 "$pv_log" | grep -o '[0-9]\+%' | head -n1 | tr -d '%')
            # 进度达到100%则判定为加载完成,直接跳出循环
            if [ "$final_progress" -ge 100 ]; then
                echo "Full data transferred, late error ignored, load completed"
                break
            fi
            if (("$count" == 2));then 
                echo " failed to load db with 3 attempts"
                break;
            else
                echo "try loading again ..."
                ((count++))         
            fi
        else
            echo "load Succeeded"
            break;
        fi
    done
    # 清理临时文件
    rm -f "$pv_log"
    echo "ending load"; 
}

补充说明

如果你的pv输出格式有定制化调整,只需要调整final_progress的提取逻辑,匹配到最终的百分比数值即可。这个方案会在全量数据已经通过管道传输给mysql之后,忽略后续mysql返回的错误,符合你不需要重试的需求。

内容的提问来源于stack exchange,提问作者ALI.Boulerouah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 14:45:03