Crontab自动执行脚本Kill掉MySQL的僵死进程

  • 时间:
  • 浏览:1
  • 来源:5分快乐8下注平台-5分快乐8注册平台_5分快乐8官网平台

  MySQL + PHP的模式在大并发压力下突然会意味MySQL中处于几滴 僵死多线程 ,意味服务挂死。为了自动干掉有有哪些多线程 ,弄了个脚本,放入服务器后台通过crontab自动执行。发现原先 做了并且,的确很好的缓解了你是什么问题。把你是什么脚本发出来和让.我Share。

根据被委托人的实际不能 ,做了你是什么修改:

  SHELL脚本:mysqld_kill_sleep.sh

#!/bin/sh

mysql_pwd="root的密码"

mysqladmin_exec="/usr/local/bin/mysqladmin"

mysql_exec="/usr/local/bin/mysql"

"/tmp"

mysql_timeout_log="$mysql_timeout_dir/mysql_timeout.log"

mysql_kill_timeout_sh="$mysql_timeout_dir/mysql_kill_timeout.sh"

"$mysql_timeout_dir/mysql_kill_timeout.log"

$mysqladmin_exec -uroot -p"$mysql_pwd" processlist | awk '{ print $12 , $2 ,$4}' | grep -v Time | grep -v '|' | sort -rn > $mysql_timeout_log

awk '{if($1>60 && $3!="root") print "'""$mysql_exec""' -e " "/"" "kill",$2 "/"" " -uroot " "-p""/"""'""$mysql_pwd""'""/"" ";" }' $mysql_timeout_log > $mysql_kill_timeout_sh

echo "check start ...." >> $mysql_kill_timeout_log

echo `date` >> $mysql_kill_timeout_log

cat $mysql_kill_timeout_sh

  把你是什么写到mysqld_kill_sleep.sh。并且 chmod 0 mysqld_kill_sleep.sh,chmod u+rx mysqld_kill_sleep.sh,并且 用root账户到cron上面运行即可,时间被委托人调整。执行并且显示:

www# ./mysqld_kill_sleep.sh

/usr/local/bin/mysql -e "kill 27549" -uroot -p"mysql root的密码";

/usr/local/bin/mysql -e "kill 27760 " -uroot -p"mysql root的密码";

/usr/local/bin/mysql -e "kill 27840" -uroot -p"mysql root的密码";

/usr/local/bin/mysql -e "kill 27867" -uroot -p"mysql root的密码";

/usr/local/bin/mysql -e "kill 27899" -uroot -p"mysql root的密码";

/usr/local/bin/mysql -e "kill 27901" -uroot -p"mysql root的密码";

/usr/local/bin/mysql -e "kill 27758" -uroot -p"mysql root的密码";

/usr/local/bin/mysql -e "kill 27875" -uroot -p"mysql root的密码";

/usr/local/bin/mysql -e "kill 27697" -uroot -p"mysql root的密码";

"kill 27888" -uroot -p"mysql root的密码";

/usr/local/bin/mysql -e "kill 27861" -uroot -p"mysql root的密码";

  机会确认这样问题了,把最后的cat修改为sh即可。被委托人改写了下上面的脚本:

#!/bin/bash

mysql_pwd="密码"

mysql_exec="/usr/local/mysql/bin/mysql"

mysql_timeout_dir="/tmp"

mysql_kill_timeout_sh="$mysql_timeout_dir/mysql_kill_timeout.sh"

"$mysql_timeout_dir/mysql_kill_timeout.log"

$mysql_exec -uroot -p$mysql_pwd -e "show processlist" | grep -i "Locked" >> $mysql_kill_timeout_log

for line in `$mysql_kill_timeout_log | awk '{print $1}'`



do

echo "$mysql_exec -uroot -p$mysql_pwd -e /"kill $line/"" >> $mysql_kill_timeout_sh

done

cat $mysql_kill_timeout_sh

  好多好多 并且!一不小心就锁表!这里讲处里锁表终极最好的办法!

案例一

