我已经在 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"