先日、以下の記事を見つけ、結構衝撃を受けました。
Robocopyで差分・増分バックアップがこんなに簡単にできるとは知りませんでした。ファイルの属性の一つにアーカイブ属性というものがあり、更新されたファイルをマークしておくための属性なのですが、Robocopyはこのアーカイブ属性をうまく利用して差分・増分バックアップができるようになっています!アーカイブ属性の存在は知っていたものの、その使い方はよく知らなかったです。
さらにこの記事では、コピー先フォルダに日時を付けるシェルコマンドの作り方についても書かれており、これを利用すると、差分・増分バックアップをバックアップ実行ごとに日時を付けたフォルダに保存していくことが可能になります。
これはもうRoboSyncでできなきゃだめでしょ、というわけで、RoboSyncの機能追加を行ってしまいました。コマンド実行前後に実行するスクリプトを設定できるようにしてます。バージョン1.2です。
ここでは、RoboSyncを用いた、一般的な差分、増分バックアップの設定方法についてご紹介します。
差分バックアップと増分バックアップはよく似ているのですが厳密には違うそうです。以下の表で分かるように、差分バックアップは直前のフルバックアップからの差分をバックアップするのに対して、増分バックアップは直前のフルバックアップまたは増分バックアップ後の差分をバックアップします。
バックアップ日 | 差分バックアップの例 | 増分バックアップの例 |
---|---|---|
Day 1 | フルバックアップ | フルバックアップ |
Day 2 | 差分バックアップ(Day 1からの差分) | 増分バックアップ(Day 1からの差分) |
Day 3 | 差分バックアップ(Day 1からの差分) | 増分バックアップ(Day 2からの差分) |
Day 4 | 差分バックアップ(Day 1からの差分) | 増分バックアップ(Day 3からの差分) |
フルバックアップ、差分、増分バックアップを比較すると、毎回のバックアップにかかる時間と容量は増分バックアップが最も少ないのですが、リストアの際の手間は増分バックアップが一番がかかることになります。どれを選ぶかは目的によって選ぶ必要があります。
アーカイブ属性を利用した差分バックアップは以下の表のように行われます。アーカイブ属性は、ファイルを新規に作成した場合や、更新を行った場合に自動的にセットされるので、フルバックアップを行った時点で全てのファイルのアーカイブ属性をクリアしておくことで、その後に作成・更新されたファイルのみをバックアップすることができるようになります。
バックアップ日 | 差分バックアップの例 | アーカイブ属性とバックアップ操作 |
---|---|---|
Day 1 | フルバックアップ | フルバックアップ後、全ファイルのアーカイブ属性をクリアする。 |
Day 2 | 差分バックアップ (Day 1からの差分) |
アーカイブ属性を持つファイルのみをバックアップする。 |
Day 3 | 差分バックアップ (Day 1からの差分) |
アーカイブ属性を持つファイルのみをバックアップする。 |
Day 4 | 差分バックアップ (Day 1からの差分) |
アーカイブ属性を持つファイルのみをバックアップする。 |
Robocopyで差分バックアップを行う場合、使用するコマンドの例としては以下のようになります。
バックアップ種別 | Robocopyコマンド例 |
---|---|
フルバックアップ時 |
robocopy D:\source E:\destination /E attrib -a D:\source\*.* /s |
差分バックアップ時 |
robocopy D:\source E:\destination /S /A |
フルバックアップ時はRobocopy実行後、アーカイブ属性をクリアするため、attribコマンドを実行します。
差分バックアップ時は、/A オプションを使います。/A オプションはアーカイブ属性を持つファイルのみをコピーするオプションです(コピー後もコピー元のファイルのアーカイブ属性はそのまま維持されます)。
なお、/E は配下のサブディレクトリも全てコピーするオプションです。また、/S は /Eと同じくサブディレクトリも全てコピーするオプションですが空のサブディレクトリはコピーしません。/E, /Sオプションなどについては、バックアップの目的に応じて適切なオプションに置き換えてください。
一方、増分バックアップの場合は、以下のようにバックアップが行われます。増分バックアップを行うごとにアーカイブ属性をクリアすることで、前回の増分バックアップ以降に作成・更新されたファイルのみを対象にすることができます。
バックアップ日 | 増分バックアップの例 | アーカイブ属性とバックアップ操作 |
---|---|---|
Day 1 | フルバックアップ | フルバックアップ後、全ファイルのアーカイブ属性をクリアする。 |
Day 2 | 増分バックアップ (Day 1からの差分) |
アーカイブ属性を持つファイルのみをバックアップし、バックアップしたファイルのアーカイブ属性をクリアする。 |
Day 3 | 増分バックアップ (Day 2からの差分) |
アーカイブ属性を持つファイルのみをバックアップし、バックアップしたファイルのアーカイブ属性をクリアする。 |
Day 4 | 増分バックアップ (Day 3からの差分) |
アーカイブ属性を持つファイルのみをバックアップし、バックアップしたファイルのアーカイブ属性をクリアする。 |
Robocopyで増分バックアップを行う場合、使用するコマンド例は以下のようになります。
バックアップ種別 | Robocopyコマンド例 |
---|---|
フルバックアップ時 |
robocopy D:\source E:\destination /E attrib -a D:\source\*.* /s |
増分バックアップ時 |
robocopy D:\source E:\destination /S /M |
フルバックアップ時のコマンドは差分の時と同じですが、増分バックアップ時のコマンドは、/Aの代わりに /M オプションを使います。/M オプションは /A と同じようにアーカイブ属性を持つファイルのみをコピーしますが、コピー後、コピー元のファイルのアーカイブ属性をクリアします。
さて、差分・増分バックアップの取り方はわかりましたが、それだけでは十分ではありません。上記のコマンド例ではコピー先が常に同じフォルダになってしまうので、毎回同じフォルダに上書きされてしまいます。そうならないように、コピーを行うごとに異なるフォルダを指定しなければなりません。ここでは、シェルコマンド、環境変数を用いて、コピー先フォルダ名に日時を付加することで、コピーのたびに異なるフォルダにコピーできるようにします。
コピー先フォルダ名に日時を付けるためには、シェルコマンドや環境変数の仕組みなどを理解する必要があるのですが、その詳細は別記事を参照していただくとして、結論として、以下のようなコマンドを実行すれば、年月日時分秒の14桁の文字列をDATETIMEという環境変数に設定することができます。
set TT=%time: =0% set DATETIME=%date:/=%%TT:~0,2%%TT:~3,2%%TT:~6,2%
ファイル名、フォルダ名に日時を付ける方法については、より詳細が以下の記事に書かれていますので、参照してみてください。
上記内容をもとに、差分バックアップのRoboSync設定例を以下に説明します。 ここでは、N:\My Data 配下のデータを Z:\backup\My Data 配下にバックアップする条件でサンプルを作っています。
訳あって、ここではまず、増分バックアップの設定方法を説明します。
上記内容をもとに、増分バックアップのRoboSync設定例を以下に説明します。 ここでは、N:\My Data 配下のデータを Z:\backup\My Data 配下にバックアップする条件でサンプルを作っています。
まず、全体の設定ですが、以下のRoboSyncメイン画面の通り、コピー項目として、フルバックアップ、増分バックアップの2つを作成します。また、今後のために、フル、増分それぞれ用のスクリプトも定義しておきます。
以下は、フルバックアップのコピー項目設定です。
実行前スクリプト欄に、DATETIME環境変数を設定する2行のスクリプトを「実行前スクリプト」の欄に設定します。
また、実行後スクリプト欄には、コピー元フォルダ配下の全ファイルのアーカイブ属性をクリアするattribコマンドを設定します。(attrib -a "N:\My Data\*.*" /s)
コピー先フォルダ設定欄には、%DATETIME%という環境変数を使ってファイル名を設定します。フルバックアップであることがわかるように -full を付けておきます。環境変数を使っていると、画面を終了する時に確認画面が出ますが、強制保存してください。
最後に、コピー項目名、コピー元フォルダ、オプションにも設定しておきます。オプション欄にある "/DCOPY:DAT" はディレクトリのタイムスタンプも保存する設定です。
以下の画面は、増分バックアップのコピー項目設定です。こちらもコピー先フォルダ名に%DATETIME%を付けますが、増分であることがわかるように -inc を付けておくことにします。
これで設定は完了です。
早速、フルバックアップを実行してみます。
次に、増分バックアップが取れるかどうか試してみますので、N:\My Data 配下のどれか適当なファイルを編集保存してください。その後、増分バックアップを実行してみます。
バックアップ先を見てみると、フル、差分それぞれちゃんと取れています。
フォルダの中を見ていただくと -inc フォルダには修正したファイルのみ保存されているのが分かると思います。ちなみに上記の *-full、*-incフォルダのタイムスタンプは、N:\My Data のタイムスタンプになっています。
さらに、再度、どれかファイルを編集し増分を実行すると、そのファイルだけバックアップがとれていると思います。
差分バックアップの設定方法も、増分バックアップ設定方法と全く同じです。増分バックアップのRobocopyオプションの /M を /A に置き換えるだけです。こんな感じです。
差分バックアップの場合は、フルバックアップ以降に更新したファイルが毎回バックアップされていると思います。
これで、Robocopyによる差分・増分バックアップが一応可能になりました。いかがでしょうか。
ただ、実際の運用を考えるとまだ考慮しなければならないことがあります。このまま毎日バックアップを取っていると際限なくバックアップ容量が増加していってしまいますので、どこかで、古いバックアップは削除するということをしなくてはなりません。その方法については、ちょっと説明が長くなりそうなので別の記事にて紹介したいと思います。
(2020/1/20追記) RoboSyncを使った増分バックアップの設定例を以下の記事にしてみました。ご参照いただければと思います。
RoboSync: RobocopyのためのGUIツール
本サイトで公開しているツールです。ダウンロードはこのバナーをクリック!
Version 1.3.27 をリリースしました! (2021/1/1)
RobocopyをGUIから実行できるようにするツールです。コマンドプロンプトを表示することなく、GUI画面からほぼマウス操作だけで実行までできます。
Robocopyがバックグラウンドでそのまま実行されますので設定に迷うことはありません。
・ 複数のコピー項目の作成と管理。
・ スクリプトファイル(バッチファイル)出力が可能。スケジューラによるバックグラウンド処理にも使えます。
・ Robocopyによるコピー実行前に、実行プレビュー(/L)、パラメータのチェック(/QUIT)が可能。
・ Robocopyのパラメータ設定の簡易チェック、Robocopy実行前の簡易チェックを行います。
・ Robocopy実行前後で実行するスクリプトを定義可能。
・ Robocopy実行途中での中断、実行ログの履歴管理と保存が可能。
【関連記事・関連コンテンツ】