bash-mysql错误处理锁定表

dxxyhpgq  于 2021-06-25  发布在  Mysql
关注(0)|答案(1)|浏览(320)

我有一个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\语句\时间\集或任何东西都不是一个解决方案,因为我不是唯一一个使用db的人

yfwxisqw

yfwxisqw1#

您可以将timeout命令与mysql一起使用

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

相关问题