n-Archives.net

RoboSync設定事例:増分バックアップ(直近20回,14日以内保存)

目次

シナリオ

Robocopyを用いて、差分バックアップ、増分バックアップを行う方法について、記事「RoboSyncを使って差分・増分バックアップを設定してみる」で紹介しました。今回は、RoboSyncを用いた実践的な増分バックアップの設定をしてみます。以下のようなシナリオを想定してRoboSyncでの設定方法について作ってみました。

 バックアップシナリオ

  • スクリプト実行により増分バックアップを実行。
  • 毎回個別フォルダにバックアップを取得。
  • 1時間毎の自動起動、および、手動による起動を想定。
  • 直近20回、または、14日以内のバックアップは保存する。それ以外のものは削除する。

 

RoboSync設定方法

上記シナリオを実現する増分バックアップ設定例は以下になります。

実行前スクリプト

cd /d Z:\backup\My Data
set TT=%time: =0%
set dest=%date:/=%%TT:~0,2%%TT:~3,2%%TT:~6,2%-inc

実行前スクリプトでは、カレントディレクトリを変更し、コピー先フォルダ名を作成します。コピー先フォルダ名は、"20200112192030-inc" のフォーマットになります。

 

実行後スクリプト

if %errorlevel% ==  0  rmdir /s /q %dest%
powershell -command "dir *-inc | sort -Descending | select -skip 20 | ? { $_.LastWriteTime -lt (Get-Date).AddDays( -14 ) } | del -recurse"

まず、増分バックアップの場合、変更されたファイルが1つもなければ、コピー先フォルダは空のフォルダになるので、残しておく必要がありません。その場合には、コピー先フォルダを削除してしまいます。%errorlevel% は直前に実行したrobocopy の戻り値を参照しています。robocopyの戻り値が 0 というのは、「コピーしたファイルが一つもなかった」ことを示しています。その場合、コピー先フォルダを削除(rmdir)しています。

robocopyの戻り値については、以下記事をご覧ください。

 

次に、2行目の powershellコマンドですが、以下のような流れで処理が行われます。

  1. *-inc というフォルダを取得
  2. ファイル名を降順(新しい順)に並べ替える
  3. 最初の20個についてはスキップし、21個目以降のリストにする
  4. それぞれのフォルダの更新時刻を確認し14日以上前のファイルだけを抽出
  5. 抽出されたフォルダを削除

となります。つまり、「直近20回、または、14日以内のバックアップは保存する。それ以外のものは削除する」となります。

バックアップするフォルダの中に、読み取り専用ファイルや隠しファイルが存在する場合、強制的に削除できるよう、del コマンドに -force オプションを追記し、del -recurse -force のようにしてください。

また、細かい注意ですが、dir のファイル指定の個所は dir * のようにせず、dir *-inc のように明示的にフォルダの一部文字列を指定することをお勧めします。万一の事故で、関係ないファイルやフォルダまで削除してしまうことを防止するためです。

 

いかがでしょうか。是非やってみてください。

 

改版履歴

(2020/2/9) 実行後スクリプトのpowershellでフォルダを削除する箇所において、読み取り専用ファイルや隠しファイルが存在した場合、delコマンドに -force オプションを追記するコメントなどを追加。

 



Related Articles

 

この記事へのコメント

管理者   2023-05-27 09:16:44
> 履歴上限に抵触した削除対象の増分をフルバックアップへマージしていければQNAPのRTRRの様な挙動が可能なのですが、やはりここは色々と頭を捻らないといけなさそうですね。ありがとうございました。

RTRRというものをよく知らないのですが、オリジナルのfullバックアップ+一定期間差分、を取っておく方式ですかね。
そうですよね、それができると面白いですね。
で、それをやろうとするのであれば、例えば、

00000000-full/ ← オリジナルフルバックアップ(フォルダ名固定)

20230501-inc/ ← 増分バックアップ
20230502-inc/ ← 増分バックアップ
20230503-full/ ← 時々フルバックアップ?
20230504-inc/ ← 増分バックアップ
20230505-inc/ ← 増分バックアップ

という環境を作って、
・上限日数を超えたバックアップ(-inc,-full両方)は「古いものから順に」オリジナルフルバックアップに単純に上書きする
・バックアップがfullバックアップの場合はフォルダごとオリジナルフルバックアップに置き換えでもOK
というロジックで何となく実現できそうではあります…

が、実は上記では十分ではなく、「削除したファイル・フォルダ」が増分バックアップだけでは再現できません。
ファイルの削除があまりないデータであれば、これでも問題はないと思いますが、
削除ファイル・フォルダもある程度記録していこうとすると、やはり時々fullバックアップを取る必要が残りますね。

もっと突き詰めようとすれば、「削除されたファイルを記録するフォルダ」を作成し、例えば、

00000000-original/ ← オリジナルフルバックアップ(フォルダ名固定)