mysql>showprocesslist;

  参看sql一段话,一般少一段话

mysql>killthread_id;

  就都不能 处里了,kill掉第另有一两个 锁表的多线程 , 依然这样改善.既然不改善,咱们就想最好的办法将所有锁表的多线程 kill掉吧,简单的脚本如下:

#!/bin/bash

mysql-uroot-e"show processlist"|grep-i"Locked">>locked_log.txt

forlinein`cat locked_log.txt | awk '{print$1}'`



do

echo"kill$line;">>kill_thread_id.sql

done

现在kill_thread_id.sql的内容像你是什么样子

kill66402982;

kill66402983;

kill66402986;

kill66402991;

.....

好了,让.我在mysql的shell中执行,就都不能 把所有锁表的多线程 杀死了。

mysql>sourcekill_thread_id.sql

当然了,也都不能 一行甩掉。

foridin`mysqladmin processlist | grep -i locked | awk '{print$1}'`

do

mysqladminkill${id}

done

案例二

  机会大批量的操作不能通过一系列的select一段话产生,这样理论上就能对有有哪些结果批量处里。并且 mysql并没用提供eval原先 的对结果集进行分析操作的功能。好多好多 这样现将select结果保存到临时文件中,并且 再执行临时文件中的指令。具体过程如下:

mysql> SELECT concat('KILL ',id,';') FROM information_schema.processlist WHERE user='root';

+------------------------+

| concat('KILL ',id,';')

+------------------------+

| KILL 3101;

| KILL 2946;

+------------------------+

2 rows IN SET (0.00 sec)

mysql> SELECT concat('KILL ',id,';') FROM information_schema.processlist WHERE user='root' INTO OUTFILE '/tmp/a.txt';



Query OK, 2 rows affected (0.00 sec)

mysql> source /tmp/a.txt;



Query OK, 0 rows affected (0.00 sec)

案例三

  MySQL + PHP的模式在大并发压力下突然会意味MySQL中处于几滴 僵死多线程 ,意味服务挂死。为了自动干掉有有哪些多线程 ,弄了个脚本,放入服务器后台通过crontab自动执行。发现原先 做了并且,的确很好的缓解了你是什么问题。把你是什么脚本发出来和让.我Share。根据被委托人的实际不能 ,做了你是什么修改:

SHELL脚本:mysqld_kill_sleep.sh

#!/bin/sh

mysql_pwd="root的密码"

mysqladmin_exec="/usr/local/bin/mysqladmin"

mysql_exec="/usr/local/bin/mysql"

mysql_timeout_dir="/tmp"

mysql_timeout_log="$mysql_timeout_dir/mysql_timeout.log"

mysql_kill_timeout_sh="$mysql_timeout_dir/mysql_kill_timeout.sh"

mysql_kill_timeout_log="$mysql_timeout_dir/mysql_kill_timeout.log"

$mysqladmin_exec -uroot -p"$mysql_pwd" processlist | awk '{ print $12 , $2 ,$4}' | grep -v Time | grep -v '|' | sort -rn > $mysql_timeout_log

awk '{if($1>60 && $3!="root") print "'""$mysql_exec""' -e " "\"" "kill",$2 "\"" " -uroot " "-p""\"""'""$mysql_pwd""'""\"" ";" }' $mysql_timeout_log > $mysql_kill_timeout_sh

echo "check start ...." >> $mysql_kill_timeout_log

echo `date` >> $mysql_kill_timeout_log

cat $mysql_kill_timeout_sh

  把你是什么写到mysqld_kill_sleep.sh。并且 chmod 0 mysqld_kill_sleep.sh,chmod u+rx mysqld_kill_sleep.sh,并且 用root账户到cron上面运行即可,时间被委托人调整。执行并且显示:

www# ./mysqld_kill_sleep.sh

/usr/local/bin/mysql -e "kill 27549" -uroot -p"mysql root的密码";

/usr/local/bin/mysql -e "kill 27760 " -uroot -p"mysql root的密码";

