首页 游戏攻略 正文

mysql进程kill不掉?别慌!一招教你强制终止!

哥们姐们,今天跟大家聊个我之前遇到的糟心事儿,说起来都一肚子气。话说有那么一回,线上的一个数据库不知道是抽了什么风,跑着跑着就卡住了。当时系统报警滴滴响,我赶紧连上去看,一查SHOW PROCESSLIST;,果然!一大堆进程都卡在“Sending data”或者“Updating”那儿,好几个都几十秒上百秒了,眼看着就要把整个服务拖垮。

本站为89游戏官网游戏攻略分站,89游戏每日更新热门游戏,下载请前往主站地址:www.gm89.icu

当时心头一紧,这可是生产环境,耽误不得。我二话不说,找到那几个卡得最厉害的进程ID,直接就是KILL ID;。敲下去,回车,等了半天,刷新一下,这些进程还在那儿,纹丝不动!我又试了几次,结果都一样,完全没用。

这下我有点慌了,想这不对劲。平时KILL一下也就完事儿了,怎么今天这么硬气?我赶紧想着,是不是进程太多了,一下子清不掉?于是我赶紧去服务器上,敲了个ps aux grep mysql,想看看究竟是哪个进程在捣乱,或者是不是有僵尸进程。结果一看,好家伙,一大堆mysql相关的进程在那儿挂着,其中有几个PIDS一看就状态不对劲。

我当时就想着,是不是得来点硬的了?于是我找到那个看起来是主进程的PID,直接kill -9 PID;,想着这下总该死了?结果,敲完回车,再次ps aux grep mysql,你猜怎么着?那个被我kill -9的进程,它还在!或者有时候干脆变成一个defunct状态,占着茅坑不拉屎。当时我脑子里就一句话:我勒个去,这是遇到钉子户了!

那会儿真的是急得头上冒汗,眼看着业务告警越来越频繁,再不解决就得出大问题了。我赶紧在脑子里把能想到的方法都过了一遍,什么重启MySQL服务,什么检查日志,但这些都太慢了,而且重启服务搞不好会把正在处理的数据给弄丢,风险太大。

就在我一筹莫展的时候,突然想起以前一个老同事提过的一招狠的。他说有些时候,进程卡死,光kill -9具体的PID是搞不定的,因为可能它下面还拖着一堆子进程,或者它本身就是被某个内核操作卡住了,信号都送不进去。这种时候,就得找到它更上层的、或者说它整个服务层面的进程,直接下狠手。我的灵光一闪,心想,干脆直接把所有跟mysqld相关的都给我清了!

我立马打开终端,深吸一口气,然后敲下了这行命令:

  • sudo pkill -9 mysqld

敲完这句,我心里都在打鼓,因为这玩意儿可比kill -9 PID猛多了,它是直接把所有名字叫mysqld的进程都给强制干掉!这一下去,整个MySQL服务就彻底歇菜了。当时我就想,要么搞定,要么就彻底“死机”了,反正不能让它这么半死不活地拖着。

命令敲下去之后,我屏住呼吸,赶紧又敲了个ps aux grep mysql。回车一看,果然!刚才还在那儿挂着的一大堆mysqld进程,全都消失得无影无踪,干干净净!那一刻,我真想给自己鼓掌,一种劫后余生的感觉。

这只是第一步,把那些捣乱的全清光了。但MySQL服务本身还没起来。于是我赶紧又执行了重启服务的命令:

  • sudo systemctl start mysql (或者根据你的系统,可能是sudo service mysql start)

等了一小会儿,再次ps aux grep mysql,全新的mysqld进程果然已经老老实实地在那儿跑着了。接着又赶紧去系统里看,报警也停了,服务恢复正常。那一晚,虽然折腾得够呛,但心里踏实多了。所以说,兄弟们,以后再遇到这种MySQL进程死活kill不掉的情况,别慌,试试我这招pkill -9 mysqld,通常都能强制解决问题。不过这招是真狠,轻易别用,只留给那些实在没办法的紧急时刻。