前任者が設定していたファイルサーバーのバックアッププログラムが動かなくなってしまった。。。
ファイルサーバーはWindows Server 2016で動かしていて、Acronis BackupでSynologyのRS816っていうNASにバックアップしている。
これがある日突然、エラーでバックアップができなくなっちゃったんだな。困ったもんだ。
バックアップアーカイブが破損したらしい
「Data is corrupted: CRC mismatch or internal data structures mismatch」というエラーが出てバックアップできない。

Acronisのサイトを見ても、memtestやれとか、acrocmdでベリファイログ取れだとか、なんかダルいことしか書いてない。
どうせあと半年もすれば全部クラウドに上げて、ファイルサーバー止めちゃうんだよな。原因追及するの無駄じゃね?
robocopyを使う
Windowsでrsyncっぽいコマンドないのかと調べてみたら、Windows7で追加されたrobocopyっていうのがあった。差分コピーが取れるので、これでいいや。
基本はこんな感じで、ローカルファイルをネットワークドライブにコピーする。
robocopy e:¥Shared "¥¥192.168.*.***¥Backup Directory¥Shared" /MIR /R:3 /W:5 /NP /LOG+:"e:¥backup.log"
Code language: DOS .bat (dos)
コマンドプロンプト上だけど、ちゃんとネットワークドライブを指定できるし、パスに半角スペースがあっても””で囲んでやればOK。
オプション設定はWindowsフォルダをバックアップするコマンド(ROBOCPY)|システム開発メモを参考にしてみた。内容はこんな感じ。
- ディレクトリ構成全体をコピー(/MIR)
- コピー失敗したら5秒おきに3回リトライ(/R:3 /W:5)
- 進捗状況は表示せずに指定のログファイルに追記(/NP /LOG+:””)
三世代バックアップを取りたい
Acronisのバックアップファイルも三つ残ってた。なのでrobocopyでもそうしてみよう。バックアップディレクトリの名前に1とか2とか付ければいいか。
- Shared:今日のバックアップ
- Shared.1:昨日のバックアップ
- Shared.2:一昨日のバックアップ
robocopyを実行する前に、それぞれのディレクトリ名をrenameコマンドで変えてやればよいのだが、renameコマンドはネットワークドライブのパスを扱えないっぽい。cdコマンドも同様だ。
netコマンドでドライブ割り当て
netはネットワークパスに仮想ドライブを割り当てるコマンドだ。
net use z: "¥¥192.168.*.***¥Backup Directory"
Code language: DOS .bat (dos)
割り当て解除はこう。
net use z: /delete
Code language: DOS .bat (dos)
renameコマンドはz:で修飾してもうまく動かないので、一旦z:ドライブに移動してから実行する必要がある。
タスクスケジューラでバックアップ実行
そんなわけでできたバッチファイルがこちら。
net use z: "¥¥192.168.*.***¥Backup Directory"
z:
rename Shared.2 Shared.tmp
rename Shared.1 Shared.2
rename Shared Shared.1
rename Shared.tmp Shared
c:
net use z: /delete
robocopy e:¥Shared "¥¥192.168.*.***¥Backup Directory¥Shared" /MIR /R:3 /W:5 /NP /NDL /XJD /XJF /DCOPY:DAT /TEE /LOG+:"e:\backup_%DATE:~0,4%%DATE:~5,2%%DATE:~8%.log"
Code language: DOS .bat (dos)
これをタスクスケジューラで平日毎晩回せば、三世代分のフルバックアップを手軽に残すことができそうだ。