/usr/local/bin/mysql -e "kill 27840" -uroot -p"mysql root的密码";

/usr/local/bin/mysql -e "kill 27867" -uroot -p"mysql root的密码";

/usr/local/bin/mysql -e "kill 27899" -uroot -p"mysql root的密码";

/usr/local/bin/mysql -e "kill 27901" -uroot -p"mysql root的密码";

/usr/local/bin/mysql -e "kill 27758" -uroot -p"mysql root的密码";

/usr/local/bin/mysql -e "kill 27875" -uroot -p"mysql root的密码";

/usr/local/bin/mysql -e "kill 27697" -uroot -p"mysql root的密码";

/usr/local/bin/mysql -e "kill 27888" -uroot -p"mysql root的密码";

/usr/local/bin/mysql -e "kill 27861" -uroot -p"mysql root的密码";

  机会确认这样问题了,把最后的cat修改为sh即可。被委托人改写了下上面的脚本:

#!/bin/bash

mysql_pwd="密码"

mysql_exec="/usr/local/mysql/bin/mysql"

mysql_timeout_dir="/tmp"

mysql_kill_timeout_sh="$mysql_timeout_dir/mysql_kill_timeout.sh"

mysql_kill_timeout_log="$mysql_timeout_dir/mysql_kill_timeout.log"

$mysql_exec -uroot -p$mysql_pwd -e "show processlist" | grep -i "Locked" >> $mysql_kill_timeout_log

chmod 777 $mysql_kill_timeout_log

for line in `$mysql_kill_timeout_log | awk '{print $1}'`

do

echo "$mysql_exec -uroot -p$mysql_pwd -e \"kill $line\"" >> $mysql_kill_timeout_sh

done

chmod 777 $mysql_kill_timeout_sh

cat $mysql_kill_timeout_sh

  是都不 很方便呢!processlist命令的输出结果显示了有有哪些多线程 在运行,都不能 帮助识别出有问题的查询一段话,你是什么最好的办法使用你是什么命令。

  • 1、进入mysql/bin目录下输入mysqladmin processlist;
  • 2、启动mysql,输入show processlist;

  机会有SUPER权限,则都不能 看了完整篇 的多线程 ,并且 ,这样看了被委托人发起的多线程 (这是指,当前对应的MySQL帐户运行的多线程 )。得到数据形式如下(只截取了三条):

mysql> show processlist;

+-----+-------------+--------------------+-------+---------+-------+----------------------------------+----------

| Id | User | Host | db | Command | Time| State | Info

+-----+-------------+--------------------+-------+---------+-------+----------------------------------+----------

|207|root |192.168.0.20:51718 |mytest | Sleep | 5 | | NULL

|208|root |192.168.0.20:51719 |mytest | Sleep | 5 | | NULL

|220|root |192.168.0.20:51731 |mytest |Query | 84 | Locked |

select bookname,culture,value,type from book where id=001

  先简单说一下各列的含义和用途,第一列,id,何必 了吧,另有一两个 标识,我都不能 要kill另有一两个 一段话的并且很有用。user列,显示单前用户,机会都不 root,你是什么命令就只显示你权限范围内的sql一段话。host列,显示你是什么一段话是从哪个ip的哪个端口上发出的。呵呵,都不能 用来追踪出问题一段话的用户。db列,显示你是什么多线程 目前连接的是哪个数据库。command列,显示当前连接的执行的命令,一般好多好多 我休眠(sleep),查询(query),连接(connect)。time列,此你是什么清况 持续的时间,单位是秒。state列,显示使用当前连接的sql一段话的清况 ,有点硬要的列,后续会有所有的清况 的描述,请注意,state好多好多 我一段话执行中的某另有一两个 清况 ,另有一两个 sql一段话,已查询为例,机会不能 经过copying to tmp table,Sorting result,Sending data等清况 才都不能 完成,info列,显示你是什么sql一段话,机会长度有限,好多好多 长的sql一段话就显示不全,并且 另有一两个 判断问题一段话的重要最好的办法。

  你是什么命令中最关键的好多好多 我state列,mysql列出的清况 主要有以下几种:

