mysql-logo
MySQL ถ้าหากมีการเปิดใช้งาน binary log จะทำให้มีการเสียเนื้อที่บางส่วนไป ซึ่งถ้าหากไม่มีการกำหนดวันและเวลาในการ expire ของ binary log ดีๆแล้วจะทำให้มีโอกาสเกิดปัญหาเรื่องเนื้อที่ไม่พอใช้งานเกิดขึ้นอย่างแน่นอน

ถ้าหากเกิดปัญหา binary log ใช้เนื้อที่ในการเก็บข้อมูลเยอะมาก และต้องการลบออกไปบางส่วนเพื่อให้มีเนื้อที่พอใช้งานจำเป็นต้องรันคำสั่งบน MySQL เท่านั้น ไม่สามารถรันคำสั่งลบจาก OS ได้เหมือนการลบไฟล์ทั่วไป ดังนั้นควรทำตามขั้นตอนการลบ binary log ดังนี้

รันคำสั่งด้านล่างเพื่อแสดงข้อมูล binary log บนระบบ

SHOW BINARY LOGS;

mysql> SHOW BINARY LOGS;
+-------------------+-----------+
| Log_name | File_size |
+-------------------+-----------+
| mysqld-bin.002622 | 134217792 |
| mysqld-bin.002623 | 134222196 |
| mysqld-bin.002624 | 134217834 |
...
| mysqld-bin.002837 | 134217881 |
| mysqld-bin.002838 | 134217844 |
| mysqld-bin.002839 | 134217816 |
| mysqld-bin.002840 | 3008671 |
+-------------------+-----------+
219 rows in set (0.00 sec)

การคำสั่งด้านบนพบว่าจำนวน binary log ที่เก็บไว้มีจำนวนมาก ดังนั้นถ้าหากไม่ต้องการให้ binary log มีจำนวนมาก จำเป็นต้องทำการแก้ไข expire_logs_days บน MySQL ให้มีจำนวนวันน้อยกว่านี้ แต่ก่อนจะทำการแก้ไขเราควรจะทราบก่อนว่าตอนนี้ expire_logs_days กำหนดเป็นกี่วัน โดบให้รันคำสั่งด้านล่าง

mysql> show variables like "expire_logs%";
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| expire_logs_days | 14 |
+------------------+-------+
1 row in set (0.00 sec)

จากตัวอย่าง ผลลัพธ์แสดงให้เห็นว่า มีการเก็บ binary log ไว้นานถึง 14 วัน ดังนั้นเราสามารถลดจำนวนวันที่เก็บ binary log ได้โดยใช้คำสั่ง

mysql> SET GLOBAL expire_logs_days=xx;

xx คือจำนวนวันที่เก็บ binary log

ตัวอย่างเช่น ต้องการเก็บ binary log ไว้ 4 วัน ให้รันคำสั่งดังนี้

mysql> set global expire_logs_days=4;
Query OK, 0 rows affected (0.00 sec)

เมื่อทำการกำหนดวัน expire เรียบร้อยแล้ว ขั้นต่อมาให้ทำการ flush log เพื่อลบ binary log ที่มีอายุเกินกว่าที่กำหนดทิ้ง

mysql> flush logs;
Query OK, 0 rows affected (0.35 sec)

ทำการตรวจสอบ binary log อีกครั้ง จะพบว่าจำนวน binary log ที่มีจะมีจำนวนน้อยลง

mysql> SHOW BINARY LOGS;
+-------------------+-----------+
| Log_name | File_size |
+-------------------+-----------+
| mysqld-bin.002712 | 134217773 |
| mysqld-bin.002713 | 134217864 |
| mysqld-bin.002714 | 134217840 |
| mysqld-bin.002715 | 134217819 |
| mysqld-bin.002716 | 134217941 |
...
| mysqld-bin.002837 | 134217881 |
| mysqld-bin.002838 | 134217844 |
| mysqld-bin.002839 | 134217816 |
| mysqld-bin.002840 | 8238887 |
| mysqld-bin.002841 | 244952 |
+-------------------+-----------+
130 rows in set (0.00 sec)

หลังจากแก้ไขแล้วอย่าลืมไปแก้ที่ไฟล์ my.cnf โดยให้เพิ่ม parameter ด้านล่างลงไปที่ส่วนของ [mysqld] ถ้าหากไม่แก้ไขจะทำให้ expire_logs_days มีค่าเท่าเดิมหลังจาก restart MySQL

[mysqld]
...
expire_logs_days=xx
...

xx คือจำนวนวันที่เก็บ binary log

นอกจากนี้ยังมีอีกวิธีที่สามารถลบ binary log ได้ โดยไม่ต้องไปแก้ไข parameter ของ MySQL แต่จำนวนวันหมดอายุของ binary log จะเท่าเดิม ซึ่งก็จะมีโอกาศที่ binary log จะใช้เนื้อมากเหมือนเดิม

คำสั่งที่ใช้ในการลบ binary log
ลบ binary log โดยกำหนดจากไฟล์ binary log

mysql> PURGE BINARY LOGS TO 'mysql-bin.0xx';

ลบ binary log โดยกำหนดจากวันและเวลา
[shell]
mysql> PURGE BINARY LOGS BEFORE ‘20013-04-02 22:00:00’;
[/shell]