Ich mache etwas Ähnliches mit rsync
Backups [auf Festplatte] und habe das gleiche Problem festgestellt, weil ein Daemon Dateien aktualisiert, während das Backup ausgeführt wird.
Im Gegensatz zu vielen anderen Programmen weist rsync viele verschiedene Fehlercodes auf [siehe Manpage unten]. Von Interesse sind zwei:
23 - Teilübertragung aufgrund eines Fehlers
24 - Teilübertragung aufgrund verschwundener Quelldateien
Wenn rsync eine Übertragung durchführt und auf eine dieser Situationen stößt, wird es nicht sofort gestoppt. Es überspringt und fährt mit den Dateien fort, die es übertragen kann . Am Ende wird der Rückkehrcode angezeigt.
Wenn Sie also den Fehler 23/24 erhalten, führen Sie einfach den rsync erneut aus. Die nachfolgenden Läufe gehen viel schneller und übertragen normalerweise nur die fehlenden Dateien aus dem vorherigen Lauf. Schließlich erhalten Sie einen sauberen Lauf.
Um atomar zu sein, verwende ich während der Übertragung ein "tmp" -Dir. Wenn dann rsync run sauber ist, benenne ich es [atomar] in um<date>
Ich benutze auch die --link-dest
Option, aber ich benutze sie, um Delta-Backups zu erstellen (z. B. --link-dest=yesterday
täglich).
Obwohl ich es selbst nicht verwendet habe, --partial-dir=DIR
kann es sein, dass die versteckten Dateien das Sicherungsverzeichnis nicht überladen. Stellen Sie sicher, dass sich DIR im selben Dateisystem wie Ihr Sicherungsverzeichnis befindet, damit die Umbenennung atomar ist
Während ich dies in Perl mache, habe ich ein Skript geschrieben, das das, was ich gesagt habe, mit etwas mehr Details / Präzision für Ihre spezielle Situation zusammenfasst. Es ist in tcsh-ähnliche Syntax, [ungetestet und ein wenig rau], aber es als Pseudo-Code behandeln Ihre eigenen zu schreiben bash
, perl
, python
Skript , wie Sie wählen. Beachten Sie, dass es keine Begrenzung für Wiederholungsversuche gibt, aber Sie können dies ganz einfach nach Ihren Wünschen hinzufügen.
#!/bin/tcsh -f
# repo_backup -- backup repos even if they change
#
# use_tmp -- use temporary destination directory
# use_partial -- use partial directory
# use_delta -- make delta backup
# set remote server name ...
set remote_server="..."
# directory on server for backups
set backup_top="/path_to_backup_top"
set backup_backups="$backup_top/backups"
# set your rsync options ...
set rsync_opts=(...)
# keep partial files from cluttering backup
set server_partial=${remote_server}:$backup_top/partial
if ($use_partial) then
set rsync_opts=($rsync_opts --partial-dir=$server_partial)
endif
# do delta backups
if ($use_delta) then
set latest=(`ssh ${remote_server} ls $backup_backups | tail -1`)
# get latest
set delta_dir="$backup_backups/$latest"
if ($#latest > 0) then
set rsync_opts=($rsync_opts --link-dest=${remote_server}:$delta_dir)
endif
endif
while (1)
# get list of everything to backup
# set this to whatever you need
cd /local_top_directory
set transfer_list=(.)
# use whatever format you'd like
set date=`date +%Y%m%d_%H%M%S`
set server_tmp=${remote_server}:$backup_top/tmp
set server_final=${remote_server}:$backup_backups/$date
if ($use_tmp) then
set server_transfer=$server_tmp
else
set server_transfer=$server_final
endif
# do the transfer
rsync $rsync_opts $transfer_list $server_transfer
set code=$status
# run was clean
if ($code == 0) then
# atomically install backup
if ($use_tmp) then
ssh ${remote_server} mv $backup_top/tmp $backup_backups/$date
endif
break
endif
# partial -- some error
if ($code == 23) then
continue
endif
# partial -- some files disappeared
if ($code == 24) then
continue
endif
echo "fatal error ..."
exit(1)
end
'"'
inset backup_backups=$backup_top/backups"
rsync
meine Office-Backups verwaltet (na ja ... seit 2001 (oder 2)) und ich schaue mir immer die verschiedenen Arten an, wie Leute mit ihren umgehen. Ich mag das.set backup_backups="$backup_top/backups/<host_to_backup>"
. Das Skript wird auf diesem Host ausgeführt. Zuersttune2fs -l
wird "Dateisystemstatus" verwendet, um festzustellen, ob der FS Fehler aufweist (dh benötigtfsck
), und die Ausführung wird abgelehnt, wenn dies der Fall ist . Der Name jedes Sicherungslaufwerks ist eine Farbe (z. B. Kupfer, Indigo usw.). Ich feuere auf jedem System einen Launcher an und sie stellen eine Zeit ein (z. B. 10:09 -> 10:15), damit sie alle genau zur gleichen Zeit feuern (gibt dem Besitzer Zeit, mit Mittag wieder einzusteigen). Auf diese Weise hat jedes System genau den gleichen Zeitstempel für die SicherungIch bin mir nicht sicher, ob dir das helfen wird, aber ...
Wenn es Ihnen nichts ausmacht, jedes Mal den gesamten Datensatz zu kopieren, und wenn Sie Symlinks verwenden können, um auf das Zielverzeichnis zu verweisen, sollten Sie in der Lage sein, alles in ein temporäres Verzeichnis zu synchronisieren und dann das alte und das neue auszutauschen ( umzubenennen () ) Symlinks atomar, wie folgt:
was läuft
rename("new", "current")
= 0und gibt
Selbst damit dies funktioniert, sollten Clients, die versuchen, aus diesem Setup zu lesen,
cd
in das Verzeichnis, auf das der Symlink verweist, bevor sie Lesevorgänge ausführen. Andernfalls besteht die Gefahr, dass einige Teile des Codes / der Daten aus der alten und einige aus der neuen Kopie geladen werden.quelle
Sind die Spiegelsynchronisierungen automatisch (eine Cron- Aufgabe oder ähnliches)? Wenn ja, verwenden Sie wahrscheinlich einen dedizierten Betriebssystembenutzer, habe ich Recht? Die Lösung könnte also sein, anstatt einfach zu kopieren:
Der Nachteil ist, dass während des Synchronisierungsvorgangs (nicht sicher, wie lange es dauert) auf das Zielverzeichnis nicht zugegriffen werden kann. Sie müssen selbst entscheiden, ob es hier in Ordnung ist.
quelle