前段时间测试机上的数据库出问题,好几十个操作锁死,一个个kill掉简直会让人疯掉,后来直接重启了mysql,闲来无事,写了个kill掉mysql进程的shell脚本。代码如下:

 

 

  1. #!/bin/sh 
  2. mysql_cmd=mysql; 
  3.  
  4.  
  5. user_help() 
  6.     echo "-------------------------------------------------------"
  7.     echo "| this program help you killing locked mysql process  |"
  8.     echo "|   -c  the type of query.like:Sleep,Locked,Killed    |"
  9.     echo "|   -h  Connect to host.                              |"
  10.     echo "|   -p  password for user.                            |"
  11.     echo "|   -P  port for mysql server.                        |"
  12.     echo "|   -t  the sql execute longest time.                 |"
  13.     echo "|   -u  user for login mysql.                         |"
  14.     echo "-------------------------------------------------------"
  15.  
  16.  
  17. host= userpassword= port= time= type= 
  18. while getopts :c:h:p:P:t:u: opt 
  19.  
  20. do 
  21.     case $opt in 
  22.     c)  
  23.         type=$OPTARG;  
  24.         ;; 
  25.  
  26.     h)  
  27.         host=$OPTARG; 
  28.         ;; 
  29.  
  30.     p)  
  31.         password=$OPTARG; 
  32.         ;; 
  33.     
  34.     P)  
  35.         port=$OPTARG; 
  36.         ;; 
  37.  
  38.     t)  
  39.         time=$OPTARG; 
  40.         ;; 
  41.      
  42.     u) 
  43.         user=$OPTARG; 
  44.         ;; 
  45.   
  46.     '?')  
  47.         user_help ; 
  48.         exit 2; 
  49.         ;; 
  50.  
  51.     ':')  
  52.         echo  option \'-${OPTARG}\' requires an argument;  
  53.         echo "Try '-H' for more infomation"
  54.         exit 2; 
  55.         ;; 
  56.     esac 
  57. done 
  58.  
  59. if [ -z $host ] || [ -z $password ] || [ -z $user ] || [ -z  $port ] 
  60. then 
  61.     user_help; 
  62.     exit 3; 
  63. fi 
  64.  
  65. check
  66. if ! [ -z $type ] 
  67. then 
  68.     check=${check}' && $5='${type}; 
  69. fi 
  70.  
  71. if ! [ -z $time ] 
  72. then 
  73.     check=${check}' && $6>'${time}; 
  74. fi 
  75.  
  76. kill_process=$($mysql_cmd -h $host -u $user -p$password -P $port -e 'show processlist' | awk '{if(NR>1'"${check}"') print $1}' ); 
  77.  
  78. all=0 success=0 fail=0 
  79. for process_id in $kill_process 
  80. do 
  81.     if ($mysql_cmd -h $host -u $user -p$password -P $port -e 'kill '"${process_id}"
  82.     then 
  83.         success=$((success+1)); 
  84.     else 
  85.         fail=$((fail+1)); 
  86.     fi 
  87.     all=$((all+1));  
  88. done 
  89.  
  90. echo kill $all process; 
  91. echo success $success process; 
  92. echo fail $fail process; 

参数说明:

-h 数据库的服务器地址

-u 数据库的用户名

-p(小写) 数据库的密码

-P(大写) 数据库的端口

-c 要kill掉的进程状态,一般为Locked、Sleep,可以进入mysql用show process查看

-t SQL执行的最大时间,超过此最大值将会被kill掉

执行方式如下

./kill_lock.sh   -h127.0.0.1 -uroot -P3306 -p'root' -t 10

 

执行结果如下

杀死locked的mysql进程shell脚本_kill杀死