Sur mon instance SQL Server, j'utilise SQL Agent pour exécuter une tâche de sauvegarde quotidienne en deux étapes.
Une des étapes utilise Robocopy pour déplacer les fichiers de sauvegarde locaux vers le 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 : ven. 20 juil. 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 Octets/sec.
Speed : 1414.493 MégaOctets/min.
Ended : ven. 20 juil. 04:34:50 2012.
Code de sortie du processus 3.
La sortie textuelle montre clairement ERREUR 32. Robocopy n'a pas réussi à respecter l'interrupteur /MOV
(supprimer du source après copie) parce qu'un autre processus avait un handle sur un fichier lorsque robocopy a essayé de le supprimer.
Robocopy a retourné 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 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 sauvegarder la sortie sur le disque et analyser la sortie dans une étape de tâche supplémentaire, mais cela nécessite une programmation supplémentaire et ajoutera une autre dépendance à la tâche de sauvegarde.
Existe-t-il un moyen de détecter ce type d'échec sans rechercher dans la sortie textuelle de Robocopy pour la chaîne ERREUR 32
?
0 votes
Ce genre de message d'erreur malveillant rend la prétention de Robocopy à la robustesse un peu incertaine. Existe-t-il des options plus robustes disponibles, de préférence un utilitaire livré avec Windows?
0 votes
Quelle méthode autre que la recherche dans la sortie texte (log) cherchez-vous pour détecter une erreur? Mon cerveau revient toujours à comment vous détecteriez une erreur si vous n'avez pas vérifié le log d'une manière ou d'une autre... mais j'ai été moins performant cette semaine, donc cela pourrait aussi en être la raison.
1 votes
Je réfléchirais à deux fois avant d'utiliser quelque chose comme Robocopy seul pour les sauvegardes.
0 votes
@Sergei Quel outil utiliseriez-vous à la place? Utiliseriez-vous Robocopy et quelque chose d'autre?
0 votes
@HopelessN00b L'Agent SQL examine le code de sortie pour déterminer si la commande a réussi. Robocopy est capable de définir un bit d'échec lors de l'échec de certaines opérations, mais ne définit pas de bit d'échec lorsqu'il échoue à supprimer la source.
0 votes
@isme Compris, je comprends maintenant. Il pourrait être une bonne idée de le souligner également dans la question, mais je ne suis pas sûr que cela servira à quelque chose... si Robocopy échoue à fournir une sortie correcte/attendue, les seules solutions auxquelles je peux penser sont de ne pas l'utiliser (comme Sergei l'a suggéré, ce n'est probablement pas une bonne idée de s'appuyer dessus pour les sauvegardes de toute façon), ou d'écrire un script qui vérifie que Robocoy a bien fait les choses. (Soit en vérifiant le système de fichiers, soit en analysant le journal pour
ERREUR 32
.) Cela ne me semble pas très attrayant, je serais donc tenté de dire au patron qu'il doit acheter un logiciel de sauvegarde pour les sauvegardes.0 votes
Quelle est la version de robocopy.exe?
0 votes
@GregAskew Il s'agit de la version XP027.