Hi,大家好!我是白日夢。
今天我要跟你分享的話題是:“聊聊什麼是慢查、如何監控?如何排查?”
一、 推薦閱讀方式
首發地址:https://mp.weixin.qq.com/s/tXTLMCiVpEnnmhUclYR19Q
使用推薦閱讀,有更好的閱讀體驗
二、什麼是慢查?
慢查,顧名思義就是很慢的查詢。SQL的執行總是有一個執行時間的,通過long_query_time
引數告訴MySQL,當SQL的執行時間超過該引數的指定值後就將這條SQL記錄在慢查日誌中。
預設的long_query_time
預設值為10s
三、怎麼調整界定慢查的時間?
設定全域性慢查時間為0.2秒。
注意:long_query_time屬於dynamic型別的引數。意思是像上面這樣在會話A中通過命令列的方式設定全域性 long_query_time為0.2秒後,再開啟一個新的會話B檢視該變數會發現 long_query_time=0.2
但是在會話A中檢視session級別的long_query_time依然為預設的10s
四、慢查日誌像binlog那樣是真實的日誌檔案嗎?
在MySQL5.1之前確實慢查日誌確實是以檔案的形式存在。但是MySQL5.1之後MySQL允許我們可以將慢查日誌放入一個資料表中,便於我們檢視分析。
現在公司使用的一般都是5.6~5.7版本。當然即使5.1版本之後支援了將資料放入Table中,預設配置依然是File。
當然你也可以通過下面的命令將慢查輸出型別改成Table
五、慢查有什麼危害?
研發同學都知道:對於Linux作業系統來說,一個程式能開啟的Socket檔案控制程式碼是上限的。即使我們可以動態的調整它的大小,但是也做不到無限大。
通過命令: 檢視程式被限制的使用各種資源的量
Copyulimit -a
core file size: 程式崩潰是轉儲檔案大小限制
man loaded memort 最大鎖定記憶體大小
open file 能開啟的檔案控制程式碼數
大量的慢查佔據MySQL連線(Linux作業系統會為每一條連線建立socket檔案),慢查累積到一定程度還會導致正常的SQL得不到連線執行從而變成慢查SQL,最終有可能導致MySQL的連線全部被耗光而夯死。這就是生產級別的事故了。
六、如何監控慢查?
檢視曾經執行完成的慢查
如果你需要編寫一個監控程式探測MySQL的慢查詢。那完全可以探測分析MySQL的slow.log
如果你還不知道slow.log在哪裡,可以像下面這樣定位到它。slow.log中記錄的就是曾經執行過的慢查資訊。
這是你可以嘗試使用select sleep(2);
模擬一條慢查SQL
然後去慢查sql中檢視具體的慢查詳情。
檢視正在進行的慢查SQL
我在A Session中發起SQL,select sleep(60);
然後在B Session中通過下圖的方式可以看到當前正在進行的慢查情況。大家在看的時候注意:Command的型別為Query
MySQL也為使用者提供了一些原生的慢查工具。比如:檢視執行時間最長的10條SQL
mysqldumpslow -s a1 -n 10 mysql.slow_log
瞭解即可
七、線上出慢查瞭如何處理?
首先你得知道通常情況下每個公司都有自己監控系統,或者是監控指令碼,具體的監控邏輯就是上節講述的思路。故一旦出現報警,DBA同學會在第一時間接到訊息。
DBA同學一般都會去聯絡業務同學,由業務同學去處理這個慢查。(相信已經工作的同學深有這個體會)
關注我看更多內容,每早推送,可以在地鐵、班車上、上班前閱讀! ......
檢視MySQL專題110篇文章大綱:https://mp.weixin.qq.com/s/HTw-Z-SyprYA8bCBZ4NpGQ
參考:https://dev.mysql.com/doc/refman/5.7/en/slow-query-log.html
八、關注我
為大家帶來MySQL面試專題!本文是第二篇、全文110篇!
以問答的方式,由淺入深的幫你應對各類MySQL面試題的狂轟濫炸!當然也不乏會分享一些高階讀寫分離資料庫中介軟體原理及落地的技術實現,為你揭開資料庫中介軟體神祕的面紗!
面試官都關注了!你還在猶豫什麼呢?