问题来源:
最近发现数据库中有sleep进程无法关闭,并且阻塞时间过长,需要执行脚本,定时清除
解决方案:
原脚本文件:
#!/bin/sh
MYSQLTOOL=mysql
MYSQLUSER=root
MYSQLPASS=****
HOST=*****
PORT=3306
sleepid="SELECT ID FROM information_schema.PROCESSLIST t WHERE t.COMMAND='Sleep' and time >1200;"
$MYSQLTOOL -h$HOST -u$MYSQLUSER -p$MYSQLPASS -P$PORT -e "$sleepid" >sleepIDs
while read sID
do
if [ ${sID} != 'ID' ];then
echo ${sID}
$MYSQLTOOL -h$HOST -u$MYSQLUSER -p$MYSQLPASS -P$PORT -e "kill ${sID}"
fi
done<sleepIDs
定时任务(每个小时的第一分钟执行):
1 * * * * sh /app/mysql/clean_process/cleanmysql.sh
经过观察,发现脚本文件虽然执行,但是没有生效
修改定时任务执行,将允许过程记录下来
1 * * * * sh /app/mysql/clean_process/cleanmysql.sh >> /app/softlog/cron.log 2>&1
进入该目录下查看,发现报错
/app/mysql/clean_process/cleanmysql.sh: line 9: mysql: command not found
查看脚本,发现是因为执行mysql命令时失败了,mysql -h...这个命令无法识别
在命令行中直接执行mysql可以跳转到数据库,并且执行脚本成功,推测可能是在定时任务执行脚本时,无法直接使用mysql命令,需要带上mysql的全路径
在命令行中使用which mysql 查找mysql全路径,并替换到脚本中,任务成功执行
修改后脚本:
#!/bin/sh
MYSQLTOOL=/alidata/server/mysql/bin/mysql
MYSQLUSER=root
MYSQLPASS=****
HOST=*****
PORT=3306
sleepid="SELECT ID FROM information_schema.PROCESSLIST t WHERE t.COMMAND='Sleep' and time >1200;"
$MYSQLTOOL -h$HOST -u$MYSQLUSER -p$MYSQLPASS -P$PORT -e "$sleepid" >sleepIDs
while read sID
do
if [ ${sID} != 'ID' ];then
echo ${sID}
$MYSQLTOOL -h$HOST -u$MYSQLUSER -p$MYSQLPASS -P$PORT -e "kill ${sID}"
fi
done<sleepIDs