如何在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
相关产品推荐
相关产品推荐

