我在这里发现了一个很好的帖子,查询最新的sql server备份,然后将其复制到远程服务器以准备还原。这是一个批处理文件,它是通过sql还原作业中的sql代理步骤使用cmd执行的。我正在寻找帮助,为下面的现有脚本添加额外的逻辑:
:Variables
SET DatabaseBackupPath=\\virtualserver1\Database Backups
echo.
echo Restore WebServer Database
FOR /F "delims=|" %%I IN ('DIR "%DatabaseBackupPath%\WebServer\*.bak" /B /O:D') DO SET NewestFile=%%I
copy "%DatabaseBackupPath%\WebServer\%NewestFile%" "D:\"
我想补充的是两件额外的东西。首先在现有脚本中添加一些错误处理,首先检查最新备份,但在最近24小时内确保它。如果它继续运行。如果超过24小时,则在备份文件超过24小时时生成通知警报(即单独的批处理文件)。其次是生成类似的通知,如果出现问题,例如无法访问持有备份的远程共享。
感谢回复。
答案 0 :(得分:0)
在24小时内检查文件是否已创建或上次修改并不容易。如果没有将日期/时间字符串转换为自纪元以来的秒数,日期/时间计算不是一项简单的任务,这将使得可以使用简单的整数比较。
有文件日期比较的解决方案,请参阅
您可以使用其中一种解决方案。
更容易检查复制过程是否有效:
copy /V "%DatabaseBackupPath%\WebServer\%NewestFile%" "D:\"
if errorlevel 1 goto CopyFail
goto :EOF
:CopyFail
echo.
echo Copying file "%DatabaseBackupPath%\WebServer\%NewestFile%" failed!
pause
我的解决方案基于Rar.exe
( WinRAR 的控制台版本)的使用,因为此压缩工具具有根据文件日期仅压缩文件的功能。因此,只有安装了 WinRAR 并购买了许可证,此解决方案才对您有所帮助。
WinRAR 程序文件文件夹的路径必须设置在以下批处理文件的顶部。
@echo off
SET DatabaseBackupPath=\\virtualserver1\Database Backups
SET WinRarFolder=C:\Program Files\WinRAR
cls
echo.
echo Restore WebServer Database
echo.
rem Find newest *.bak file in backup directory on server.
FOR /F "delims=" %%I IN ('DIR /B /O-D "%DatabaseBackupPath%\WebServer\*.bak"') DO (
SET NewestFile=%%I
goto BackupFound
)
cls
echo.
echo Restore WebServer Database
echo.
echo There is no *.bak file in "%DatabaseBackupPath%\WebServer\"
echo or the backup directory on server cannot be reached at all.
goto EndBatch
:BackupFound
echo Newest backup in "%DatabaseBackupPath%\WebServer"
echo is the file "%NewestFile%".
echo.
if exist "%TEMP%\ServerBackup.rar" del "%TEMP%\ServerBackup.rar"
"%WinRarFolder%\Rar.exe" a -cfg- -ep -inul -m0 -tn24h -y "%TEMP%\ServerBackup.rar" "%DatabaseBackupPath%\WebServer\%NewestFile%"
if errorlevel 1 goto OldBackup
"%WinRarFolder%\Rar.exe" e -cfg- -inul -y "%TEMP%\ServerBackup.rar" F:\Temp
if errorlevel 1 goto ExtractFailed
del "%TEMP%\ServerBackup.rar"
echo File "%NewestFile%" copied to D:\
goto EndBatch
:ExtractFailed
del "%TEMP%\ServerBackup.rar"
echo "Copying file "%NewestFile%" to D:\ failed.
goto EndBatch
:OldBackup
echo File "%NewestFile%" is older than 24 hours.
:EndBatch
set WinRarFolder=
SET DatabaseBackupPath=
SET NewestFile=
echo.
pause
<强>解释强>
批处理文件首先使用命令 DIR 来获取指定目录中的* .bak文件列表,这些文件按照从最新到最旧的最后修改文件日期排序。
使用 FOR 循环,列表顶部(=最新文件)的文件名称将分配给环境变量 NewestFile 。
如果在指定目录中找不到* .bak文件,批处理文件将输出错误消息,例如,如果此时使用所用用户帐户的权限无法访问服务器。
但是在成功找到指定目录中的* .bak文件后,批处理文件会通知批处理文件用户在哪个目录中找到了哪个文件。
确保临时文件的目录中不存在要创建的RAR存档后,Rar.exe
用于在目录中为临时文件创建RAR存档,其中只存储找到的文件而不进行压缩,但仅当此文件由于切换-tn24h
而在24小时内有最后修改日期。
有关Rar.exe
上使用的开关的详细信息,请参阅 WinRAR 程序文件目录中的文本文件 Rar.txt 。
Rar.exe
退出并返回值大于0。在这种情况下,原因很可能是指定的文件超过24小时,这导致现在写入控制台窗口的相应消息。
Rar.exe
成功创建RAR存档而不再使用压缩将文件解压缩到目标目录。
在不太可能的情况下显示适当的错误消息。否则批处理文件输出成功消息并完成清理环境表(如果下一个命令提示符窗口关闭,则不需要)。
在任何情况下都会删除临时使用的RAR存档。