mysql truncate 引起的 system lock,導致其他進程等待


 

1、現狀:上線新項目,導致api服務延遲,cpu正常,內存正常,連接數正常,sql性能正常,sql進程正常(初步分析)

                 最后再次分析sql進程才發現 由於該 truncate table name ; 語句為實時執行,導致其余進程出現時間延長。影響api調用,及整個庫的使用

2、處理辦法:

     a、查詢新項目消耗cpu,內存:top    (正常)

          

     b、同理查詢數據庫消耗cpu,內存(正常)

     c、查看數據庫進程:隨時刷新可知,在system lock 情況下會等待很多進程 :SELECT * FROM information_schema.PROCESSLIST WHERE state != '';

           網上查詢system lock  含義:

          這種狀態可能是很多種原因 :一個線程想請求或者正在等一個表的內部或者外部的system lock;

                                                         也可能是InnoDB在執行lock tables的時候,等表級鎖;

                                                         也可能是請求內部鎖,比如訪問相同MyISM表沒有用多個mysqld服務;

         並且該語句為truncate table,因此認為為表鎖。

          

 

 3、分析:

       由於經驗,刪除數據truncate 肯定是最快的,並且會回收空間,這是最好的選擇。

       查詢system lock 網上均說出現的可能為表級鎖:https://www.cnblogs.com/sunss/p/6404961.html

       其實不然,經過刷新進程:現象為system lock時,進程同時出現大量等待。當system lock出現頻率比較高時等待多,延遲也就高,即使truncate table 很快。

       因此system lock為系統鎖,整個庫的進程都得等待。這是是網上沒人提及的。

4、truncate table 為什么會出現system lock呢:

      truncate為ddl語句,會改變元數據,會lock table meta data,空間直接釋放,數據丟失不易找回:該現狀為:由鎖表升級為鎖庫。影響極其嚴重。

      因此,truncate雖然快 好用,但是在系統層面還是得慎用,特別是使用頻次較高的時候。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM