バックアップを取っている状態と、そこから戻せる状態は同じではない。
コピー先が途中で止まっていた、対象から外れていたフォルダーがあった、戻したファイルが壊れていた、といった食い違いは、実際に戻すまで表に出ない。
ここでは、いま使っているバックアップが戻せるかどうかを、元のデータに触れずに確かめる手順を整理する。
コマンドはWindows 11のPowerShellで実行して確認している。
復元テストで確かめるのは3つ
戻せるかどうかは、次の3点に分かれる。
| 確かめること | 分からないと起きること | 見る方法 |
|---|---|---|
| 取れているか | 対象から外れたフォルダーが丸ごと無い | ファイル数を数えて比べる |
| 戻せるか | 戻す操作そのものが失敗する | 別の場所へ実際に戻す |
| 中身が同じか | 戻ったが開けない、途中で切れている | ハッシュで突き合わせる |
ファイル数だけを比べると、中身が壊れていても気づけない。
逆にハッシュだけを見ると、そもそも対象から外れていたフォルダーには気づけない。
元のデータを上書きしない場所へ戻す
復元テストで最も避けたいのは、テストそのものが元のデータを壊すことである。
戻す先は、元のフォルダーではなく、空のフォルダーを新しく作って指定する。
元の場所へ戻す操作は、テストではなく本番の復旧であり、試す目的で実行しない。
- 戻す先に、空のフォルダーを1つ作る
- 元のフォルダーと、戻した先の両方を残したまま比べる
- 比べ終わるまで、戻した先を消さない
手順1 戻す(robocopyの終了コードを見る)
バックアップ先から、テスト用のフォルダーへコピーする。
robocopy "バックアップ先のパス" "テスト用の空フォルダー" /E /NFL /NDL /NJH /NProbocopyは終了コードで結果を返すため、画面の見た目ではなくコードを見る。
$LASTEXITCODE| 終了コード | 意味 | 扱い |
|---|---|---|
| 0 | コピーするものが無かった | 対象の指定が合っているかを見る |
| 1 | ファイルをコピーした | 成功。次の手順へ |
| 2 | コピー先にだけ余分なものがある | 内容を確かめる |
| 3 | コピーした、かつ余分なものもある | 内容を確かめる |
| 8以上 | コピーできなかったものがある | 失敗として扱う |
手元で3ファイルをコピーしたときの終了コードは1だった。
0が返る場合はコピーが行われておらず、パスの指定が違っている可能性がある。
8以上が返ったときは、その時点で失敗として扱い、次の手順へ進まない。
手順2 中身が同じかをハッシュで突き合わせる
ファイル数が合っていても、中身が同じとは限らない。
元と戻した先の両方でハッシュを取り、突き合わせる。
function Get-Rel($root) {
Get-ChildItem $root -Recurse -File | Get-FileHash -Algorithm SHA256 |
Select-Object @{n='rel';e={$_.Path.Substring($root.Length)}},Hash
}
$a = Get-Rel "元のフォルダー"
$b = Get-Rel "戻した先のフォルダー"
Compare-Object $a $b -Property rel,Hash | Select-Object SideIndicator,relパスの先頭を切り落としているのは、置き場所が違っても同じファイルとして比べるためである。
何も出力されなければ、ファイルの並びも中身も一致している。
手元では3ファイルをコピーした直後に実行し、出力は空だった。
壊れていたときの出方
戻した側の1ファイルだけを書き換えてから、同じコマンドを実行した。
SideIndicator rel
------------- ---
=> \b.txt
<= \b.txt同じ相対パスが2行出て、矢印の向きが分かれる。
これは「両方に存在するが、ハッシュが違う」という意味になる。
| 出方 | 意味 |
|---|---|
| 同じrelが2行、矢印が両方向 | 両方にあるが中身が違う |
| 矢印が元の側だけ | 戻した先にそのファイルが無い |
| 矢印が戻した先だけ | 元に無いファイルが戻した先にある |
ファイル履歴やイメージを使っている場合
Windowsの標準機能を使っている場合も、確かめる形は変わらない。
戻す操作の入り口が違うだけで、別の場所へ戻してハッシュで比べる流れは同じである。
| 使っている仕組み | 戻す入り口 | テストのときの注意 |
|---|---|---|
| ファイル履歴 | 設定のバックアップから、以前のバージョンを復元 | 復元先を元のフォルダーにしない |
| OneDriveなどの同期 | Webの版管理から取り出す | 同期フォルダーの外へ出して比べる |
| 自分でコピーしている | コピー先から取り出す | コピー元と同時に開いたまま比べる |
ファイル履歴の動作状況は、サービスの状態からも確かめられる。
Get-Service -Name fhsvc | Select-Object Name,DisplayName,Status,StartType手元の環境ではStatusがStopped、StartTypeがManualと表示された。
この表示は、機能が有効かどうかを直接示すものではないため、設定画面の側もあわせて見る。
点検を続ける形にする
一度戻せたことは、次も戻せることを保証しない。
対象フォルダーが増えたり、保存先の空き容量が尽きたりすると、そこから先が取れなくなる。
- 月に一度、同じ手順で1つのフォルダーだけ戻して比べる
- 確かめた日と、そのときのファイル数を書き留める
- 保存先の空き容量を同じタイミングで見る
- 対象フォルダーを増やしたら、その月のうちに1回試す
全部を戻すテストは時間がかかるため、続けられる大きさに絞るほうが結果的に回数を重ねられる。
まとめ
- 取れているか、戻せるか、中身が同じかは別のことなので、3つとも確かめる
- テストの復元先は、元のフォルダーではなく新しく作った空のフォルダーにする
- robocopyは画面ではなく終了コードで判断する。1はコピー成功、8以上は失敗
- Get-FileHashとCompare-Objectで、相対パスとハッシュの組を突き合わせる
- 同じ相対パスが2行、矢印が両方向に出たら、中身が違っている
- 月に一度、小さい範囲でよいので続けて試す
コマンドレットの詳細はMicrosoft Learnのリファレンスで確認できる。
Windowsの作業を楽にする道具はPCメソッドのまとめにも置いている。
