Como detectar falha do robocopy para excluir da origem?

2

Na minha instância do SQL Server, eu uso o SQL Agent para executar uma tarefa de backup diária em duas etapas.

Uma das etapas usa o Robocopy para mover arquivos de backup locais para o armazenamento em rede.

O comando para mover os arquivos é assim:

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

A saída do comando no histórico da etapa de trabalho é assim:

-------------------------------------------------------------------------------     
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.

A saída de texto mostra claramente ERRO 32 . O Robocopy falhou em honrar a opção /MOV (excluir da origem após a cópia) porque outro processo tinha um identificador em um arquivo quando o robocopy tentou excluí-lo.

O Robocopy retornou o código de saída 3 (novos arquivos copiados para o destino e arquivos extras excluídos do destino). Isso está correto, mas incompleto porque não há como dizer, a partir do código de erro, que qualquer operação falhou.

O SQL Agent considera apenas o código de retorno, não a saída do comando, ao determinar o sucesso de uma operação do shell de comando. Eu poderia modificar o comando Robocopy para salvar a saída em disco e analisar a saída em uma etapa de trabalho extra, mas isso requer programação extra e adicionaria outra dependência à tarefa de backup.

Existe alguma maneira de detectar esse tipo de falha sem pesquisar na saída de texto do Robocopy a string ERROR 32 ?

    
por Iain Samuel McLean Elder 20.07.2012 / 16:32

2 respostas

5

Seja o RoboCopy ou outro método, prefiro registrar todas as saídas e pós-processar o log. Eu pessoalmente prefiro o Perl para essa tarefa, mas uso o que você estiver confortável. Eu também gosto de ter o script de verificação de teste me e-mail os resultados, mostrando apenas se conseguiu ou no caso de uma falha as linhas relevantes do log.

Na minha opinião, qualquer operação de backup que não inclua relatar os resultados é um desastre esperando para acontecer, simplesmente porque você não pode ter confiança em uma operação que não está marcada. Os humanos fazem um péssimo trabalho de verificação de registros, então faça um esforço extra para escrever o roteiro. Sem isso, você pode garantir que algumas operações críticas irão falhar um dia e você não será mais sábio para isso, possivelmente arriscando muito mais do que apenas os dados.

    
por 22.07.2012 / 15:14
4

A descrição do código de saída "novos arquivos copiados para o destino e arquivos extras excluídos do destino" não é tecnicamente precisa. Você não deve confiar apenas na descrição.

O código de saída 0x3 é um flag de bit. A mensagem amigável deve ser interpretada da seguinte forma:

"Um ou mais arquivos foram copiados com sucesso"

PLUS

"Arquivos ou diretórios extras foram detectados. Examine o arquivo de log para obter mais informações ."

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.

Códigos de saída de Robocopy
link

O resultado é que John está correto. Não há maneira de examinar os logs se você quiser ter uma operação de backup robusta. Além disso, você pode querer ter um script que é executado após a operação Robocopy que remove o identificador dos arquivos pendentes e, em seguida, remove os arquivos.

    
por 22.07.2012 / 16:13