robocopyで世代管理しながら差分、増分バックアップをする方法
以前の記事で、robocopyによるミラーリングバックアップと世代管理バックアップについては紹介しましたので、今回は差分、増分バックアップについてです。
ちなみに差分バックアップと増分バックアップって混同して使用されがちな言葉ですが、明確に意味が違います。
差分バックアップとは
完全バックアップ(フルバックアップ)から変更・追加されたファイルのみバックアップすることを差分バックアップと言います。
何日経とうとも、完全バックアップを取った日以降に変更されたファイルは毎回バックアップするということです。
メリットとしては、復元時には完全バックアップと当日の差分ファイルだけ戻せば良いので復元がらくちんという点。
デメリットとしては、完全バックアップを取った日以降に更新されたファイルは毎日コピーされることになるので、次の完全バックアップの期間が空けば空くほどディスク容量を食うという点。
差分バックアップの具体例を挙げるとこんな感じ。
c:\backup\20190501_full | 5月1日に取った完全バックアップ |
c:\backup\20190502 | 5月2日に変更・追加されたファイル |
c:\backup\20190503 | 5月2日と3日に変更・追加されたファイル |
c:\backup\20190504 | 5月2日と3日と4日に変更・追加されたファイル |
c:\backup\20190505_full | 5月5日に取った完全バックアップ |
c:\backup\20190506 | 5月6日に変更・追加されたファイル |
なんとなくイメージして頂けたでしょうか。
増分バックアップとは
前回のバックアップから変更・追加されたファイルのみバックアップすることを増分バックアップと言います。
完全バックアップからの差分ではなく、「前回」というのがポイント。 こちらはとっとと具体例を挙げちゃいましょう。c:\backup\20190501_full | 5月1日に取った完全バックアップ |
c:\backup\20190502 | 5月2日に変更・追加されたファイル |
c:\backup\20190503 | 5月3日に変更・追加されたファイル |
c:\backup\20190504 | 5月4日に変更・追加されたファイル |
c:\backup\20190505_full | 5月5日に取った完全バックアップ |
c:\backup\20190506 | 5月6日に変更・追加されたファイル |
とまぁこんな感じになります。
増分バックアップをする日は前回バックアップ時点から変更・追加されたファイルなので、もっとも少ない容量のバックアップで済みます。
しかし、仮に上記の例でいくと、5月4日の時点で障害が発生し、元に戻したい!となった場合、5月1日、2日、3日、4日すべてのバックアップを合算して戻さなければなりません。
先述の差分バックアップでは5月1日と4日のバックアップだけで良かったのですが、増分ではその日その日の更新分しか持っていないので当然ですね。
この大容量HDD時代にそんなに容量ケチケチしなくても…と思われるかもですが、1日のバックアップ量が少なければ少ないほど、それだけ長い日数分のバックアップを持っておくことが出来ます。
毎日完全バックアップしていては30日分の世代管理するだけでも容量30倍ですからね…。
IT系ではない普通の会社のファイルサーバーでも、夜間のバックアップに時間がかかりすぎて、朝9時全社員が出社する時間になっても終わらず、各部署から「ファイルサーバーが遅いんだけど」という苦情がヘルプデスクに寄せられる、なんて事例もよく聞く話です。
個人レベルならそこまで気にすることはないかもですが、知識として知っておいて損はないでしょう。
尚、以前の記事でも書きましたが、ぼくの場合は土曜日にフルバックアップ、日~金曜日は増分バックアップ、という運用をしています。
ミラーリングじゃいけないの?
「Windowsのバックアップはrobocopyが簡単便利で早い」で紹介した /MIR オプションによるバックアップだけでも、毎日更新した分だけコピーしてくれるため、十分に思えます。
しかし、「robocopyとバッチファイルで世代管理バックアップをする方法」で話したようにバックアップは世代管理を行わないと数日経ってから気がついたミスに対応できないわけです。
うわー、あのファイル上書きしちゃったわー。たしか先週は無事だったハズだけど…。なんてケースですね。こういうときに世代管理をしていると超助かる。
しかし、毎日全部のファイルをコピーしていたのではHDDの容量が足りない。そこで考えられたのが前述の差分、増分バックアップというわけです。
差分、増分バックアップではアーカイブ属性を使う
robocopyに限らない話ですが、差分、増分バックアップ&世代管理をするためにはアーカイブ属性を使います。MS-DOSの頃からあるOSの基本的な機能です。
これはエクスプローラーでWord文書のプロパティを開いた画面ですが、この[詳細設定]をクリックするとアーカイブ属性が確認できます。
(コマンドラインでattribコマンドを使ってもOK)
ファイル属性の[ファイルをアーカイブ可能にする]という欄にチェックが付いていますよね。これがアーカイブ属性ONの意味。
新しいファイルが作られたとき、あるいは更新されたとき、このアーカイブ属性は必ずONになります。
そしてこのアーカイブ属性をOFFにするのは基本的にバックアップ系のソフトのみ。
ファイルが更新されたかどうかを区別するためにファイルの内容をチェックしたり、更新日付を見たり、前回バックアップ日時を保存しておいたり、などという面倒くさいことはしたくない、と考えたエライ人がいたのでしょうね。
- 新しく作ったファイルや更新されたファイルには必ずアーカイブ属性がつく。
- バックアップソフトはバックアップが完了したファイルのアーカイブ属性をリセットする。
このルールに従えば差分、増分バックアップが簡単じゃないか、というわけです。
かしこい人はいるもんだ。
robocopyで差分バックアップをする
話をシンプルにするために、c:\test にあるファイル群を c:\backup\[年月日]\ にバックアップする、という前提で進めます。
これらのファイルは全て新規ファイルなのでアーカイブ属性がセットされた状態です。
完全バックアップのコマンド
■完全バックアップ&世代管理の例
robocopy c:\test c:\backup\%DATE:/=%\ /MIR
以前解説したとおり、%DATE:/=%には現在日付(例:20190517)が入るため、c:\backup\20190517\ に完全バックアップを実行する、という意味になります。
また、/MIR でアーカイブ属性もOFFになったら楽だったのですが、そういう仕様ではないようなので、別のコマンドでアーカイブ属性をリセットします。
■attribコマンドでアーカイブ属性をリセット
attrib -A c:\test\* /S
以上の2つのコマンドをバッチファイルにでも書き、毎週土曜日とか決まった日に実行するようにタスク スケジューラに組み込みます。
(タスクスケジューラで毎週タスクを作れば曜日指定ができます)
差分バックアップのコマンド
次に毎日実行する差分バックアップのコマンドですが、これは単にアーカイブ属性がONになったファイルをコピーするだけで良いので、下記のとおりです。
■差分バックアップ例
robocopy c:\test c:\backup\%DATE:/=%\ /MIR /A
これで更新、または追加されたファイルやフォルダだけコピーされます。
このコマンドもまたタスク スケジューラに追加し、日曜日~月曜日だけ起動するような設定にすれば差分バックアップの完成。
robocopyで増分バックアップをする
増分バックアップも差分バックアップとほとんど同じです。
完全バックアップ部分については同じなので省略するとして、日曜日~月曜日に実行する増分バックアップの部分はこんな感じ。
■増分バックアップ例
robocopy c:\test c:\backup\%DATE:/=%\ /MIR /M
………………うん。/A を /Mにしただけ。
robocopyに/Mを付けると「アーカイブ属性が付いたファイルをコピーし、元ファイルのアーカイブ属性をリセット(OFF)する」という動きをします。
つまり、完全バックアップした後は毎日 /M でコピーしておけばその日に更新・追加されたファイルのみコピーできるというわけ。とっても簡単だし、早いのでうちではこの増分バックアップを基本にしています。
まとめ
- 差分バックアップと増分バックアップにはそれぞれメリットとデメリットがあるため、理解した上で使い分けよう。
- robocopyの/MIRオプションではアーカイブ属性がリセットされないため、attribコマンドを活用しよう。
- robocopyの差分バックアップでは /A オプションを使う。
- robocopyの増分バックアップでは /M オプションを使う。
といった感じですかね。
文章にするとややこしいですが、簡潔にコマンドにするなら、この1行だけです。
robocopy [バックアップ元] [バックアップ先]\%DATE:/=%\ /MIR /M
差分、増分バックアップを使いこなせばバックアップの世代管理をしつつ、ディスク容量も抑えられるため、積極的に活用したいものです。