嗨,老铁,欢迎来到我的博客!

如果觉得我的内容还不错的话,可以关注下我在 segmentfault.com 上的直播。我主要从事 PHP 和 Java 方面的开发,《深入 PHP 内核》作者之一。

[视频直播] PHP 进阶之路 - 亿级 pv 网站架构的技术细节与套路 直播中我将毫无保留的分享我这六年的全部工作经验和踩坑的故事,以及会穿插着一些面试中的 考点难点加分点

周梦康 发表于 2015-05-25 2188 次浏览 标签 : LinuxMysqlawkdba

免费领取阿里云优惠券 我的直播 - 《PHP 进阶之路》

事故重现,并且加入一些后期想到的想法作为演义. 今天 mysql 服务器负载过高, 主库上主要是写的操作,首先看有没有锁表的,发现没有.

mysql -uroot -e "show processlist"|grep  -i 'locked'|wc -l

再看delete,update,insert操作的数量.

mysql -uroot -e "show processlist"|grep  -i 'delete'|wc -l
mysql -uroot -e "show processlist"|grep  -i 'update'|wc -l
mysql -uroot -e "show processlist"|grep  -i 'insert'|wc -l

这三个的总数合起来也没超过200, 就这样, mysql 占用的 cpu% 已经到了800%了.

再看下耗时排行(其实应该查看锁表就应该直接看耗时了)

mysql -uroot -e "show processlist;" |sort -nr -k6;

发现有很多delete已经快1个小时了还没执行完毕,看来主要是卡在了delete的操作上.

所以我先把线上服务器中执行相同语句的操作都转移写入到文本,不再请求数据,防止相同的操作进来继续堵塞. 然后想 kill 掉那些连接, 于是我想到是不是可以这样来操作:

mysql -uroot -e "show processlist;" |grep -i 'delete'|awk '{print $1}'|xargs mysql -uroot -e 'kill (xxx)'

但是awk得到的$1怎么传给后面的做参数呢,因为末尾还有一个单引号.然后又想到这样, 发现也还是不行, 语法有误.

mysql -uroot -e "show processlist;" |grep -i 'delete'|awk '{print "mysql -uroot -e  \'kill "$1"\' }'|sh

正确的做法:

#最后我们运维明哥,给我的语句是:
mysql -uroot -e "show processlist;" |grep -i 'delete'|awk '{print "mysql -uroot -e " "\047" "kill " $1"\047;" }'|sh
#志华老师提醒可以像 C 语言一样用`printf`,我写了下,还没来的及时试验
mysql -uroot -e "show processlist;" |grep -i 'delete'|awk '{printf "mysql -uroot -e \"kill %d;\"",$1}'|sh

嗨,老铁,欢迎来到我的博客!

如果觉得我的内容还不错的话,可以关注下我在 segmentfault.com 上的直播。我主要从事 PHP 和 Java 方面的开发,《深入 PHP 内核》作者之一。

[视频直播] PHP 进阶之路 - 亿级 pv 网站架构的技术细节与套路 直播中我将毫无保留的分享我这六年的全部工作经验和踩坑的故事,以及会穿插着一些面试中的 考点难点加分点

评论列表