Apakah aman untuk menghapus file-file mysql-bin?

93

Saya memiliki Replikasi MM di mysql, dan saya ingin memeras beberapa ruang kosong di kotak menghapus file yang tidak perlu, saya menemukan mysql-binfile - file ini di dalam /var/db/mysql/Ada ratusan file seperti mysql-bin.000123, mysql-bin.000223dll. Saya telah memeriksa replikasi mysql dengan melakukan show master statusdan show slave statusmereka menggunakan beberapa file mysql-bin pada posisi tertentu, tapi saya kira semua file bin lainnya adalah sisa yang tidak akan digunakan lagi. Dalam hal ini apakah aman untuk menghapus semua file mysql-bin kecuali yang replikasi saat ini menunjuk?

Jika aman untuk dihapus, lalu adakah yang bisa saya lakukan untuk menghapus file-file itu secara otomatis begitu tidak digunakan?


sumber

Jawaban:

137

Tolong jangan hanya menghapusnya di OS.

Anda perlu membiarkan mysqld melakukan itu untuk Anda. Inilah cara mysqld mengelolanya:

File mysql-bin.[index]menyimpan daftar semua log biner yang telah dibuat dan diputar secara otomatis oleh mysqld. Mekanisme untuk membersihkan binlog bersamaan dengan mysql-bin.[index]adalah:

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

Ini akan menghapus semua log biner sebelum binlog atau cap waktu yang baru saja Anda tentukan.

Misalnya, jika Anda menjalankan

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

ini akan menghapus semua log biner sebelumnya mysql-bin.000223.

Jika Anda berlari

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

ini akan menghapus semua log biner sebelum tengah malam 3 hari yang lalu.

Jika Anda ingin agar binlog diputar secara otomatis dan tetap 3 hari, cukup setel ini:

mysql> SET GLOBAL expire_logs_days = 3;

lalu tambahkan ini ke /etc/my.cnf

[mysqld]
expire_logs_days=3

dan mysqld akan menghapus log mereka untuk Anda

TAMPILKAN STATUS BUDAK \ G

Ini sangat penting. Ketika Anda menjalankan SHOW SLAVE STATUS\G, Anda akan melihat dua log biner dari Master:

  • Master_Log_File
  • Relay_Master_Log_File

Ketika replikasi memiliki sedikit atau tidak ada lag, ini biasanya bernilai sama. Ketika ada banyak replikasi lag, nilai-nilai ini berbeda. Hanya untuk membuatnya sederhana, pilih apa pun yang Relay_Master_Log_Fileada, dan kembali ke Master dan lari

PURGE BINARY LOGS TO 'Whatever Relay_Master_Log_File Is';

Dengan begitu, replikasi tidak terganggu.

RolandoMySQLDBA
sumber
1
Harap perhatikan salah ketik - garis bawah, bukan garis [mysqld] expire_logs_days=3[mysqld]
putus
@ Changokun Itu bukan kesalahan ketik. my.cnf akan menerima tanda hubung. Menjalankan SET GLOBAL expire_logs_days = 3;dari klien mysql tidak akan menerimanya. Contoh di Dokumen MySQL: dev.mysql.com/doc/refman/5.5/en/mysqld-option-tables.html
RolandoMySQLDBA
Ini bekerja untuk saya. Pertanyaan, apa perbedaan antara ... mysql> SET GLOBAL expire_logs_days = 3;dan expire-logs-days=3di /etc/my.cnf... Apakah mereka sama? Apakah ini berlebihan atau tidak? Atau, penting untuk menjalankan SET GLOBAL...lalu menambahkan expire-logs-days=..? Terima kasih.
Nino Paolo
Hapus semua log dengan cepat, jelas: PURGE BINARY LOGS BEFORE DATE(NOW());mengapa tidak ada default waras untuk ini? Saya tidak punya tempat, tidak pernah jelas mengubah ukuran file log ke sejumlah besar. Saya memiliki file log 10,0 GB, setelah menjalankan perintah ini ukuran folder mysql.bin saya menyusut menjadi 1,6GB.
Michael Trouw
20

Ini sangat tergantung pada strategi cadangan Anda. Salah satu alasan utama untuk menjaga log biner adalah untuk mengembalikan database Anda ke 'point-in-time'. Jika database Anda macet dan membutuhkan pemulihan, Anda akan mengembalikan cadangan lengkap terbaru, dan kemudian memutar ulang log biner dimulai dengan posisi cadangan penuh.

Jadi, jika Anda melakukan pencadangan penuh setiap hari dan Anda memiliki log biner selama 7 hari, kemungkinan Anda dapat menghapus log biner selama 4-6 hari terakhir. Anda dapat mengontrol berapa hari nilai log biner disimpan dengan expire_logs_dayspengaturan.

Anda dapat menghapus log biner yang tidak Anda perlukan dengan terlebih dahulu melihat apa log tertua yang ingin Anda simpan:

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

dan kemudian di mysql:

mysql> PURGE BINARY LOGS TO 'mysql-bin.XXXXX';
Derek Downey
sumber
5

Coba ini:

RESET MASTER;

seperti yang tertulis dalam dokumen :

RESET MASTER memungkinkan Anda untuk menghapus file log biner dan file indeks log biner terkait, mengembalikan master ke statusnya sebelum log biner dimulai.

Ini akan menghapus semua file log biner terkait, yang mungkin bukan yang Anda inginkan.

Morris
sumber