Docker - Full ổ cứng vì /data/mysql/binlog.*
Xin chào! Mình sử dụng Docker (Laradock), hnay sv báo ổ cứng bị đầy, mình check thì do Docker ghi log quá nhiều. Sao n lại tạo quá nhiều file binlog, và dung lượng lại lớn như vậy? có cách nào khắc phục vấn đề này k mn?
2 ANSWERS
binlog
hay Binary Log là file lưu lại mọi action có tác động đến sự thay đổi của dữ liệu, tức về cơ bản là mọi thao tác insert
, update
hay delete
của bạn đều được lưu lại tại đây. Thế nên nếu hệ thống của bạn được sử dụng nhiều, và có nhiều thao tác với database thì phần log này có thể phình lên khá nhanh.
Binary Log được sinh ra với 2 mục đích chính:
- Đồng bộ dữ liệu trong mô hình replication, giữa
master
vàslave
. Tức thao tác thay đổi dữ liệu trongmaster
sẽ được đồng bộ sangslave
theo cách là những event trong Binary Log củamaster
sẽ được gửi sangslave
, và được chạy lại ở bênslave
, từ đó tái hiện lại được dữ liệu giống với bênmaster
. - Khôi phục dữ liệu (data recovery). Bạn có thể chạy backup dữ liệu thường xuyên, 1, 2 lần một ngày. Tuy nhiên khi hệ thống có sự cố, mà cần khôi phục lại dữ liệu thì nếu chỉ dùng bản backup đó thôi cũng sẽ không đủ giúp bạn có lại được dữ liệu một cách toàn vẹn như ở thời điểm trước khi sự cố xảy ra. Khi đó bạn có thể sử dụng Binary Log để chạy lại những câu lệnh từ sau khi bản backup được tạo ra, từ đó có thể tiếp tục khôi phục dữ liệu từ sau thời điểm của bản backup.
Còn quay trở lại với vấn đề của bạn, thì cũng không rõ tại sao chức năng binary log lại đang được bật lên như vậy. Bạn có thể cân nhắc các cách xử lý như dưới đây:
- Tắt hẳn chức năng này đi. Ở trong thư mục laradock có file
mysql/my.cnf
, bạn thêm optiondisable-log-bin
(hoặcdisable_log_bin
gì đó) vào đó rồi restart lại mysql service - Thay đổi option expire log cho ngắn đi. Theo mình check trên document của mysql thì đó là option binlog_expire_logs_seconds với giá trị default là 2592000 giây (30 ngày), bạn có thể đổi lại thành 1, 2 ngày thôi. Để dùng option này thì bạn cũng edit vào trực tiếp file
mysql/my.cnf
À ngoài ra để xóa hết các file binlog hiện tại, bạn có thể dùng lệnh PURGE BINARY LOGS
như hướng dẫn ở đây https://dev.mysql.com/doc/refman/8.0/en/purge-binary-logs.html
Tks, mình set binlog_expire_logs_seconds thành 1 ngày, 2 ngày sau binlong có dấu hiệu giảm, nhưng hôm này n lại tăng lên mấy chục gb, có lẽ mình sẽ disable n.
Bác thử tham khảo bài viết này xem: https://www.programmersought.com/article/98561321267/ Mình thấy có một số cách được chia sẻ:
- Xóa thủ công bằng cách lệnh SQL:
-- Nếu không phải là máy master
reset master;
-- Nếu là máy master, kiểm tra xem binlog hiện tại là đang dùng tới file thứ tự nào:
show master status;
-- Xóa các cũ, trừ file thứ tự hiện tại:
PURGE BINARY LOGS TO 'mysql-bin.010';
-- Xóa các file cũ theo ngày:
PURGE BINARY LOGS BEFORE '2019-04-02 22:46:26';
Về 2 cách này thì điểm khác nhau đó là cái RESET nó sẽ xóa logs và đặt lại số thứ tự ở đuối của file logs về lại từ đầu là 1.
- RESET MASTER: https://dev.mysql.com/doc/refman/5.7/en/reset-master.html
- PURGE BINARY LOGS: https://dev.mysql.com/doc/refman/5.7/en/purge-binary-logs.html
- Xóa tự động
-- Kiểm thời gian tối đa mà file binlog được lưu trữ:
show variables like ‘expire_logs_days’;
-- Giảm thời gian xuống VD từ 7 ngày xuống còn 3 ngày:
set global expire_logs_days = 3;