服務器慢 mysql-bin.000001文件佔滿磁盤的原因與解決

發現 VPS 服務器上的網站反應超級慢,簡單的重啓、重啓各主要服務,發現mysql 的反應極其不正常。

一方面是問題,這與站點訪問量有關。開始時從mysql 的配置文件 my.cnf 考慮,這裏的問題並不是此原因。

排查過程中 df -lh 命令,發現系統主目錄磁盤使用率 100% 了。
粗略估計應該是 /usr/ 下出了問題,執行命令:

du -h –max-depth=1 /usr/local/ | sort -nr | more

查看並分析結果,發現 /usr/local/mysql/var/ 目錄異常,該目錄下有衆多類似這樣的文件:mysql-bin.00001

這是數據庫的日誌文件,原因就在於此。那麼我們可以刪除它,執行命令:

/usr/local/mysql/bin/mysql -u root -p

輸入密碼後進入 mysql 命令行,執行:

reset master;

此時再查看日誌文件是否已被清除。
日誌文件一般用於主從服務器的備份恢復,這裏是單服務器,那麼就應該關閉日誌記錄。所以應該這麼做,編輯 my.cnf 文件:

vim /etc/my.cnf

註釋掉如下兩行:

#log-bin=mysql-bin
#binlog_format=mixed

然後重啓 mysql,若出現類似如下錯誤提示:

Starting MySQL.Manager of pid-file quit without updating fi[Failed]

這應該是日誌索引的問題,刪除文件 mysql-bin.index:

rm -f /usr/local/mysql/var/mysql-bin.index

然後再重啓。此時若 mysql-bin.00001 這些文件還在,可刪除之:

rm -f /usr/local/mysql/var/mysql-bin.000*


1.查找當

mysql> show binary logs;

+—————-+———–+

| Log_name | File_size |

+—————-+———–+

| mysql-bin.000001 | 150462942 |

| mysql-bin.000002 | 125 |

| mysql-bin.000003 | 106 |

+—————-+———–+

2.刪除bin-log(刪除mysql-bin.000003之前的而沒有包含mysql-bin.000003)

mysql> purge binary logs to 'mysql-bin.000003';

Query OK, 0 rows affected (0.16 sec)

3. 查詢結果(現在只有一條記錄了.)

mysql> show binlog events/G

*************************** 1. row ***************************

Log_name: mysql-bin.000003

Pos: 4

Event_type: Format_desc

Server_id: 1

End_log_pos: 106

Info: Server ver: 5.1.26-rc-log, Binlog ver: 4

1 row in set (0.01 sec)

(mysql-bin.000001和mysql-bin.000002已被刪除)

mysql> show binary logs;

+—————-+———–+

| Log_name | File_size |

+—————-+———–+

| mysql-bin.000003 | 106 |

+—————-+———–+

1 row in set (0.00 sec)

(刪除的其它格式運用!)

  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′;
清除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. 清理所有的日誌,但是不包括目標日誌。


在contab設置:

0 1 * * *  `mysql -uroot -e 'PURGE MASTER LOGS BEFORE DATE_SUB( NOW( ), INTERVAL 3 DAY);'`
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章