验证 Windows Server 备份映像?

验证 Windows Server 备份映像?

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

不幸的是,我的系统驱动器上开始出现坏扇区。这使得夜间备份带有坏扇区,从而破坏了任何恢复的可能性。它还覆盖了之前的备份,从而使整个备份过程变得毫无意义!

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

是否可以编写一个批处理脚本来验证备份的完整性,然后如果属实则卸载它?这样的脚本会是什么样子的?

答案1

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

它以 RAR 形式打包里面的所有文件夹WindowsImageBackup(或任何文件夹名称),为它们赋予一个带有日期戳的文件名,然后将它们复制到辅助服务器,再从那里将它们复制到异地。

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

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

至于验证映像,我有另一个脚本,该脚本在周日晚上在远程站点运行,它会抓取过去 7 天的随机备份映像,将其解压缩,创建虚拟机并启动它。因为我还没有完成脚本部分,所以每个星期一早上(当我记得的时候)我都会花 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:[email protected] -password:[password] -quiet -include:!_TEMPVAR!

将 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"
)

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

准备异地脚本

SET _BACKUPPATH=C:\QNAPBackups\WindowsImageBackup\

forfiles -p %_BACKUPPATH% -m *.rar -c "cmd /c C:\Batches\CopyOffsite.bat @path"

异地复制脚本

稍微解释一下:批处理获取备份名称,并遍历 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"

相关内容