robocopyコマンドでサーバーバックアップ

前任者が設定していたファイルサーバーのバックアッププログラムが動かなくなってしまった。。。

ファイルサーバーは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 eShared "¥¥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)

これをタスクスケジューラで平日毎晩回せば、三世代分のフルバックアップを手軽に残すことができそうだ。

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Inline Feedbacks
View all comments