【问题标题】:Bash mysql error handling locked tablesBash mysql错误处理锁定表
【发布时间】:2016-10-06 11:12:31
【问题描述】:

我有一个经常使用几个参数调用的 shell 脚本。它应该构建一个查询并执行该语句。如果发生错误,它应该将单独的参数写入文件,以便可以通过再次调用该脚本来进行错误处理。

一切正常,但

问题是,我捕捉到连接被拒绝错误等,但是如果由于表被锁定而无法执行语句并且我不想等待超时。

我的代码:

...
mysql -u ${username} -p${password} -h ${database} -P ${port} --connect-timeout=1 --skip-reconnect -e "$NQUERY"
    mysqlstatus=$?
    if [ $mysqlstatus -ne 0 ]; then
        echo "[ERROR:QUERY COULD NOT BE EXECUTED:$mysqlstatus: QUERY WRITTEN TO LOG]" >> ${GENLOG} 
        #echo ${NQUERY} >> ${FQUER} 
        for i in "$@"; do
            ARGS="$ARGS $i|"
        done
        echo "${ARGS}" >> ${ARGLOG}
    else
        echo "[OK] $NQUERY" >> ${GENLOG}
    fi
...

但是当一个表被锁定时,执行不会被取消,它会像永远一样运行..

它不是我在 mysql 服务器上设置 Max_statement_time_set 或任何东西的解决方案,因为我不是唯一使用 db 的人

【问题讨论】:

    标签: mysql linux database bash shell


    【解决方案1】:

    你可以和mysql一起使用timeout命令

    timeout 3 mysql -u ...
    

    这将等待 3 秒让 mysql 命令返回,如果命令运行时间更长,则 3 秒超时将返回退出状态 124 到 shell。如果您没有超时,您可以使用类似这样的作业控制。

    #background the process
    mysql -u ... &
    
    #get pid of background process
    bg_pid=$!
    
    sleep 3
    
    #check if your pid is still running
    #using string matching incase pid was re assigned
    if [[ $(ps -p $bg_pid -o args --no-headers) =~ "mysql" ]]
    then
        echo "running to long"
    else
        echo "OK"
    fi
    

    【讨论】:

      猜你喜欢
      • 2023-03-20
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多