Rolling Diffs für die Speicherung von sehr ähnlichen Dateien?


13

Bei der Arbeit machen wir einen nächtlichen Dump unserer MySQL-Datenbanken. Von Tag zu Tag würde ich feststellen, dass fast 90-95% der Daten doppelt vorhanden sind und mit der Zeit zunehmen. (Zum Teufel zu diesem Zeitpunkt sind einige wahrscheinlich 99%)

Bei diesen Speicherauszügen handelt es sich bei einer Zeile um eine einzelne mysql INSERT-Anweisung. Die einzigen Unterschiede sind also ganze Zeilen und die Reihenfolge, in der sie in der Datei enthalten sind. Wenn ich sie sortieren würde, wäre der tatsächliche Unterschied von Datei zu Datei sehr gering.

Ich habe gesucht, und ich habe keine Möglichkeit gefunden, die Ausgabe auf Dump zu sortieren. Ich könnte es aber durch den sortBefehl leiten. Dann würde es lange, lange Blöcke mit identischen Zeilen geben.

Also versuche ich einen Weg zu finden, um nur die Unterschiede zu speichern. Ich könnte mit einem Master Dump beginnen und mich jede Nacht dagegen wehren. Aber die Unterschiede würden jede Nacht größer sein. Oder ich könnte rollende Diffs erstellen, die einzeln sehr klein wären, deren Berechnung jedoch immer länger dauern würde, wenn ich jeden Abend ein Master-Diff der gesamten Serie zusammenstellen müsste.

Ist das machbar? Mit welchen Werkzeugen?


Bearbeiten Ich frage nicht, wie man MySQL-Backups macht. Vergiss für den Moment MySQL. Es ist ein roter Hering. Was ich wissen möchte, ist, wie man eine Reihe von rollenden Unterschieden aus einer Reihe von Dateien macht. Jede Nacht erhalten wir eine Datei (die zufällig eine mysqldump-Datei ist ), die der vorherigen Datei zu 99% ähnlich ist. Ja, wir zippen sie alle. Aber es ist überflüssig, diese Redundanz überhaupt zu haben. Alles, was ich wirklich brauche, sind die Unterschiede von der Nacht zuvor ... die sich nur um 1% von der Nacht zuvor unterscheiden ... und so weiter. Also, was ich will, ist, wie man eine Reihe von Unterschieden macht, so dass ich nur diese 1% pro Nacht speichern muss.

Antworten:


11

Zwei Sicherungstools, die Binärdifferenzen speichern können, sind rdiff-backup und duplicity . Beide basieren auf librsync, aber darüber hinaus verhalten sie sich sehr unterschiedlich. Rdiff-backup speichert die neuesten Kopien und Reverse Diffs, während Duplicity traditionelle inkrementelle Diffs speichert. Die beiden Tools bieten auch unterschiedliche Peripheriefunktionen.


1
IIUC, rdiff-backup ist attraktiver, da es einem erlaubt, das Backup normal zu durchsuchen, während duplicity nur eine alte Kopie hat.
Tshepang

11

In letzter Zeit habe ich versucht, Datenbank-Dumps in Git zu speichern. Dies kann unpraktisch werden, wenn Ihre Datenbank-Dumps wirklich groß sind, aber es funktioniert für kleinere Datenbanken (Wordpress-Sites und dergleichen).

Mein Backup-Skript lautet ungefähr:

cd /where/I/keep/backups && \
mysqldump > backup.sql && \
git commit -q -m "db dump `date '+%F-%T'`" backup.sql

Dies speichert nur Unterschiede?
user394

2
Ja. Es ist sehr bequem! Sie können die Datei jederzeit "auschecken", und git kombiniert die Unterschiede automatisch, um die gesamte Datei zu erhalten, wie sie zu diesem Zeitpunkt existierte.
20.

1
Dieser Blog-Beitrag (nicht meiner) befasst sich ausführlicher mit: viget.com/extend/backup-your-database-in-git Die Kommentare befassen sich mehr mit den Vor- und Nachteilen und Vorbehalten. Ich werde auch hinzufügen, dass wenn Sie Git verwenden, Sie mehr als nur in der Lage sind, Versionen zurückzusetzen. Sie können auch Speicherauszüge markieren oder separate Zweige (dev / prod) haben. Die Art und Weise, wie ich es betrachte, ist Git (oder fügen Sie Ihr bevorzugtes modernes Versionskontrollsystem ein), macht einen besseren Job, als ich es könnte, indem ich meine eigene Diff / GZIP-"Lösung" rolle. Eine Warnung zu diesem Artikel: Schieben Sie Ihre Dumps nicht auf Github, es sei denn, Sie möchten, dass sie öffentlich sind (oder für ein privates Repo bezahlen).
Drench

1
Git speichert nicht nur Unterschiede. Tatsächlich wird in erster Linie der vollständige Schnappschuss jeder Revision gespeichert, jedoch mit verschiedenen Optimierungen. Siehe diese ausgezeichnete Antwort und ihre Frage
zittern am

1

Sie könnten so etwas tun (mit a.sqlals wöchentliches Backup).

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

Ihre Diff-Dateien werden zum Ende der Woche größer.

Mein Vorschlag ist allerdings nur gzip ( gzip -9für maximale Komprimierung verwenden). Wir machen das im Moment und das ergibt eine 59MB GZ-Datei, während das Original 639MB hat.


Wir zippen sie bereits :)
user394

-2

(Das habe ich in der Produktion noch nicht gemacht.)

Führen Sie einmal pro Tag oder Woche eine vollständige Sicherung durch. Backup-Relay-Protokolle einmal pro Stunde oder Tag.


Was ist ein Relais-Log?
user394
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.