20230501-inc/ ← 増分バックアップ
20230501-del/ ← 削除ファイル・フォルダ情報
20230502-inc/ ← 増分バックアップ
20230502-del/ ← 削除ファイル・フォルダ情報
20230503-full/ ← 時々フルバックアップ?
20230504-inc/ ← 増分バックアップ
20230504-del/ ← 削除ファイル・フォルダ情報
20230505-inc/ ← 増分バックアップ
20230505-del/ ← 削除ファイル・フォルダ情報

みたいにして… というアイデアは浮かびます。
すみません、この、「削除ファイルの記録」、や、「削除情報のオリジナルフルバックアップへの反映」をどのように実現するか、は今はノーアイデアですが…

とりあえずここまで、書き散らかしたままですみません。
#どなたか、こうすればできたよというのがあれば、私も教えてほしいです!!^^

22TB   2023-05-27 08:42:59
早速のリプライありがとうございました。確かに先の記事でfullとincで分けておられましたね。すみません。見落としてました。
履歴上限に抵触した削除対象の増分をフルバックアップへマージしていければQNAPのRTRRの様な挙動が可能なのですが、やはりここは色々と頭を捻らないといけなさそうですね。ありがとうございました。

管理者   2023-05-26 23:35:31
22TBさんこんにちは。この記事で作った例ですと、増分のバックアップは 20230526-inc のように、-inc のついたフォルダに保存するようになっています。これを、フルバックアップの場合は 20230526-full のように -full のついたフォルダに保存するようにし、種別を区別できるようにするとよいかと思います。

実行後スクリプトの powershell のコマンドのところで、dir *-inc と指定しているため、-full は削除の対象外となります。お試しいただければと思います。

22TB   2023-05-26 23:29:08
こんにちは。
こちらのRoboSync(copy)の使用法ですと、フルバックアップでも14日20履歴外になると消してしまうと思うのですが、フルバックアップは避けて増分のみ対象にする様な手法は無いのでしょうか。

管理者   2022-10-08 12:27:35
じんべるさん、RoboSync使っていただいておりありがとうございます。

まず意図しない動作になっている直接の原因ですが、
%errorlevel%変数が、robocopyの戻り値ではなく、
attribコマンドの戻り値を参照してしまっていることが原因です。
%errorlevel%は「直前に実行したコマンドの戻り値」を参照する変数ですので、
最後に実行したattribコマンドの戻り値(0)を参照してしまいます。

attribコマンド実行が必要なければ、attribコマンドを実行しないようにしておくのが一番いいのですが、
もし、attribコマンドを実行する必要がある場合、attribコマンドを直接「実行後スクリプト」に
適切に記述する必要があります。
オプション設定で「コピー元がルートフォルダで…"attrib -s -h" を実行する。」のチェックがオンになっていると、
robocopyの戻り値をerrorlevelで参照できませんので、オフにしてください。

スクリプト修正例としては以下が考えられます。

【スクリプト例①】
----
set robocopy_exitcode=%errorlevel%
attrib -s -h 20221005170513-inc
if %robocopy_exitcode% == 0 rmdir /s /q 20221005170513-inc
----
robocopy実行直後に、%errorlevel%を robocopy_exitcodeという変数に退避しておき、必要なときにその変数を参照します。

【スクリプト例②】
----
if %errorlevel% == 0 (
rmdir /s /q 20221005170513-inc
) else (
attrib -s -h 20221005170513-inc
)
----
if文を最初に記述し、attribコマンドをelse内に記述します。
elseや()の前後に空白文字を入れるのを忘れないでください。

じんべる   2022-10-08 10:18:11
いつも楽しく拝見しています。

質問です。

実際にはコピーされたファイルがあるのに Robocopyの戻り値でが返り、フォルダが削除されますが原因が判りません。

アドバイスお願いできますでしょうか。

よろしくお願いします。

合計 コピー済み スキップ 不一致 失敗 Extras
ディレクトリ: 116 116 0 0 0 0
ファイル: 1726 1 1725 0 0 0
バイト: 837.84 m 2.8 k 837.84 m 0 0 0
時刻: 0:00:00 0:00:00 0:00:00 0:00:00
終了: 2022年10月5日 17:05:13


D:\FAX受信のバックアップ>attrib -s -h "D:\FAX受信のバックアップ\20221005170513-inc"

D:\FAX受信のバックアップ>echo 0
0

D:\FAX受信のバックアップ>if 0 == 0 rmdir /s /q 20221005170513-inc

コメントをお送りください
お名前:
コメント:
コメントの公開:



管理者より個人的に返信をご希望の方は、コメント中に必ずメールアドレスを記載してください。記載がないと返信できませんのでご注意ください。

If you want personal response from the author, please do not forget to write your email address in the comment. Otherwise, the author can not reply.

投稿されたコメントは手動で処理されるため、記事として登録されるまで1日程度かかります。

Submitted comments will be processed manually. So, please understand it will take about a day to publish your comment.