前言
本篇主要總結一下MySQL數據庫的幾種日志,用於日常維護過程中問題解決和性能優化等,稍顯基礎,日常積累之用。
文章的部分內容會將MySQL數據庫和SQL Server數據庫部分內容做一個對比,非抨擊孰優孰劣,只敘述技術,權做學習之用。
閑言少敘,直接進入本篇的正題。
技術准備
宿主於Ubuntu14.04.2平台下,基於MYSQL5.5.46版本。
日志文件記錄了MySQL數據庫的各種類型的活動,作為日常定位問題的最常用的一種分析手段,Mysql數據庫中常用的日志文件分為以下幾類:錯誤日志、二進制日志、慢查詢日志,查詢日志。
一、錯誤日志
我記得在寫SQL Server的時候,我寫過一篇關於SQL Server啟動過程中的一些錯誤日志記錄,可以點擊此進行查看。同樣,在MySQL數據庫運行過程中,也有自己的數據庫錯誤日志。
該日志記錄了MySQL運行過程中啟動、運行、關閉過程中的一些詳細記錄,在一旦出現問題的時候,可以先查看該日志,該日志不但記錄了出錯信息,同樣也記錄了一些警告,當然也有一些運行信息。
可以通過如下命令,來查看錯誤日志的文件路徑:
show variables like 'log_error';
通過上面的命令定位到錯誤日志的文件,如果出問題,可以在相應的Server上來查看該日志明細,查看方式如下:
more /var/log/mysql/error.log
當然,上述命令在linux平台下,一般用於修改文件,但是也可以作為查看文件來用。
並且,在合適的條件下,MySQL會自動歸檔這些錯誤日志,用於后期問題的查找。
在上面的日志文件中可以看到,有一條提示是IP地址的域名解析問題,所以可以通過該文件來記錄登錄信息等。
二、慢查詢日志
所謂的慢查詢日志就是用來記錄在MySQL中運行速度緩慢的執行語句,所以說這個文件很方便整體的性能調優,我們知道在SQL Server中只能通過相應的DMV來查找。
當然,什么樣的語句才能稱為慢的語句呢,所以這里就需要有一個閥值來定義,一旦運行時間超過了這個值就會被記錄到這個慢查詢日志中。
我們來看一下該閥值的設置方式,可以通過long_query_time來設置,默認值為10,意思是運行10S以上的語句。
默認情況下,Mysql數據庫並不啟動慢查詢日志,需要我們手動來設置這個參數,當然,如果不是調優需要的話,一般不建議啟動該參數,因為存在一定的性能影響。
來看,設置方式
show variables like '%long%';
show variables like 'log_slow_queries'
我們來開啟這個慢查詢語句。
SET global slow_query_log=1
SHOW variables like '%query_log%';
當然,我們可以將默認的時間閥值調小,方法如下
SET global long_query_time=0.1;
驗證的時候,這里有點小技巧的,需要新開一個窗口進行查詢,當前窗口的查找是沒有生效的,不知道算不算Mysql的一個小Bug.我們新開一個窗口驗證下:
是不是很爽?我們來來個語句驗證下,看看效果咋樣。
為了方便演示,我將這個閥值設置成0.001S,挺小的一個值,我們來找個語句試驗一下:
我們來執行如下腳本:
select * from tables;
我們來看一下慢查詢日志是否已經記錄下來:
sudo more /var/lib/mysql/wu-virtual-Ubuntu01-slow.log
這里的日志查看,需要提權操作。
大家可以看到,當前已經將我們查詢的語句輸出到日志當中去,當然,其它的一些語句也被記錄下來。
並且,詳細的記錄執行時間,執行用戶,運行時間,lock時間,返回行等基礎信息。
當然,這里有很多同學看到這里就來需求了,一般我們運行的時候,對Server進行監控的時候,難道讓我一台台機器上去看文件,我想搞一個監控系統,需要監控每台的Slow 日志文件,並且解析起來很不爽。
為了解決這個問題,MySQL貼心的為我們提供了一張系統的表進行查看,這就方便我們操作了,比如我想看看最慢的前10條語句......
這里需要提示一下,這個方法只建立在MySQL 5..1之上,過程如下:
首先,我們來看一下默認的輸出方式,腳本如下:
show variables like 'log_output';
可以看到,這里默認的輸出方式是FILE,文件,我們將這里改成Table。
set global log_output='TABLE';
select sleep(10);
select * from mysql.slow_log;
是不是很貼心....你可以通過T-SQL語句進行各種查了。
在我們進行數據庫優化的時候,很多的時候是通過創建合適的索引,進行優化,所以說,如果我們知道一個數據庫中那些語句沒有應用到索引,或者說是全表掃描的話,是很方便易於我們進行優化的。
所以,在Mysql的慢日志當中,為我們有貼心的添加了一個參數,用來記錄沒有使用索引的語句;
show variables like 'log_queries_not_using_indexes';
默認是關閉的,我們可以將該參數打開,進行詳細的記錄;
SET global log_queries_not_using_indexes=1
通過此參數的設置,就可以跟蹤MySQL中沒有使用索引並且運行時間比較長的語句了,下面的優化大家就懂了。
篇幅稍長了,這里就不跟大家演示了。
結語
此篇文章先到此吧,關於MYSQL性能調優的內容涉及面很廣,后續文章中依次展開分析。
如果您看了本篇博客,覺得對您有所收獲,請不要吝嗇您的“推薦”。