rolling diffs untuk penyimpanan file yang sangat mirip?

17

Di tempat kerja kami melakukan dump malam dari database mysql kami. Dari hari ke hari, saya akan menyarankan bahwa hampir 90-95% dari data adalah duplikat, meningkat seiring berjalannya waktu. (Heck pada titik ini ada yang mungkin 99%)

Kesedihan ini adalah di mana satu baris adalah pernyataan INSERT mysql tunggal, jadi satu-satunya perbedaan adalah seluruh baris, dan urutan di mana mereka berada dalam file. Jika saya menyortirnya, perbedaan sebenarnya dari file ke file akan sangat kecil.

Saya sudah mencari, dan saya belum menemukan cara untuk mengurutkan output pada dump. Saya bisa menyalurkannya melalui sortperintah. Kemudian akan ada blok panjang yang sama dari garis yang identik.

Jadi saya mencoba mencari cara untuk menyimpan hanya diff. Saya bisa mulai dengan dump utama, dan berbeda setiap malam. Tetapi perbedaan akan lebih besar setiap malam. Atau, saya bisa membuat rolling diff, yang secara individual akan sangat kecil, tetapi sepertinya akan lebih lama dan lebih lama untuk dihitung, jika saya harus membuat master diff dari seluruh seri setiap malam.

Apakah ini layak? Dengan alat apa?


Sunting Saya tidak bertanya bagaimana cara melakukan backup mysql. Lupakan mysql untuk saat ini. Itu adalah herring merah. Yang ingin saya ketahui adalah bagaimana membuat serangkaian rolling bergulir dari serangkaian file. Setiap malam kami mendapatkan file (yang merupakan file mysqldump ) yang 99% mirip dengan yang sebelumnya. Ya, kami gzip semuanya. Tapi itu berlebihan untuk memiliki semua redundansi itu di tempat pertama. Yang saya butuhkan hanyalah perbedaan dari malam sebelumnya ... yang hanya 1% berbeda dari malam sebelumnya ... dan seterusnya. Jadi yang saya cari adalah bagaimana membuat serangkaian diff jadi saya hanya perlu menyimpan 1% itu setiap malam.

pengguna394
sumber

Jawaban:

13

Dua alat cadangan yang dapat menyimpan diff binary adalah rdiff-backup dan dupity . Keduanya didasarkan pada librsync, tetapi di atas mereka berperilaku sangat berbeda. Rdiff-backup menyimpan salinan terbaru dan membalikkan diff, sementara duplikat menyimpan diff inkremental tradisional. Kedua alat ini juga menawarkan serangkaian fitur periferal yang berbeda.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
1
IIUC, rdiff-backup lebih menarik, karena memungkinkan seseorang untuk menelusuri cadangan secara normal, sedangkan duplikat hanya memiliki salinan lama.
tshepang
Saya tahu pertanyaan + pertanyaannya cukup lama, tetapi bisakah Anda menambahkan contoh perintah yang menunjukkan cara menggunakannya? Misalnya untuk backup201901.tar.gz, backup201902.tar.gz, ..., backup201912.tar.gz, backup202001.tar.gz. Ini akan berguna untuk referensi di masa mendatang.
Basj
Terakhir kali saya mengikuti backup rdiff, devs utama telah pindah, dan proyek itu mengalami stagnasi, Tidak tahu apakah itu berubah. Itu juga sangat lambat di jaringan, jika itu penting.
Lizardx
12

Akhir-akhir ini saya sudah mencoba menyimpan dump database di git. Ini mungkin menjadi tidak praktis jika dump database Anda benar-benar besar, tetapi itu berfungsi untuk saya untuk database yang bertubuh kecil (situs Wordpress dan sejenisnya).

Skrip cadangan saya kira-kira:

