為什么80%的碼農都做不了架構師?>>> ??
MySQL日志記錄了MySQL數據庫日常操作和錯誤信息,MySQL總共有四種類型的日志,通過分析這些日志可以查詢到MySQL的運行情況、用戶操作、錯誤信息等,可以為MySQL的管理和優化提供必要信息。
?1、日志類型
? ? MySQL總共有四種類型的日志,如下:
- 錯誤日志:記錄Mysql服務的啟動、運行或停止MySQL服務時出現的問題,默認開啟。
- 查詢日志:記錄建立連接的客戶端連接和執行的語句。
- 二進制日志:記錄所有更改數據的語句,可以用于數據復制。
- 慢查詢日志:記錄所有執行時間超過設定時間(long_query_time)的查詢
????四種日志,僅錯誤日志默認開啟,其他需要手動配置開啟,啟動日志會降低服務器性能、而且會占用大量磁盤空間。
什么是刷新日志?
刷新日志可以強制MySQL關閉舊的日志文件,重新打開新的日志文件 即切換到新的日志文件,例如:錯誤日志當手工刪除后無法重新建立新的日志文件,則需要進行刷新日志操作才會重新創建日志文件。
如何操作?
可在服務器端執行:
mysqladmin -u root -p flush-logs
或在客戶端執行
flush logs
?
2、二進制日志
? ? 1、原理介紹
? ? 二進制日志主要記錄MySQL數據庫的變化,主要運用場景為 MySQL replication ,例如主從復制,主主復制,環形復制(不常用),從機通過IO線程讀取主機的二進制日志 生成自己的中繼日志,然后自己的SQL線程通過中繼日志進行復制數據功能,簡單點說就是把SQL再執行一遍,主要原理詳細如下圖:
? ? 2、開啟二進制日志
? ? 在my.cnf文件 [MySQLd]組下進行如下配置
log-bin[=path/filename]
? ? 例如:
????log-bin
????log-bin=mysql-bin
????log-bin=/home/zhpt/logs/mysql-bin
? ? 以上三種方式都可開啟二進制日志
其他配置:
expire_logs_days=10 #自動清除過期日志的時間
max_binlog_size=100M #設置單個二進制日志文件的大小,默認為1G,不能設置超過1G或小于4096B
? ? 3、查看二進制日志及其設置
show variables like 'log_%'
????? ? 結果如下:
? ?也可使用
show binary logs
查看二進制日志文件的個數及文件名,如下圖:
3、錯誤日志
? ? MySQL錯誤日志記錄了MySQL服務在運行中發生的任何嚴重錯誤信息,此錯誤類型默認開啟。
? ? 1、查看日志文件配置
show variables like 'log_error%'
? ? 結果如下所示:
????2、修改日志文件路徑
????????在my.cnf文件 [MySQLd]組下進行如下配置
log-error=/home/zhpt/logs/MySQL_Ruoli.err
? ? ?錯誤日志直接以文件的形式存儲于磁盤上,可隨時手工刪除,刪除后需要執行刷新日志才可生成新的錯誤日志。
4、通用查詢日志
????在my.cnf文件 [MySQLd]組下進行如下配置 開啟 通用查詢日志
log[=path/filename]
?通用查詢日志記錄了用戶的所有操作,可使用編輯工具直接查看,開啟通用查詢日志后,會降低數據庫性能增大磁盤占用,不建議在生產環境中使用。
5、慢查詢日志
? ? 慢查詢日志是MySQL提供的用來記錄執行時間過長的查詢語句,為數據庫性能優化提供重要依據。
? ? 1、查看慢查詢日志開啟狀態及存儲位置:
mysql> show variables like 'slow_query%';
+---------------------------+----------------------------------+
| Variable_name | Value |
+---------------------------+----------------------------------+
| slow_query_log | ON |
| slow_query_log_file | /mysql/data/localhost-slow.log |
+---------------------------+----------------------------------+
? ? 如上所示,此臺服務器已經開啟了慢查詢日志功能,慢查詢日志文件路徑也在其data目錄下。
? ? 2、查看慢查詢日志超時時間
mysql> show variables like 'long_query_time';
+-----------------+-----------+
| Variable_name | Value |
+-----------------+-----------+
| long_query_time | 5.000000 |
+-----------------+-----------+
? ?3、開啟慢查詢日志
前面提到過,慢查詢日志并不是默認開啟的,開啟慢查詢可以通過如下方式:
- 通過配置文件設置,此種修改方式為永久生效。
? ? ? ? ?在my.cnf文件 [MySQLd]組下進行如下配置,開啟慢查詢日志,如下:
slow_query_log = ON
slow_query_log_file =/usr/local/mysql/data/slow.log
long_query_time=2 #設置超時時間為2秒,默認為10秒
- 通過設置全局變量設置,此種方式重啟后失效。
? ? ? ? ? 將 slow_query_log 全局變量設置為“ON”狀態
mysql> set global slow_query_log='ON';
? ? ? ? ??設置慢查詢日志存放的位置
mysql> set global slow_query_log_file='/usr/local/mysql/data/slow.log';
? ? ? ? ?查詢超過2秒就記錄
mysql> set global long_query_time=2;
? ? ? ? ?開啟記錄沒有使用索引的查詢語句
mysql> set global log-queries-not-using-indexes?= on
? ? ?4、慢查詢日志分析
? ? ? ??
? ? ? ? 上圖是一條慢查詢日志的內容,我們進行分析時主要看的就是執行信息,包括執行時間(Query_time)、發送行數(Rows_sent)、掃描行數(Rows_examined),通過降低掃描行數可以明顯降低執行時間。
? ? ? ? ? ? 如果掃描行數明顯大于發送行數說明此條SQL的索引命中率很低,可以優先進行優化。
? ? ? ? ? ? 關于降低降低掃描行數來提升查詢效率最直接的例子就是MySQL的分頁查詢。
? ? ? ? ? ?具體可以另一篇文章:最快速的辦法解決MySQL數據量增大之后翻頁慢問題
? ? ? ??
?