如何移除並取消 MySQL 的 binary log 檔案

o MySQL 的 binary log 檔案佔了磁碟很多的空間

在例如 /var/lib/mysql/ 目錄可能會發現不少 MySQL 的 binary log 檔案:
-rw-rw—- 1 mysql mysql 29662 Aug 6 23:53 mysql-bin.000001
-rw-rw—- 1 mysql mysql 1055243 Aug 6 23:53 mysql-bin.000002
-rw-rw—- 1 mysql mysql 1073790447 Aug 7 00:42 mysql-bin.000003
-rw-rw—- 1 mysql mysql 1074547174 Aug 7 01:30 mysql-bin.000004
-rw-rw—- 1 mysql mysql 1074351847 Aug 7 01:54 mysql-bin.000005
-rw-rw—- 1 mysql mysql 1074535688 Aug 7 02:01 mysql-bin.000006
-rw-rw—- 1 mysql mysql 1074495922 Aug 7 02:07 mysql-bin.000007
-rw-rw—- 1 mysql mysql 1074497579 Aug 7 02:13 mysql-bin.000008
-rw-rw—- 1 mysql mysql 147849819 Aug 7 17:21 mysql-bin.000009

這些檔案可以佔住了磁碟很多的空間。

這一篇要說明如何正規方式移除這些檔案,並改寫 my.cnf 設定組態不去記錄這些二進位日誌檔案。

o 如何移除 MySQL 的 binary log 檔案 (Remove/Delete MySQL Binary Log)

還沒取消設定 MySQL 的 binary log 檔案的紀錄行為前,在命令列用 mysql 命令 (mysql client) 連進 mysqld,透過 mysql server 去將 binary log 檔案 刪除。

有兩種 mysql 命令可以使用:
1. 指定刪除某個時間以前的 binary log 檔案
PURGE BINARY LOGS BEFORE ‘2013-08-16 22:00:00’;

2. 指定刪除某個檔案流水號以前的 binary log 檔案
PURGE BINARY LOGS TO ‘mysql-bin.000047’;

執行範例:
shall> mysql -p -uroot
mysql> FLUSH LOGS;
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW MASTER STATUS;
+——————+———-+————–+——————+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+——————+———-+————–+——————+
| mysql-bin.000047 | 107 | | |
+——————+———-+————–+——————+
1 row in set (0.00 sec)

mysql> PURGE BINARY LOGS BEFORE ‘2013-08-16 21:30:00’;
Query OK, 0 rows affected (0.94 sec)

mysql> PURGE BINARY LOGS TO ‘mysql-bin.000047’;
Query OK, 0 rows affected (0.03 sec)

上面範例說明:
1. 用「 FLUSH LOGS」將超過 x 天的 log “沖掉” (移除)。
2. 用「 SHOW MASTER STATUS」看看狀態,要看到如上範例的情況才表示正在跑的組態設定是有 “binary log 檔案的紀錄行為”,去下「PURGE BINARY LOGS XXX….」命令才有效果。
3. 用「 PURGE BINARY LOGS BEFORE ‘2013-08-16 21:30:00’」指定刪除時間 ‘2013-08-16 21:30:00’ 以前的 binary log 檔案。
4. 用「 PURGE BINARY LOGS TO ‘mysql-bin.000047’」指定刪除檔案流水號 ‘mysql-bin.000047’ 以前的 binary log 檔案。
5. 依照自己需求「 PURGE BINARY LOGS BEFORE ‘date-time-stamp’」或「PURGE BINARY LOGS TO ‘bin-log-name’」選一個用即可。

注意:
如果先去設定了 /etc/my.cnf 組態將 “binary log 檔案的紀錄行為” 取消,並且重跑了 mysqld 才去用 mysql client 連進 mysqld server 想要刪除 binary log 檔案是無效的

例如以下這些 mysql 命令跑完了,其實 binary log 檔案還是存在:
mysql> purge binary logs to ‘mysql-bin.000046’;
Query OK, 0 rows affected (0.00 sec)

mysql> show master status;
Empty set (0.00 sec)

mysql> PURGE BINARY LOGS TO ‘mysql-bin.000046’;
Query OK, 0 rows affected (0.00 sec)

其他刪除的命令方式:
另外,可以用「RESET MASTER」去移除 binary log 檔,例如:
mysql> RESET MASTER;

清完以後 mysql/ 目錄就會類似像這樣:
[root@xxx mysql]# ls
xxx ibdata1 ib_logfile0 ib_logfile1 mysql performance_schema

o 如何取消 MySQL 的 binary log 檔案的紀錄行為

1. 編輯 mysql 的組態檔 my.cnf 並且將 「[mysqld]」區段的「log-bin=mysql-bin」這行註解掉 (或找「log_bin」字樣)。例如:
[root@xxx mysql]# vi /etc/my.cnf

[mysqld]
…..
#log-bin=mysql-bin
…..

2. 重跑 mysqld,例如:
[root@xxx mysql]# service mysqld restart

o 不想取消 binary log 組態,但是希望縮短 log 檔案的有效時間

如果不想取消 binary log 檔案之組態,但是希望縮短 log 檔案的有效時間以減少佔用磁碟的空間,可以在 my.cnf 中設定「expire-logs-days」組態 (有些版本是「expire_logs_days」組態名稱),例如,設定只留七天之內的 binary log 檔案:

[root@xxx mysql]# vi /etc/my.cnf

[mysqld]
…..
expire-logs-days=7
…..

然後重跑 mysqld,例如:
[root@xxx mysql]# service mysqld restart

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.