验证 Windows Server Backup 映像?

Mat*_*ino 3 backup windows-server-2008-r2

我在 Windows 2008 R2 服务器上使用 Windows Server Backup 已经有一段时间了,以便在驱动器出现故障时为网络驱动器创建夜间裸机备份。夜间备份每晚都会覆盖自身。

不幸的是,坏扇区开始出现在我的系统驱动器上。这允许使用坏扇区创建每晚备份,从而破坏任何恢复的可能性。它还覆盖了以前的备份,从而使整个备份过程毫无价值!

我是否按照预期使用 WSB?如何避免使用无法恢复的故障备份覆盖备份的可能性????

是否可以制作一个批处理脚本来验证备份的完整性,然后在为真时卸载它?这样的脚本会是什么样子?

Mar*_*son 5

我写了一个从凌晨 4 点开始的批处理文件,这保证是在我所有的备份完成之后。

它对里面的所有文件夹WindowsImageBackup(或该文件夹的名称)进行RAR ,给它们一个带日期戳的文件名,然后将它们复制到辅助服务器,然后从那里将它们复制到异地。

这样我就有了几个月(几年?)的历史备份,其中至少有一个是好的。

至于不覆盖备份,WSB 允许您这样做的唯一方法是使用本地安装的块存储设备(例如硬盘驱动器、USB 驱动器或 iSCSI 磁盘)。

至于验证映像,我有另一个脚本,它在周日晚上在远程站点运行,该脚本从过去 7 天中获取随机备份映像,取消 RAR 的它,创建一个 VM 并启动它。因为我还没有完全完成脚本部分,每个星期一早上(当我记得的时候)我花 5 分钟只是启动恢复过程,然后稍后检查它是否成功。

总而言之,这听起来有点贫民窟,但这个特定客户的预算非常有限(阅读:无),所以我被限制使用免费工具。到目前为止,它运行得非常好。


在 GPO 级别启用 WBS,并安排每晚的完整备份

@echo off

SETLOCAL ENABLEEXTENSIONS
SETLOCAL ENABLEDELAYEDEXPANSION

FOR /f %%I IN (
 'wmic volume get driveletter'
) DO (
  ECHO %%I | FIND ":"
  IF ERRORLEVEL 1 (
   echo Failed: %%I
  ) ELSE (
   ECHO %%I | FIND "D:"
   IF ERRORLEVEL 1 (
     IF NOT [!_TEMPVAR!]==[] SET _TEMPVAR=!_TEMPVAR!,
     SET _TEMPVAR=!_TEMPVAR!%%I
    ) ELSE (
      echo Skipping CD-ROM
    )
  )

)

wbadmin enable backup -addtarget:\\enetsbackup1\Backups -schedule:23:00 -systemState -allCritical -vssFull -user:backupservice@enets.local -password:[password] -quiet -include:!_TEMPVAR!
Run Code Online (Sandbox Code Playgroud)

将 RAR 文件转换为带日期戳和密码的文件(在托管所有备份文件共享的服务器上运行)

@ECHO OFF

SET _WINRAR=C:\Program Files\WinRAR\Rar.exe
SET _BACKUPPATH=C:\QNAPBackups\WindowsImageBackup\

REM RAR All backups into date-named files

forfiles -p %_BACKUPPATH% -m *.rar -d -3 -c "cmd /c del @path"

FOR /D %%I IN (%_BACKUPPATH%*) DO (
    "%_WINRAR%" a -ag-YYYYMMDD -ep1 -hp[password] -m2 -df  "%%I.rar" "%%I"
)
Run Code Online (Sandbox Code Playgroud)

将文件移动到异地同步目录,并清理同步目录

准备异地.bat

SET _BACKUPPATH=C:\QNAPBackups\WindowsImageBackup\

forfiles -p %_BACKUPPATH% -m *.rar -c "cmd /c C:\Batches\CopyOffsite.bat @path"
Run Code Online (Sandbox Code Playgroud)

copyoffsite.bat

稍微解释一下:批处理取备份名称并遍历txt 文件列表,在每个txt 文件中都有一个包含所有机器名称的列表。根据机器名称所在的文件,它会进入不同的文件夹(因为有些是每晚同步,有些是每周同步,具体取决于它们的重要性)。

@ECHO OFF

SET _OFFSITEDIR=C:\QNAPBackups\Offsite\

FOR /f "tokens=1 delims=- " %%a in ("%1") DO (
  FOR /f "tokens=4 delims=\ " %%b in ("%%a") DO (
    FIND /C /I "%%b" C:\Batches\OFFSITE-DB.txt | find ": 1" 1>nul && GOTO Offsite_Database
    FIND /C /I "%%b" C:\Batches\OFFSITE-TS.txt | find ": 1" 1>nul && GOTO Offsite_Terminal
    FIND /C /I "%%b" C:\Batches\OFFSITE-EX.txt | find ": 1" 1>nul && GOTO Offsite_Exchange
    FIND /C /I "%%b" C:\Batches\OFFSITE-A1.txt | find ": 1" 1>nul && GOTO Offsite_AllInOne
    FIND /C /I "%%b" C:\Batches\OFFSITE-MS.txt | find ": 1" 1>nul && GOTO Offsite_Miscella

   GOTO :NotFound
  )
)

:Offsite_Database
MOVE /Y %1 %_OFFSITEDIR%Databases\
GOTO EOF

:Offsite_Terminal
MOVE /Y %1 %_OFFSITEDIR%TerminalServers\
GOTO EOF

:Offsite_Exchange
MOVE /Y %1 %_OFFSITEDIR%Exchange\
GOTO EOF

:Offsite_AllInOne
MOVE /Y %1 %_OFFSITEDIR%AllInOne\
GOTO EOF

:Offsite_Miscella
MOVE /Y %1 %_OFFSITEDIR%Misc\
GOTO EOF

:NotFound
ECHO %1 >> C:\Batches\OFFSITE-NotFound.txt
GOTO EOF

:EOF

forfiles -p %_OFFSITEDIR%Databases\ -m *.rar -d -3 -c "cmd /c del @path"
forfiles -p %_OFFSITEDIR%TerminalServers\ -m *.rar -d -3 -c "cmd /c del @path"
forfiles -p %_OFFSITEDIR%Exchange\ -m *.rar -d -3 -c "cmd /c del @path"
forfiles -p %_OFFSITEDIR%AllInOne\ -m *.rar -d -3 -c "cmd /c del @path"
forfiles -p %_OFFSITEDIR%Misc\ -m *.rar -d -3 -c "cmd /c del @path"
Run Code Online (Sandbox Code Playgroud)