一个SQL导致整个数据库很卡的问题及排查过程

时间:2024-04-07 09:40:14

问题:

我执行了一个sql,五六分钟没有执行成功,然后我就ctrl +c,没成功,然后我就kill,之后显示成功,但是处于killed状态,事务还在。这是一个从库,那之后从库应用的sql,也就是一个很简单的插入sql,跟我执行的sql没有任何关联关系,也执行不了了,主从也就发生阻塞了。我查看了系统io,cpu,都没有什么问题。现在,我想use information_schema都不行了。这是为什么,是什么原因一个SQL会导致mysql卡的不行,其他都执行不了。

 

排错过程:

执行的sql

SELECTorderId,serviceSubItemId,itemCount,isApproval,priceType,serviceType,materialsId,0price,1 isChoice FROM

(SELECT orderId,COUNT(serviceSubItemId) size,serviceSubItemId,itemCount,isApproval,

CASE WHEN priceType = '1' THEN '2' ELSE '1' END ASpriceType,serviceType,materialsId FROM `carrepairitem`

WHERE LENGTH(orderId) <10 AND isChoice = 1 GROUP BYorderId,serviceSubItemId)a WHERE a.size = 1

 

查看数据库状态:

Show processlist;

一个SQL导致整个数据库很卡的问题及排查过程

 

之后不出结果卡那不动

然后我Ctrl + C,不成功,还是卡在那

我就新开了个窗口,将其kill掉,执行完成,显示成功。

 

再次查看一下数据库状态:

一个SQL导致整个数据库很卡的问题及排查过程

 

发现command显示killed,当时也没有多想,之后发现主从同步的sql被阻塞了,但是这两个表没有任何的关联关系,而且这条应用的sql只是一条简单地insert语句,自己的sql怎么会阻塞呢。

 

查了一下processlist里面的killed:

Killed:有人发送一个KILL线程的语句,它应该中止在下一次检查杀死标志

感觉没什么问题,就算是在回滚数据,也不会影响其他表吧。

 

查看锁及锁等待

然后通过select * from information_schema.innodb_locks以及

select * from information_schema.innodb_lock_waits发现没有行锁及锁等待。

 

然后show processlist以及show engine innodb status \G查看状态

一个SQL导致整个数据库很卡的问题及排查过程

一个SQL导致整个数据库很卡的问题及排查过程

一个SQL导致整个数据库很卡的问题及排查过程

一个SQL导致整个数据库很卡的问题及排查过程

也没有发现表锁以及死锁。

之后想会不会是触发器之类的。

 

然后查看了一下触发器信息

Show triggers from koala;

一个SQL导致整个数据库很卡的问题及排查过程

结果也卡那不动了,而且Ctrl + C也关闭不了。

 

这时查看数据库状态

Show processlist;

一个SQL导致整个数据库很卡的问题及排查过程

 

然后将其kill掉,在查看状态

一个SQL导致整个数据库很卡的问题及排查过程

发现又是killed

 

查看服务器io,cpu,磁盘,内存状态,也没有什么异常

Iotop

一个SQL导致整个数据库很卡的问题及排查过程

 

perf top -p `pidof mysqld`

一个SQL导致整个数据库很卡的问题及排查过程

 

最后实在没办法,查了一下processlist里面状态

Creating sort index:线程正在处理一个SELECT,使用内部临时表解决

于是想是不是数据库内存大小的问题

比如innodb_buffer_pool_size,table cache等

 

然后查看了一下buffer_pool状态

Show variables like ‘%buffer_pool%’

一个SQL导致整个数据库很卡的问题及排查过程

发现innodb_buffer_pool_size只有5M,感觉原因就是因为buffer pool过小,

 

增加buffer_pool的大小到20G

mysql> select 20*1024*1024*1024;

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

| 20*1024*1024*1024 |

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

|       21474836480 |

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

1 row in set (0.00 sec)

mysql> set global innodb_buffer_pool_size=21474836480;

 

再查看一下buffer pool的大小

一个SQL导致整个数据库很卡的问题及排查过程

 

最后查看数据库状态,发现已经正常了。

 

总结:

平时除了查看mysql基本的状态,还要对内存等进行合理的分配,防止过小而出现问题。

随着数据量的不断增加,也需要对一些参数进行优化。