Có an toàn để xóa các tập tin mysql-bin?


92

Tôi có bản sao MM trong mysql và tôi muốn nén một số không gian trống trong hộp để xóa các tệp không cần thiết, tôi đã xem qua các mysql-bintệp này bên trong /var/db/mysql/Có hàng trăm tệp như vậy mysql-bin.000123, mysql-bin.000223v.v. Tôi đã kiểm tra sao chép mysql bằng cách thực hiện show master statusshow slave statuschúng sử dụng một số tệp mysql-bin tại các vị trí nhất định, nhưng tôi đoán tất cả các tệp bin khác là phần còn lại sẽ không được sử dụng nữa. Trong trường hợp này có an toàn để xóa tất cả các tệp mysql-bin ngoại trừ các tệp mà bản sao hiện đang trỏ tới không?

Nếu an toàn để xóa, vậy tôi có thể làm gì để tự động xóa các tệp đó khi chúng không được sử dụng?

Câu trả lời:


136

Xin đừng chỉ xóa chúng trong HĐH.

Bạn cần phải để mysqld làm điều đó cho bạn. Đây là cách mysqld quản lý nó:

Các tập tin mysql-bin.[index]giữ một danh sách tất cả các bản ghi nhị phân mysqld đã tạo và tự động xoay. Các cơ chế để làm sạch các binlog kết hợp với mysql-bin.[index]là:

PURGE BINARY LOGS TO 'binlogname';
PURGE BINARY LOGS BEFORE 'datetimestamp';

Chúng sẽ xóa tất cả các bản ghi nhị phân trước binlog hoặc dấu thời gian bạn vừa chỉ định.

Ví dụ: nếu bạn chạy

PURGE BINARY LOGS TO 'mysql-bin.000223';

điều này sẽ xóa tất cả các bản ghi nhị phân trước đó mysql-bin.000223.

Nếu bạn chạy

PURGE BINARY LOGS BEFORE DATE(NOW() - INTERVAL 3 DAY) + INTERVAL 0 SECOND;

điều này sẽ xóa tất cả các bản ghi nhị phân trước nửa đêm 3 ngày trước.

Nếu bạn muốn binlog tự động quay vòng và giữ 3 ngày trôi qua, chỉ cần đặt cái này:

mysql> SET GLOBAL expire_logs_days = 3;

sau đó thêm nó vào /etc/my.cnf

[mysqld]
expire_logs_days=3

và mysqld sẽ xóa chúng nhật ký cho bạn

HIỂN THỊ TÌNH TRẠNG SLAVE \ G

Điều này là rất quan trọng. Khi bạn chạy SHOW SLAVE STATUS\G, bạn sẽ thấy hai bản ghi nhị phân từ Master:

  • Master_Log_File
  • Relay_Master_Log_File

Khi nhân rộng có ít hoặc không có độ trễ, chúng thường có cùng giá trị. Khi có nhiều độ trễ nhân rộng, các giá trị này là khác nhau. Chỉ cần làm cho nó đơn giản, chọn bất cứ thứ gì Relay_Master_Log_Filevà quay trở lại Master và chạy

PURGE BINARY LOGS TO 'Whatever Relay_Master_Log_File Is';

Bằng cách đó, nhân rộng không bị gián đoạn.


1
Xin lưu ý một lỗi đánh máy - dấu gạch dưới, không dấu gạch ngang: [mysqld] expire_logs_days=3(và bạn phải bao gồm [mysqld]phần
changokun

@changokun Đó không phải là một lỗi đánh máy. my.cnf sẽ chấp nhận dấu gạch ngang. Chạy SET GLOBAL expire_logs_days = 3;từ máy khách mysql sẽ không chấp nhận chúng. Ví dụ trong Tài liệu MySQL: dev.mysql.com/doc/refman/5.5/en/mysqld-option-tables.html
RolandoMyQueryDBA

Điều này làm việc cho tôi. Câu hỏi, sự khác biệt giữa ... mysql> SET GLOBAL expire_logs_days = 3;expire-logs-days=3trong /etc/my.cnf.. Chúng có giống nhau không? Đây có phải là dư thừa hay không? Hoặc, điều quan trọng là chạy SET GLOBAL...sau đó thêm expire-logs-days=..? Cảm ơn.
Nino Paolo

Rõ ràng nhanh chóng loại bỏ tất cả các bản ghi, rõ ràng: PURGE BINARY LOGS BEFORE DATE(NOW());tại sao không có mặc định lành mạnh cho việc này? Tôi không có nơi nào, không bao giờ tự do thay đổi kích thước tệp nhật ký thành một số lượng khổng lồ. Tôi đã có một tệp nhật ký 10,0 GB, sau khi chạy lệnh này, kích thước thư mục mysql.bin của tôi giảm xuống còn 1,6 GB.
Michael Trouw

20

Điều này thực sự phụ thuộc vào chiến lược sao lưu của bạn. Một trong những lý do chính để giữ các bản ghi nhị phân xung quanh là để khôi phục cơ sở dữ liệu của bạn về 'thời điểm'. Nếu cơ sở dữ liệu của bạn gặp sự cố và yêu cầu khôi phục, bạn sẽ khôi phục bản sao lưu đầy đủ mới nhất và sau đó phát lại nhật ký nhị phân bắt đầu bằng vị trí của bản sao lưu đầy đủ.

Vì vậy, nếu bạn thực hiện sao lưu toàn bộ mỗi ngày và bạn có nhật ký nhị phân trị giá 7 ngày, có khả năng bạn có thể xóa nhật ký nhị phân có giá trị từ 4 - 6 ngày qua. Bạn có thể kiểm soát số lượng nhật ký nhị phân có giá trị trong bao nhiêu ngày với expire_logs_dayscài đặt.

Bạn có thể xóa nhật ký nhị phân mà bạn không cần bằng cách trước tiên xem nhật ký cũ nhất bạn muốn giữ là gì:

ls -lh /path/to/binary/logs/mysql-bin.0*

và sau đó trong mysql:

mysql> PURGE BINARY LOGS TO 'mysql-bin.XXXXX';

5

Thử đi:

RESET MASTER;

như tài liệu đã nói:

RESET MASTER cho phép bạn xóa bất kỳ tệp nhật ký nhị phân và tệp chỉ mục nhật ký nhị phân liên quan của chúng, trả lại bản gốc về trạng thái trước khi bắt đầu ghi nhật ký nhị phân.

Điều này sẽ xóa tất cả các tệp nhật ký nhị phân liên quan, có thể không phải những gì bạn muốn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.