Ich werde Ihnen genau sagen, was ich brauche, um die kryptische Frage im Titel zu klären. Ich mache derzeit geplante MySQL-Backups aller meiner Datenbanken mit etwas wie:
mysqldump ... | gzip -c > mysql-backup.gz
Dies ist in Ordnung, aber ich bin bereit, für jede einzelne Datenbank eine separate Datei zu erstellen, da dies das Betrachten von Speicherauszügen oder das Wiederherstellen einer einzelnen Datenbank erleichtert:
for db in $dbs; do mysqldump ... $db | gzip -c > mysql-backup-$db.gz; done
Ich möchte alle Speicherauszüge für jedes einzelne Backup in einer einzigen .tar
Datei speichern, dh mysql-backup.tar.gz
mit allen darin enthaltenen Speicherauszugsdatenbanken . Ich weiß, dass ich .sql
Dateien einfach unkomprimiert lassen kann und dann tar -cz *.sql
, aber 1) ich suche nach einer Möglichkeit, große Dateien nicht vorübergehend zu speichern . In meinem aktuellen Skript wird tatsächlich mysqldump
in weitergeleitet gzip
, sodass keine große Datei erstellt wird.
2) Gibt es eine ähnliche Art und Weise, wie ich .tar.gz
aus stdin erstellen kann ?
3) tar -c *.sql.gz
Entspricht tar -cz *.sql
?
quelle
tar -c *.sql.gz
äquivalent zutar -cz *.sql
? - Nein, letzteres ist etwas effizienter, aber das macht für viele kleine Dateien einen größeren Unterschied als für einige wenige große Dateien.Antworten:
Ich habe Python zusammengeschustert, um zu tun, was du willst. Es verwendet die Tarfile- Bibliothek von Python , um stdin an eine tar-Datei anzuhängen, und sucht dann einfach im tar zurück, um den Header mit der richtigen Größe bei eof neu zu schreiben. Die Verwendung wäre:
Hier ist das
tarappend
Python-Skript:quelle
Nicht einfach.
tar
Zeichnet nicht nur Dateiinhalte auf, sondern auch Dateimetadaten (Name, Zeitstempel, Berechtigungen, Eigentümer usw.). Diese Informationen müssen von irgendwoher kommen und werden nicht in einer Pipe vorhanden sein.Sie können Ihre Datenbank-Dumps in eine Datei gzipen (wahrscheinlich nach der betreffenden Datenbank benannt), die Datei an ein Tar-Archiv anhängen und die Datei dann löschen, bevor Sie mit der nächsten Datenbank fortfahren. Dies würde zu einer .gz.tar-Datei führen, die ungewöhnlich, aber keineswegs problematisch ist und wahrscheinlich nicht wesentlich mehr Festplatte verwendet als das Zippen eines gesamten Datenbankspeicherauszugs (sie wird etwas weniger effizient komprimiert, da dies nicht möglich ist über Datenbankgrenzen hinweg teilen).
quelle
Nein, und ich vermisse diese Funktion so sehr: meine Frage zu Ask Ubuntu .
Wenn es sich bei der zu archivierenden Datei um eine Rohdatei handelt, der keine Dateisystem-Metadaten zugeordnet
tar
sind, ist weder ein Dateiname noch ein Pfad erforderlich, um den internen Verzeichnis- / Dateibaum zu erstellen (gelinde gesagt).Ich denke, dass etwas in Perl getan werden kann, das eine Bibliothek hat, die sich der Komprimierung / Dekomprimierung / Archivierung von Dateien widmet: Sehen Sie, ob Sie diese Antwort optimal nutzen können: eine verwandte Antwort auf Ask Ubuntu .
quelle
Sie könnten den verspäteten Teer-Postprozessor verwenden.
Sie können jedoch die Verwendung
tar
anderer Methoden zur Archivierung Ihrer Daten in Frage stellen und in Betracht ziehen. Betrachten Sie insbesondere rsync und afioBeachten Sie, dass
mysqldump
die--export-all
Option verstanden wird (siehe hier ). Sie können das in ein Skript einfügen, das die Grenzen usw. versteht.quelle
Hier ist, was ich getan habe, eine tmp-Datei zu erstellen (und sie anschließend zu löschen)
quelle