現象:網站訪問越來越慢,最後無法訪問了,經過檢查發現磁盤滿了。仔細查詢下來確認是由於mysql的binlog太多太大占用了空間。
分析過程及解決方案:通常出現這種問題都應該登錄服務器檢查磁盤、內存和進程使用的情況,通過top、df –h和free –m來檢查,發現磁盤空間滿了。再進一步通過du –sh對可以的目錄進行檢查,發現是mysql的binlog占用空間過大。清理binlog的方法如下:
1) 設置日志保留時長expire_logs_days自動刪除
查看當前日志保存天數:
show variables like '%expire_logs_days%';
這個默認是0,也就是logs不過期,可通過設置全局的參數,使他臨時生效:
set global expire_logs_days=7;
設置了只保留7天BINLOG, 下次重啟mysql這個參數默認會失敗,所以需在my.cnf中設置
expire_logs_days = 7
2) 手動刪除BINLOG (purge binary logs)
用於刪除列於在指定的日志或日期之前的日志索引中的所有二進制日志。這些日志也會從記錄在日志索引文件
代碼如下 復制代碼PURGE {MASTER | BINARY} LOGS TO 'log_name'
PURGE {MASTER | BINARY} LOGS BEFORE 'date'
例如:
代碼如下 復制代碼PURGE MASTER LOGS TO 'mysql-bin.010';
PURGE MASTER LOGS BEFORE '2008-06-22 13:00:00';
PURGE MASTER LOGS BEFORE DATE_SUB( NOW( ), INTERVAL 3 DAY);
補充
清理日志步驟
1.查找日志檔案
代碼如下 復制代碼 mysql> show binary logs;2.刪除bin-log(刪除ablelee.000003之前的而沒有包含ablelee.000003)
代碼如下 復制代碼mysql> purge binary logs to 'ablelee.000003';
Query OK, 0 rows affected (0.16 sec)
3. 查詢結果(現在只有一條記錄了.)
代碼如下 復制代碼
(刪除的其它格式運用!)
用於刪除列於在指定的日志或日期之前的日志索引中的所有二進制日志。這些日志也會從記錄在日志索引文件中的清單中被刪除,這樣被給定的日志成為第一個。
例如:
清除3天前的 binlog
代碼如下 復制代碼 PURGE MASTER LOGS BEFORE DATE_SUB( NOW( ), INTERVAL 3 DAY);BEFORE變量的date自變量可以為'YYYY-MM-DD hh:mm:ss'格式。MASTER和BINARY是同義詞。
如果您有一個活性的從屬服務器,該服務器當前正在讀取您正在試圖刪除的日志之一,則本語句不會起作用,而是會失敗,並伴隨一個錯誤。不過,如果從屬服務器是休止的,並且您碰巧清理了其想要讀取的日志之一,則從屬服務器啟動後不能復制。當從屬服務器正在復制時,本語句可以安全運行。您不需要停止它們。
要清理日志,需按照以下步驟:
1. 在每個從屬服務器上,使用SHOW SLAVE STATUS來檢查它正在讀取哪個日志。
2. 使用SHOW MASTER LOGS獲得主服務器上的一系列日志。
3. 在所有的從屬服務器中判定最早的日志。這個是目標日志。如果所有的從屬服務器是更新的,這是清單上的最後一個日志。
4. 制作您將要刪除的所有日志的備份。(這個步驟是自選的,但是建議采用。)
5. 清理所有的日志,但是不包括目標日志