如何检测 robocopy 无法从源中删除?

如何检测 robocopy 无法从源中删除?

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

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

移动文件的命令如下:

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

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

-------------------------------------------------------------------------------     
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 Agent 仅考虑返回代码,而不考虑命令输出。我可以修改 Robocopy 命令以将输出保存到磁盘,并在额外的作业步骤中解析输出,但这需要额外的编程,并且会给备份作业添加另一个依赖项。

有没有办法检测这种故障,而无需在 Robocopy 的文本输出中搜索字符串ERROR 32

答案1

无论是 RoboCopy 还是其他方法,我都喜欢记录所有输出,然后对日志进行后处理。我个人更喜欢用 Perl 来完成这项任务,但您可以使用任何您喜欢的语言。我还喜欢让测试检查脚本通过电子邮件将结果发送给我,仅显示测试是否成功,或者在失败的情况下显示日志中的相关行。

我认为,任何不包含报告结果的备份操作都是一场灾难,因为你不可能对未经检查的操作充满信心。人类在检查日志方面做得非常糟糕,所以要花额外的精力来编写脚本。如果没有它,你几乎可以保证某一天某个关键操作会失败,而你对此一无所知,可能不仅仅是数据的风险。

答案2

退出代码描述“新文件已复制到目标位置,额外文件已从目标位置删除”在技术上并不准确。您不应仅依赖该描述。

退出代码 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

结果是 John 是正确的。如果您想要进行可靠的备份操作,就必须检查日志。此外,您可能希望有一个在 Robocopy 操作之后运行的脚本,该脚本会删除悬空文件的句柄,然后删除这些文件。

相关内容