27. tháng 1 2025
Thứ Sáu luôn là ngày đầy bất ngờ. Đầu tiên, một hệ thống cuộc thi chưa được kiểm thử hoàn toàn đã bị khách hàng đẩy lên môi trường sản xuất sớm hơn dự kiến, khiến cả nhóm hoảng hốt; sau đó chúng tôi phát hiện ra rằng ổ đĩa của một trong những máy chủ đã đầy... 😱
Để nhanh chóng dọn dẹp không gian ổ đĩa, chúng tôi đã lần lượt xóa:
Tuy nhiên, điều này chỉ giúp giải phóng dưới 5GB không gian. Sau đó, khi sử dụng lệnh ncdu để phân casino tích việc sử dụng không gian ổ đĩa trên Linux, chúng tôi ngạc nhiên khi thấy rằng các file binlog trong thư mục MySQL đã chiếm gần 100GB. Trước đây, mỗi ngày trung bình khoảng 1-2GB nhật ký, nhưng tuần này con số này đã tăng vọt lên tới 7-8GB mỗi ngày.
Chúng ta có thể xóa các file binlog trước một số thứ tự nhất định thông qua giao diện console của MySQL bằng câu lệnh SQL:
Ví dụ: Xóa tất cả các file binlog trước số thứ tự 100 (có thể xác định thứ tự từ danh sách file trong thư mục mysql):
1PURGE BINARY LOGS TO 'binlog.000100';
Ví dụ: Trong phiên bản MySQL 8.0+, bạn có thể thiết lập chính xác thời gian giữ lại log theo giây (ví dụ: giữ lại 3 ngày). Vì dữ liệu lưu trữ không phải thuộc loại tài chính hay cần độ an toàn cực cao nên việc giữ lại logs trong 3 ngày là đủ.
1SET GLOBAL binlog_expire_logs_seconds = 3*24*3600;
Lưu ý bổ sung:
Trên MySQL 8, tham số expire_logs_days
đã không còn được hỗ trợ nữa, thay vào đó bạn cần sử dụng binlog_expire_logs_seconds
.
Khi thử thiết lập như lịch bóng đá ngoại hạng anh sau:
1SET GLOBAL expire_logs_days = [i9bet](/blog/enterprise-wechat-develop-service-in-company/) 3;
MySQL sẽ trả về lỗi:
1#3683 - Các tùy chọn expire_logs_days và binlog_expire_logs_seconds không thể cùng được sử dụng. Vui lòng sử dụng binlog_expire_logs_seconds để cài đặt thời gian hết hạn (expire_logs_days đã bị deprecated).
Bạn có thể xác nhận rằng giá trị đã được cập nhật thành công bằng cách thực hiện lệnh sau:
1SHOW VARIABLES LIKE 'binlog_expire_logs_seconds';
Kết quả:
Variable_name Value
binlog_expire_logs_seconds 259200
Cấu hình trên sẽ mất hiệu lực sau khi dịch vụ MySQL được khởi động lại. Để duy trì thiết lập này vĩnh viễn, bạn cần sửa đổi tệp cấu hình của MySQL. Trong trường hợp của tôi, vì MySQL đang chạy trên Docker, lý thuyết thì có thể chỉnh sửa thông qua biến môi trường trong tập tin docker-compose.yml. Tôi sẽ dành thời gian tối nào ít truy cập hơn để xử lý vấn đề này.
Một bài học thú vị về vận hành hệ thống lại được bổ sung! 😅
Cuối cùng, chúng ta vẫn nên thêm một cơ chế giám sát không gian ổ đĩa để đảm bảo rằng hệ thống sẽ gửi cảnh báo khi dung lượng ổ đĩa xuống thấp. Việc thiết lập lịch trình giám sát này sẽ giúp tránh tình trạng tương tự xảy ra trong tương lai.