cd /where/I/keep/backups && \
mysqldump > backup.sql && \
git commit -q -m "db dump `date '+%F-%T'`" backup.sql
membuat basah kuyup
sumber
Ini hanya menyimpan perbedaan?
user394
2
Iya. Sangat nyaman! Anda dapat "memeriksa" file dari suatu titik waktu, dan git akan secara otomatis menggabungkan diff untuk memberi Anda seluruh file seperti yang ada pada waktu itu.
sep332
1
Posting blog ini (bukan milik saya) menjelaskan lebih detail: viget.com/extend/backup-Anda-database-in-git . Komentar mendapatkan lebih banyak tentang pro & kontra dan peringatan. Saya juga akan menambahkan bahwa jika Anda menggunakan git, Anda mendapatkan lebih dari sekadar dapat memutar kembali versi. Anda juga dapat menandai dump, atau memiliki cabang terpisah (dev / prod). Cara saya melihatnya adalah git (atau memasukkan sistem kontrol versi modern favorit Anda) melakukan pekerjaan yang lebih baik daripada yang saya bisa dengan menggulirkan 'solusi' diff / gzip saya sendiri. Satu peringatan tentang artikel ini: jangan mendorong dump Anda ke github kecuali Anda menginginkannya publik (atau membayar repo pribadi).
basah kuyup
1
Git tidak hanya menyimpan diff. Bahkan, terutama menyimpan snapshot penuh dari setiap revisi, tetapi dengan berbagai optimasi. Lihat jawaban yang luar biasa ini dan pertanyaannya
gemetar
2

Anda dapat melakukan hal seperti ini (dengan a.sqlcadangan mingguan Anda).

mysqldump > b.sql
diff a.sql b.sql > a1.diff
scp a1.diff backupserver:~/backup/

File diff Anda akan menjadi lebih besar pada akhir minggu ini.

Saran saya adalah gzip saja (gunakan gzip -9untuk kompresi maksimum). Kami melakukan ini saat ini dan itu memberikan penggunaan file 59MB gz sedangkan aslinya 639MB.

Gert
sumber
Kami sudah gzipping mereka :)
user394
1

Ada beberapa pendekatan yang mungkin bisa diikuti, tergantung pada ukuran dan kesamaan tekstual aktual dari dump database:

  1. menerapkan program cadangan deduplicating yang menggunakan rolling checksum sesuai permintaan OP, mis. restic ( https://restic.net/ ) atau borgbackup ( https://borgbackup.readthedocs.io/ ) pada dumps yang tidak dimodifikasi. Kedua sistem memungkinkan pemasangan versi cadangan tertentu melalui FUSE dan bekerja dengan cara bertahap yang disebut selamanya.
  2. Memisahkan struktur basis data dari konten, mirip dengan cara orang-orang NCBI melakukannya untuk basis data genetika yang cukup besar. Yaitu: Anda akan membuat skrip SQL untuk membuat skema basis data (misalnya seperti ftp://ftp.ncbi.nlm.nih.gov/snp/organisms/human_9606_b151_GRCh38p7/database/organism_schema/ ) dan secara terpisah menyimpan konten tabel di salah satu cleartext atau format biner terkompresi tanpa memasukkan pernyataan (seperti yang dilakukan di ftp://ftp.ncbi.nlm.nih.gov/snp/organisms/human_9606_b151_GRCh38p7/database/organism_data/) misalnya sebagai tab atau nilai yang dipisahkan koma. Tentu saja itu memerlukan rutin impor terpisah yang akan membuat pernyataan penyisipan tepat waktu untuk mengimpor data kembali ke basis data, yaitu memulihkan dari cadangan. Jika DBMS Anda menawarkan importir file csv, persyaratan skrip tambahan di atas dapat dihilangkan. File-file teks yang begitu menyusut dapat sekali lagi dimasukkan ke dalam program cadangan reguler yang disebutkan di atas atau lainnya seperti rdiff-backup.
  3. Pilih solusi di mana struktur dan konten secara longgar digabungkan menggunakan format seperti file arff seperti WEKA gunakan ( https://www.cs.waikato.ac.nz/ml/weka/arff.html ): Struktur dan tipe data dari kolom akan dideklarasikan di header file, dan konten yang sebenarnya kemudian akan dipisahkan dengan pernyataan @DATA sekali lagi dalam bentuk seperti csv. Banyak alat ETL saat ini menawarkan pembaca arff selain konektor basis data. File-file itu sendiri dapat lagi dimasukkan ke dalam program cadangan reguler
jf1
sumber
-3

(Saya belum melakukan ini dalam produksi.)

Lakukan pencadangan penuh sekali sehari atau seminggu. Cadangkan log cadangan sekali per jam atau sehari.

rcrowley
sumber
Apa itu log relay?
user394