Назад | Перейти на главную страницу

Как определить, что robocopy не может удалить из источника?

На моем экземпляре SQL Server я использую агент SQL для выполнения ежедневного задания резервного копирования в два этапа.

Один из шагов использует 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 попытался удалить его.

Робокопи вернулся код выхода 3 (новые файлы копируются в место назначения, а лишние файлы удаляются из места назначения). Это верно, но неполно, потому что по коду ошибки невозможно определить, что какая-либо операция завершилась неудачно.

Агент SQL учитывает только код возврата, а не выходные данные команды, при определении успеха операции командной оболочки. Я мог бы изменить команду Robocopy, чтобы сохранить вывод на диск и проанализировать вывод на дополнительном этапе задания, но это требует дополнительного программирования и добавит еще одну зависимость к заданию резервного копирования.

Есть ли способ обнаружить такой сбой без поиска в текстовом выводе Robocopy строки ERROR 32?

Будь то RoboCopy или какой-либо другой метод, я предпочитаю регистрировать весь вывод, а затем обрабатывать журнал. Я лично предпочитаю Perl для этой задачи, но используйте все, что вам удобно. Я также хотел бы, чтобы сценарий проверки теста отправлял мне результаты по электронной почте, показывая, удалось ли это, или в случае сбоя соответствующие строки из журнала.

На мой взгляд, любая операция резервного копирования, которая не включает в себя отчет о результатах, является ожидающей катастрофой просто потому, что вы не можете быть уверены в операции, которая не проверена. Люди ужасно плохо справляются с проверкой журналов, поэтому приложите дополнительные усилия, чтобы написать сценарий. Без него вы можете быть практически уверены, что какая-то критическая операция однажды выйдет из строя, и вы не станете мудрее, возможно, рискуя гораздо большим, чем просто данными.

Описание кода выхода «новые файлы скопированы в место назначения, а дополнительные файлы удалены из места назначения» технически неточно. Не стоит полагаться только на описание.

Код выхода 0x3 - это битовый флаг. Дружественное сообщение следует интерпретировать следующим образом:

«Один или несколько файлов были успешно скопированы»

PLUS

"Обнаружены лишние файлы или каталоги. Изучите файл журнала для получения дополнительной информации.. "

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

В результате Джон прав. Невозможно обойтись без изучения журналов, если вы хотите иметь надежную операцию резервного копирования. Кроме того, вы можете захотеть иметь сценарий, который запускается после операции Robocopy, которая удаляет дескриптор висящих файлов, а затем удаляет файлы.