如何检测robocopy从源代码删除失败?

在我的SQL Server实例上,我使用SQL代理分两步运行每日备份作业。

其中一个步骤使用Robocopy将本地备份文件移动到networking存储。

移动文件的命令如下所示:

robocopy M:\backups \\NAS\backups$\Database /MOV /MIR /XJ /NP /COPY:DT 

作业步骤历史logging中命令的输出如下所示:

 ------------------------------------------------------------------------------- ROBOCOPY :: Robust File Copy for Windows ------------------------------------------------------------------------------- Started : Fri Jul 20 00:55:42 2012 Source : M:\backups\ Dest : \\NAS\backups$\Database Files : *.* Options : *.* /S /E /COPY:DT /MOV /PURGE /MIR /NP /XJ /R:1000000 /W:30 ------------------------------------------------------------------------------ 3 M:\backups\ *EXTRA File 15.5 m GeoDisplay_Full_2012-07-19-000004.bak *EXTRA File 41.3 m GeoDisplay2_Full_2012-07-19-000004.bak *EXTRA File 264.1 g Webstore_Full_2012-07-19-000004.bak New File 15.5 m GeoDisplay_Full_2012-07-20-000002.bak New File 41.4 m GeoStore_Full_2012-07-20-000002.bak New File 302.1 g Webstore_Full_2012-07-20-000002.bak 2012/07/20 04:34:50 ERROR 32 (0x00000020) Deleting Source File M:\backups\Webstore_Full_2012-07-20-000002.bak The process cannot access the file because it is being used by another process. ------------------------------------------------------------------------------ Total Copied Skipped Mismatch FAILED Extras Dirs : 1 0 1 0 0 0 Files : 3 3 0 0 0 3 Bytes : 302.187 g 302.187 g 0 0 0 264.181 g Times : 3:38:57 3:38:45 0:00:00 0:00:11 Speed : 24720063 Bytes/sec. Speed : 1414.493 MegaBytes/min. Ended : Fri Jul 20 04:34:50 2012. Process exit code 3. 

文本输出清楚地显示错误32 。 Robocopy无法兑现/MOV开关(复制后从源删除),因为另一个进程在robocopy试图删除它时在一个文件上有句柄。

Robocopy返回退出代码3 (复制到目标的新文件和从目标删除的额外文件)。 这是正确的,但不完整,因为没有办法从错误代码告诉任何操作失败。

在确定命令shell程序操作成功时,SQL代理程序仅考虑返回代码,而不考虑命令输出。 我可以修改Robocopy命令以将输出保存到磁盘,并在额外的作业步骤中parsing输出,但是这需要额外的编程,并且会向备份作业添加另一个依赖项。

没有任何方法来检测这种失败,而不searchRobocopy的stringERROR 32的文本输出?

无论是RoboCopy还是其他方法,我都倾向于logging所有输出,然后对日志进行后期处理。 我个人比较喜欢Perl,但是使用任何你喜欢的东西。 我喜欢有testing检查脚本给我发电子邮件的结果,只显示它是否成功,或在从日志相关行失败的情况下。

在我看来,任何不包括报告结果的备份操作都是等待发生的灾难,因为你不可能对没有被检查的操作有信心。 人类在检查日志方面做得非常糟糕,所以要花费额外的精力编写脚本。 没有它,你可以保证一些关键的操作将会失败,而且你也不会更聪明,可能冒的不仅仅是数据。

退出代码说明“复制到目标的新文件和从目标删除的额外文件”在技术上不准确。 你不应该只依赖于描述。

退出代码0x3是一个位标志。 友好的信息应该解释如下:

“其中一个文件被复制成功”

“检测到额外的文件或目录。 检查日志文件以获取更多信息 。”

 Code Meaning 0 No errors occurred and no files were copied. 1 One of more files were copied successfully. 2 Extra files or directories were detected. Examine the log file for more information. 4 Mismatched files or directories were detected. Examine the log file for more information. 8 Some files or directories could not be copied and the retry limit was exceeded. 16 Robocopy did not copy any files. Check the command line parameters and verify that Robocopy has enough rights to write to the destination folder. 

Robocopy退出代码
https://blogs.technet.com/b/deploymentguys/archive/2008/06/16/robocopy-exit-codes.aspx

结果是约翰是正确的。 如果您想要进行强大的备份操作,则无法检查日志。 另外,您可能希望在Robocopy操作之后运行一个脚本,该脚本将句柄移除到悬空文件,然后删除这些文件。