3 votes

Comment détecter l'échec de robocopy à supprimer depuis la source ?

Sur mon instance SQL Server, j'utilise SQL Agent pour exécuter une tâche de sauvegarde quotidienne en deux étapes.

L'une des étapes utilise Robocopy pour déplacer les fichiers de sauvegarde locaux vers un stockage réseau.

La commande pour déplacer les fichiers ressemble à ceci:

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

La sortie de la commande dans l'historique de l'étape de la tâche ressemble à ceci:

-------------------------------------------------------------------------------     
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 ERREUR 32 (0x00000020) Suppression du fichier source M:\backups\Webstore_Full_2012-07-20-000002.bak impossible. Le processus ne peut pas accéder au fichier car il est utilisé par un autre processus.       
------------------------------------------------------------------------------
      Total    Copié   Ignoré  Incompatible    ECHOUÉ    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         
Vitesse :            24720063 octets/sec.     
Vitesse :            1414,493 mégaoctets/min.       
Terminé : Fri Jul 20 04:34:50 2012.  
Code de sortie du processus 3.

La sortie textuelle montre clairement ERREUR 32. Robocopy n'a pas pu exécuter l'option /MOV (supprimer du source après la copie) car un autre processus avait un handle sur un fichier lorsque robocopy a essayé de le supprimer.

Robocopy a retourné le code de sortie 3 (nouveaux fichiers copiés vers la destination et fichiers supplémentaires supprimés de la destination). C'est correct mais incomplet car il n'y a aucun moyen de savoir à partir du code d'erreur si une opération a échoué.

SQL Agent ne prend en compte que le code de retour, pas la sortie de la commande, pour déterminer le succès d'une opération shell. Je pourrais modifier la commande Robocopy pour enregistrer la sortie sur le disque et analyser la sortie dans une étape de tâche supplémentaire, mais cela nécessiterait une programmation supplémentaire et ajouterait une autre dépendance à la tâche de sauvegarde.

Existe-t-il un moyen de détecter ce type d'échec sans rechercher la chaîne ERREUR 32 dans la sortie textuelle de Robocopy?

0 votes

Ce genre de messages d'erreur malveillants remet en question la robustesse revendiquée de robocopy. Y a-t-il d'autres options plus robustes disponibles, de préférence un utilitaire fourni avec Windows?

0 votes

Quelle méthode autre que la recherche de la sortie texte (log) cherchez-vous pour détecter une erreur? Mon cerveau ne cesse de revenir à comment vous pourriez détecter une erreur si vous ne vérifiez pas le journal d'une manière ou d'une autre... mais j'ai été en dehors de mon jeu cette semaine, donc cela pourrait aussi en être la cause.

1 votes

Je réfléchirais à deux fois avant d'utiliser quelque chose comme Robocopy seul pour les sauvegardes.

5voto

John Gardeniers Points 27097

Que ce soit RoboCopy ou une autre méthode, je préfère enregistrer toutes les sorties et ensuite traiter le journal. Personnellement, je préfère utiliser Perl pour cette tâche mais utilisez ce avec quoi vous êtes à l'aise. J'aime aussi que le script de vérification du test m'envoie par e-mail les résultats, montrant simplement s'il a réussi ou, en cas d'échec, les lignes pertinentes du journal.

À mon avis, toute opération de sauvegarde qui ne comprend pas de rapport sur les résultats est un désastre en devenir, simplement parce que vous ne pouvez pas avoir confiance en une opération qui n'est pas vérifiée. Les humains font un travail terriblement médiocre pour vérifier les journaux, alors faites l'effort supplémentaire d'écrire le script. Sans cela, vous pouvez presque garantir qu'une opération critique échouera un jour et vous n'en saurez rien, risquant éventuellement bien plus que simplement les données.

0 votes

Merci, John. Si nous devions continuer à utiliser Robocopy, nous traiterions les journaux. Nous avons réfléchi à l'effort nécessaire pour mettre en œuvre une solution de traitement des journaux par rapport à la simplification de notre architecture système. Finalement, nous avons mappé le stockage réseau en tant que lecteur local afin d'utiliser uniquement les fonctionnalités intégrées de SQL Server. Nous disposons déjà de solutions de traitement des journaux pour SQL Server, ce qui réduit le risque de manquer quelque chose.

0 votes

Je considère qu'il s'agit d'un bug dans Robocopy et l'ai signalé ici : github.com/MicrosoftDocs/windowsserverdocs.de-de/issues/49

4voto

Thecamelcoder Points 11

La description du code de sortie "de nouveaux fichiers ont été copiés vers la destination et des fichiers supplémentaires ont été supprimés de la destination" n'est pas techniquement précise. Vous ne devriez pas vous fier uniquement à la description.

Le code de sortie 0x3 est un indicateur de bits. Le message convivial devrait être interprété comme suit :

"Un ou plusieurs fichiers ont été copiés avec succès"

EN PLUS

"Des fichiers ou des répertoires supplémentaires ont été détectés. Examinez le fichier journal pour plus d'informations."

Code    Signification
0   Aucune erreur ne s'est produite et aucun fichier n'a été copié.
1   Un ou plusieurs fichiers ont été copiés avec succès.
2   Des fichiers ou des répertoires supplémentaires ont été détectés. Examinez le fichier journal pour plus d'informations.
4   Des fichiers ou des répertoires non appariés ont été détectés. Examinez le fichier journal pour plus d'informations.
8   Certains fichiers ou répertoires n'ont pas pu être copiés et la limite de tentative a été dépassée.
16  Robocopy n'a pas copié de fichiers. Vérifiez les paramètres de la ligne de commande et assurez-vous que Robocopy a suffisamment de droits pour écrire dans le dossier de destination.

Codes de sortie Robocopy
https://blogs.technet.com/b/deploymentguys/archive/2008/06/16/robocopy-exit-codes.aspx

En fin de compte, John a raison. Il n'y a pas d'autre moyen que d'examiner les journaux si vous souhaitez avoir une opération de sauvegarde robuste. De plus, vous voudrez peut-être avoir un script qui s'exécute après l'opération Robocopy et qui supprime le handle des fichiers en suspens, puis supprime les fichiers.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X