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.
0 votes
@Sergei Quel outil utiliseriez-vous à la place? Utiliseriez-vous Robocopy et autre chose?
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 à partir de la source.
0 votes
@isme Compris, je comprends maintenant. Il pourrait être une bonne idée de le préciser dans la question aussi, mais je ne suis pas sûr que cela servira à quelque chose... si Robocopy échoue à livrer une sortie appropriée/attendue, les seules solutions auxquelles je pense sont de ne pas l'utiliser (comme l'a suggéré Sergei, probablement ce n'est pas une bonne idée de s'y fier pour les sauvegardes de toute façon), ou d'écrire un script qui s'exécute après Robocopy pour vérifier s'il a bien fait les choses. (Soit vérifier contre le système de fichiers ou analyser le journal d'
ERREUR 32
.) Cela ne me semble pas très attractif, donc je serais tenté de dire au bossman qu'il doit acheter un logiciel de sauvegarde pour les sauvegardes.0 votes
Quelle est la version de robocopy.exe?
0 votes
@GregAskew C'est la version XP027.