Checking table

  正在检查数据表(这是自动的)。

Closing tables

  正在将表中修改的数据刷新到磁盘中,一齐正在关闭机会用完的表。这是另有一两个 迅速的操作,机会都不 原先 一段话,就应该确认磁盘空间是不是机会满了机会磁盘是不是正处于重负中。

Connect Out

  qq克隆好友 从服务器正在连接主服务器。

Copying to tmp table on disk

  机会临时结果集大于tmp_table_size,正在将临时表从内存存储转为磁盘存储以此节省内存。

Creating tmp table

  正在创建临时表以存放每段查询结果。

deleting from main table

  服务器正在执行多表删除中的第一每段,刚删除第另有一两个 表。

deleting from reference tables

  服务器正在执行多表删除中的第二每段,正在删除你是什么表的记录。

Flushing tables

  正在执行FLUSH TABLES,等候你是什么多线程 关闭数据表。

Killed

  发送了另有一两个 kill请求给某多线程 ,这样你是什么多线程 机会检查kill标志位,同都不 放弃下另有一两个 kill请求。MySQL会在每次的主循环中检查kill标志位,不过你是什么清况 下该多线程 机会会过一小段不能死掉。机会该多线程 程被你是什么多线程 锁住了,这样kill请求会在锁释放时马上生效。

Locked

  被你是什么查询锁住了。

Sending data

  正在处里Select查询的记录,一齐正在把结果发送给客户端。

Sorting for group

  正在为GROUP BY做排序。

Sorting for order

  正在为ORDER BY做排序。

Opening tables

  你是什么过程应该会迅速,除非受到你是什么因素的干扰。类式,在执Alter TABLE或LOCK TABLE一段话行完并且,数据表无法被你是什么多线程 打开。正尝试打开另有一两个 表。

Removing duplicates

  正在执行另有一两个 Select DISTINCT最好的办法的查询,并且 MySQL无法在前另有一两个 阶段优化掉有有哪些重复的记录。并且 ,MySQL不能 再次上加重复的记录,并且 再把结果发送给客户端。

Reopen table

  获得了对另有一两个 表的锁,并且 不能 在表特征修改并且不能获得你是什么锁。机会释放锁,关闭数据表,正尝试重新打开数据表。

Repair by sorting

  修复指令正在排序以创建索引。

Repair with keycache

  修复指令正在利用索引缓存另有一两个 另有一两个 地创建新索引。它会比Repair by sorting慢些。

Searching rows for update

  正在讲符合条件的记录找出来以备更新。它不能 在Update要修改相关的记录并且就完成了。

Sleeping

  正在等候客户端发送新请求.

System lock

  正在等候取得另有一两个 内部内部结构的系统锁。机会当前这样运行多个mysqld服务器一齐请求同另有一两个 表,这样都不能 通过增加--skip-external-locking参数来禁止内部内部结构系统锁。

Upgrading lock

  Insert DELAYED正在尝试取得另有一两个 锁表以插入新记录。

Updating

  正在搜索匹配的记录,并且 修改它们。

User Lock

  正在等候GET_LOCK()。

Waiting for tables

  该多线程 得到通知,数据表特征机会被修改了,不能 重新打开数据表以取得新的特征。并且 ,为了能的重新打开数据表,不能 等到所有你是什么多线程 关闭你是什么表。以下几种清况 下会产生你是什么通知:

FLUSH TABLES tbl_name, Alter TABLE, RENAME TABLE, REPAIR TABLE, ANALYZE TABLE,或OPTIMIZE TABLE。

waiting for handler insert

  Insert DELAYED机会处里完了所有待处里的插入操作,正在等候新的请求。大每段清况 对应迅速的操作,假使 有另有一两个 多线程 保持同另有一两个 清况 好几秒钟,这样机会是有问题处于了,不能 检查一下。

  还有你是什么的清况 没在上面中列出来,不过它们大每段好多好多 我在查看服务器是不是有处于错误是才用得着。