一般成熟的軟件,都會有自己的日志文件。通過這些日志來快速定位問題。在mysql中,日志分為以下幾類:
-
慢查詢日志,當sql的執行時間超過設定值時,便會記錄
-
錯誤日志,mysql啟動、停止或運行時發生錯誤時,會記錄到錯誤日志里
-
二進制日志,該日志記錄那些改變數據庫數據時的sql語句,通過他,我們可以來恢復Mysql數據
-
查詢日志,當開啟時,會記錄查詢SQL。
今天我們來講講慢查詢、錯誤日志以及查詢日志,二進制日志文件,將放以后用新的一篇文章來詳細講解。
錯誤日志
錯誤日志寫記錄Mysql啟動、停止時出現的問題,另外也記錄Mysql在運行中發生的重大問題。可以使用show variables like ‘log_err%’;查看錯誤日志文件的位置。
mysql>?show?variables?like?'log_err%'; +---------------------+-------------------------------+ |?Variable_name???????|?Value?????????????????????????| +---------------------+-------------------------------+ |?log_error???????????|?./iZbp171edtq2kx5iy0xufeZ.err?| |?log_error_verbosity?|?3?????????????????????????????| +---------------------+-------------------------------+ 2?rows?in?set?(0.01?sec)
錯誤日志,默認使用主機名作為文件名,以err作為后綴名,存放在mysql目錄下的/var目錄中。如果我們想修改的話,可以修改配置文件log_error項??梢允褂孟鄬β窂交蚪^對路徑,使用相對路徑的話只會修改錯誤日志文件名,而使用絕對路徑則可以修改錯誤日志存放的位置。
錯誤日志的查看也非常簡單,直接使用cat或vim來查看即可。
通用查詢日志
通用查詢日志會記錄用戶所有的操作,所以一般占用空間較大,日常運維中一般都不會開啟,并且默認情況也是關閉該日志的。如想開啟的話,則可以在配置文件中加入log選項。
慢查詢日志
慢查詢是一個非常好的排查SQL問題工具,很多情況下,都是我們的sql導致系統運行不暢。筆者以前犯過這個錯誤,使用的一條非常復雜的查詢語句,系統剛上不舊就502了。前段時間,發現公司的老項目也是出現了相應的問題,該項目使用的dedecms,當數據量達到一定程度,就會出現大量的慢查詢,然后整個系統的cpu就跑滿了。所以,我們要經常查看慢查詢日志,找過sql的問題所在。
慢查詢配置項
-
slow-query-log={0|off|1|on} ?是否開啟慢查詢日志功能
-
slow-query-time=10 設定的閥值,單位為秒,支持浮點數。當sql的執行時間超過該值,就會記錄在慢查詢日志中。如果設置為0,則會記錄所有查詢
-
slow_query_log_file=/mydata/data/hostname-slow.log 慢查詢日志存放的位置及文件名
-
log_queries_not_using_indexes=OFF 該項表示沒有使用索引的查詢也會記錄到慢查詢日志中去。
案例
現在,我將自己的mysql的慢查詢日志打開,并且將時間設置為0,記錄所有的SQL。然后來帶大伙看看慢查詢日志是怎樣的。
Tcp?port:?3306??Unix?socket:?/tmp/mysql.sock Time?????????????????Id?Command????Argument #?Time:?2020-05-31T12:00:01.895700Z #?User@Host:?blog[blog]?@?localhost?[]??Id:?????3 #?Query_time:?0.000170??Lock_time:?0.000000?Rows_sent:?0??Rows_examined:?0 use?blog; SET?timestamp=1590926401; SET?NAMES?utf8mb4; #?Time:?2020-05-31T12:00:01.902684Z #?User@Host:?blog[blog]?@?localhost?[]??Id:?????3 #?Query_time:?0.006914??Lock_time:?0.006529?Rows_sent:?0??Rows_examined:?120 SET?timestamp=1590926401; SELECT?*?FROM?knowledge? ????????????WHERE?is_delete=0?AND?star?<p>我們主要看Query_time行</p>
-
Query_time:查詢時間
-
Lock_time:鎖表時間
-
Rows_sent:獲取的數據行
-
Rows_examined:掃描的數據行