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 (重新開始記錄) |
日志分析工具
- mysqlsla -lt slow /usr/local/db/log/slowquery.log > /usr/1.log