1. 程式人生 > >一個SQL導致整個資料庫很卡的問題及排查過程

一個SQL導致整個資料庫很卡的問題及排查過程

問題:

我執行了一個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;

之後不出結果卡那不動

然後我Ctrl + C,不成功,還是卡在那

我就新開了個視窗,將其kill掉,執行完成,顯示成功。

再次檢視一下資料庫狀態:

發現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檢視狀態

也沒有發現表鎖以及死鎖。

之後想會不會是觸發器之類的。

然後查看了一下觸發器資訊

Show triggers from koala;

結果也卡那不動了,而且Ctrl + C也關閉不了。

這時檢視資料庫狀態

Show processlist;

然後將其kill掉,在檢視狀態

發現又是killed

檢視伺服器io,cpu,磁碟,記憶體狀態,也沒有什麼異常

Iotop

perf top -p `pidof mysqld`

最後實在沒辦法,查了一下processlist裡面狀態

Creating sort index:執行緒正在處理一個SELECT,使用內部臨時表解決

於是想是不是資料庫記憶體大小的問題

比如innodb_buffer_pool_size,table cache等

然後查看了一下buffer_pool狀態

Show variables like ‘%buffer_pool%’

發現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的大小

最後檢視資料庫狀態,發現已經正常了。

總結:

平時除了檢視mysql基本的狀態,還要對記憶體等進行合理的分配,防止過小而出現問題。

隨著資料量的不斷增加,也需要對一些引數進行優化。