mysql開啟BINGLOG后日志文件增長比較快,很快占滿磁盤空間。

 

cd  /mysql/data/mydata

ls -ltr 

-rw-rw---- 1 mysql mysql 1073742040 Jul 21 20:20 mysql-bin.000036
-rw-rw---- 1 mysql mysql 1073741977 Jul 23 21:33 mysql-bin.000037
-rw-rw---- 1 mysql mysql 1073742172 Jul 26 12:45 mysql-bin.000038
-rw-rw---- 1 mysql mysql 1073742485 Jul 28 10:45 mysql-bin.000039

 

通過以下幾種方式刪除日志文件:
一、設置日志保留時長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

二、手動刪除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 D

 

生產上有一個比較小的系統,發現mysql占用空間較大,經排查發現是binlog比較多引起的

查看binlog過期時間,設置的時間為90天,這個值默認是0天,也就是說不自動清理,可以根據生產情況修改,本例修改為7天

  1. mysql> show variables like 'expire_logs_days';
  2. +------------------+-------+
  3. | Variable_name | Value |
  4. +------------------+-------+
  5. | expire_logs_days | 90 |
  6. +------------------+-------+
  7. 1 row in set (0.00 sec)

  1. mysql> set global expire_logs_days=7;
  2. Query OK, 0 rows affected (0.00 sec)
設置之后不會立即清除,觸發條件是:

 

binlog大小超過max_binlog_size
手動執行flush logs
重新啟動時(MySQL將會new一個新文件用於記錄binlog)

我們執行flush logs;

  1. mysql> flush logs;
  2. Query OK, 0 rows affected, 64 warnings (0.16 sec
如果binlog非常多,不要輕易設置改參數,有可能導致io爭用,這時候可以使用purge命令予以清除:
 
將bin.000055之前的binlog清掉:

  1. mysql>purge binary logs to 'bin.000055';
將指定時間之前的binlog清掉:
 
  1. mysql>purge binary logs before '2017-05-01 13:09:51';

 

mysql 日志自動切換

 

感謝

 

有三種解決方法:1.關閉mysql主從,關閉binlog;2.開啟mysql主從,設置expire_logs_days;3.手動清除binlog文件,> PURGE MASTER LOGS TO ‘MySQL-bin.010′;

實現:
1.關閉mysql主從,關閉binlog

# vim /etc/my.cnf  //注釋掉log-bin,binlog_format # Replication Master Server (default) # binary logging is required for replication # log-bin=mysql-bin # binary logging format - mixed recommended # binlog_format=mixed

然后重啟數據庫

2.重啟mysql,開啟mysql主從,設置expire_logs_days

# vim /etc/my.cnf  //修改expire_logs_days,x是自動刪除的天數,一般將x設置為短點,如10 expire_logs_days = x //二進制日志自動刪除的天數。默認值為0,表示“沒有自動刪除”

此方法需要重啟mysql,附錄有關於expire_logs_days的英文說明

當然也可以不重啟mysql,開啟mysql主從,直接在mysql里設置expire_logs_days

> show binary logs; > show variables like '%log%'; > set global expire_logs_days = 10;

 
3.手動清除binlog文件

# /usr/local/mysql/bin/mysql -u root -p > PURGE MASTER LOGS BEFORE DATE_SUB(CURRENT_DATE, INTERVAL 10 DAY); //刪除10天前的MySQL binlog日志,附錄2有關於PURGE MASTER LOGS手動刪除用法及示例 > show master logs;

 
也可以重置master,刪除所有binlog文件:

# /usr/local/mysql/bin/mysql -u root -p > reset master; //附錄3有清除binlog時,對從mysql的影響說明

附錄:
1.expire_logs_days英文說明
Where X is the number of days you’d like to keep them around. I would recommend 10, but this depends on how busy your MySQL server is and how fast these log files grow. Just make sure it is longer than the slowest slave takes to replicate the data from your master.
Just a side note: You know that you should do this anyway, but make sure you back up your mysql database. The binary log can be used to recover the database in certain situations; so having a backup ensures that if your database server does crash, you will be able to recover the data.

2.PURGE MASTER LOGS手動刪除用法及示例,MASTER和BINARY是同義詞

> PURGE {MASTER | BINARY} LOGS TO 'log_name' > PURGE {MASTER | BINARY} LOGS BEFORE 'date'

刪除指定的日志或日期之前的日志索引中的所有二進制日志。這些日志也會從記錄在日志索引文件中的清單中被刪除MySQL BIN-LOG 日志,這樣被給定的日志成為第一個。

實例:

> PURGE MASTER LOGS TO 'MySQL-bin.010'; //清除MySQL-bin.010日志 > PURGE MASTER LOGS BEFORE '2008-06-22 13:00:00'; //清除2008-06-22 13:00:00前binlog日志 > PURGE MASTER LOGS BEFORE DATE_SUB( NOW( ), INTERVAL 3 DAY); //清除3天前binlog日志BEFORE,變量的date自變量可以為'YYYY-MM-DD hh:mm:ss'格式。

 
3.清除binlog時,對從mysql的影響
如果您有一個活性的從屬服務器,該服務器當前正在讀取您正在試圖刪除的日志之一,則本語句不會起作用,而是會失敗,並伴隨一個錯誤。不過,如果從屬服務器是休止的,並且您碰巧清理了其想要讀取的日志之一,則從屬服務器啟動后不能復制。當從屬服務器正在復制時,本語句可以安全運行。您不需要停止它們。