Freebsd下如何查案和分析日志,對我來說還是一個新課題,之前沒有處理過,甚至不知道日志存放在什麼位置,如何記錄。
網絡上有一些不錯的資料,mysql手冊也可以用來參考,但沒有實踐過還會遇到一些莫名的問題。
首先來看一下mysql日志的種類,一般來說,日志有五種,分別為:
錯誤日志:-log-err (記錄啟動,運行,停止mysql時出現的信息)
查詢日志:-log (記錄建立的客戶端連接和執行的語句)
慢查詢日志: -log-slow-queries (記錄所有執行超過long_query_time秒的所有查詢)
更新日志: -log-update (記錄更改數據的語句,不贊成使用該日志)
二進制日志:-log-bin (記錄所有更改數據的語句,還用於復制,恢復數據庫用)
我們要分析mysql運行的情況,主要的是分析慢查詢日志,簡單的幾條命令,查詢當前日志記錄的狀況:
mysql>show variables like 'log_%';(是否啟用了日志)
mysql> show master status;(怎樣知道當前的日志)
mysql> show master logs;(顯示二進制日志的數目)
要啟用慢查詢日志,需要在my.cnf中設置啟用:
long_query_time =1 執行超過1秒的sql會被log下來
log-slow-queries= /usr/local/db/log/slowquery.log將查詢返回較慢的語句進行記錄
log-queries-not-using-indexes = /usr/local/db/log/nouseindex.log 就是字面意思,log下來沒有使用索引的query
log=/usr/local/db/log/mysql.log 對所有執行語句進行記錄
二進制日志文件比較大,可以再my.cnf中設置二進制日志文件的過期時間,這樣mysql就會自動刪除到期的日志文件,節省磁盤空間:
expire_logs_days=5
重新啟動mysql,就可以看到mysql開始記錄log,slow-log了,不知道為什麼我設置的log-queries-not-using-indexes的日志文件沒有記錄;
可以通過shell直接輸入mysqldumpslow /usr/local/db/log/slowquery.log 可以獲得日志的摘要信息,包括:
出現次數(Count),
執行最長時間(Time),
累計總耗費時間(Time),
等待鎖的時間(Lock),
發送給客戶端的行總數(Rows),
掃描的行總數(Rows),
用戶以及sql語句本身(抽象了一下格式, 比如limit 1, 20 用limit N,N 表示).
剩下的工作,就交給程序員了,進一步優化數據庫查詢語句,降低mysql負載。
日志更新
mysql的日志會一直記錄,如果想要斷開,重新記錄需要做以下幾步:
1、mv log /backup/log (如果需要備份的話)
2、rm log (刪除log文件,此時mysql會停止記錄日志)
3、mysqladmin -uroot -ppassword flush-logs (重新開始記錄)
本文出自 “三足烏工作室” 博客