2012-05-22 3 views
1

У меня было несчастье наследовать систему, которая вызывает у меня большие проблемы. Он работает на SQL Server 2005, и проблема у меня есть в плане обслуживания базы данных. Процедура очистки использует недокументированную команду XP_DELETE_FILE и задерживается на более или менее ночной основе.Microsoft SQL Server 2005 XP_DELETE_FILE

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

Я искал решение для этого вдоль линий:

  1. Не используя команду XP_DELETE_FILE или
  2. Проверка прав доступа к файлу, прежде чем запускать XP_DELETE_FILE.

Но у меня не было такой удачи. У кого-нибудь есть идеи или решения, я бы с удовольствием их оценил.

С уважением

Пример кода:

 -- Delete old backup files 
    IF (@CurrentCommandOutput02 = 0 AND @Verify = 'N' AND @CurrentCleanupDate IS NOT NULL) 
    OR (@CurrentCommandOutput02 = 0 AND @Verify = 'Y' AND @CurrentCommandOutput03 = 0 AND @CurrentCleanupDate IS NOT NULL) 
    BEGIN 
    IF @BackupSoftware IS NULL 
    BEGIN 
     SET @CurrentCommand04 = 'DECLARE @ReturnCode int EXECUTE @ReturnCode = master.dbo.xp_delete_file 0, N''' + REPLACE(@CurrentDirectory,'''','''''') + ''', ''' + @CurrentFileExtension + ''', ''' + CONVERT(nvarchar(19),@CurrentCleanupDate,126) + ''' IF @ReturnCode <> 0 RAISERROR(''Error deleting files.'', 16, 1)' 
    END 

    IF @BackupSoftware = 'LITESPEED' 
    BEGIN 
     SET @CurrentCommand04 = 'DECLARE @ReturnCode int EXECUTE @ReturnCode = master.dbo.xp_slssqlmaint N''-MAINTDEL -DELFOLDER "' + REPLACE(@CurrentDirectory,'''','''''') + '" -DELEXTENSION "' + @CurrentFileExtension + '" -DELUNIT "' + CAST(DATEDIFF(mi,@CurrentCleanupDate,GETDATE()) + 1 AS nvarchar) + '" -DELUNITTYPE "minutes" -DELUSEAGE'' IF @ReturnCode <> 0 RAISERROR(''Error deleting LiteSpeed backup files.'', 16, 1)' 
    END 

    EXECUTE @CurrentCommandOutput04 = [dbo].[CommandExecute] @CurrentCommand04, '', 1, @Execute 
    SET @Error = @@ERROR 
    IF @Error <> 0 SET @CurrentCommandOutput04 = @Error 
    END 

ответ

0

Какие файлы вы пытаетесь удалить?

xp_delete_file является SP из SQL 2000. Он проверяет первую строку файла, который нужно удалить, чтобы убедиться, что это либо файл резервной копии SQL, либо файл отчета SQL. Он не проверяется на основе расширения файла.

может быть, если вы разместите некоторые из вашего удаления кода, было бы легче помочь

+0

Он пытается удалить созданный SQL .BAK-файл. –

+0

ОК, можете ли вы опубликовать результат строки, вызывающей процедуру xp_delete_file. Похоже, что вам не хватает одного параметра в конце – Diego

+0

Это одна из проблем, она либо завершает команду, и поэтому там не является какой-либо ошибкой или просто сидит на этой команде столько, сколько я допускаю. Я убил ее в выходные дни после того, как сидел на этой команде в течение 38 часов! Это работает примерно раз в 4 дня или около того. это работать каждую ночь или, по крайней мере, чаще всего! –

0

Я бы рекомендовал использовать функцию CLR для выполнения файловых операций. Создание сборки, который манипулирует файл (например, с помощью File.Delete, загрузите этот узел в системе и маркировать с EXTERNAL_ACCESS и использовать функции CLR, добавленные вместо устаревших, не имеющих документов XPs См. How to: Create and Run a CLR SQL Server Stored Procedure.

Смежные вопросы