SQL Server xp удалить файл не удалять файлы

Я пытаюсь написать SQL, который удалит файлы типа".7z', которые старше 7 дней.

вот что у меня есть, что не работает:

DECLARE @DateString CHAR(8)
SET @DateString = CONVERT(CHAR(8), DATEADD(d, -7, GETDATE()), 1)
EXECUTE master.dbo.xp_delete_file 0, 
                  N'e:Database Backups',N'7z', @DateString, 1

Я также попытался изменить' 1 'a конец на '0'.

Это возвращает "успех", но файлы не удаляются.

Я использую SQL Server 2005, Standard, w / SP2

8 ответов


имел аналогичную проблему, нашел различные ответы. Вот что я нашел.

вы не можете удалить файлы 7z с помощью xp_delete_file. Это недокументированная расширенная хранимая процедура, которая является пережитком SQL 2000. Он проверяет первую строку удаляемого файла, чтобы убедиться, что это файл резервной копии SQL или файл отчета SQL. Он не проверяет на основе расширения файла. Из того, что я собираю, его предназначение-в планах обслуживания для очистки старых резервных копий и планирования отчетов.

вот пример, основанный на ссылке Tomalak для удаления файлов резервных копий старше 7 дней. То, что привлекает людей, - это схема "sys", конечная косая черта в пути к папке и отсутствие точки в расширении файла для поиска. Пользователь, запускаемый SQL Server, также должен иметь разрешения на удаление папки.

DECLARE @DeleteDate datetime
SET @DeleteDate = DateAdd(day, -7, GetDate())

EXECUTE master.sys.xp_delete_file
0, -- FileTypeSelected (0 = FileBackup, 1 = FileReport)
N'D:\SQLbackups\', -- folder path (trailing slash)
N'bak', -- file extension which needs to be deleted (no dot)
@DeleteDate, -- date prior which to delete
1 -- subfolder flag (1 = include files in first subfolder level, 0 = not)

обратите внимание, что xp_delete_file сломан в SP2 и не будет работать с файлами отчетов; есть исправление для него в [http://support.microsoft.com/kb/938085]. Я не тестировал его с SP3.

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


насколько я знаю xp_delete_file удалять только файлы, распознанные SQL Server 2005 (файлы резервных копий, журналы транзакций,...). Возможно, вы можете попробовать что-то вроде этого:

xp_cmdshell 'del <filename>'

этот sp будет удалять только собственные файлы резервных копий sql server или собственные файлы отчетов об обслуживании (в целях безопасности)

Как Smink предложил, Вы можете использовать

xp_cmdshell 'del <filename>'

с соответствующими разрешениями на папку.


Я нашел этот вопрос, но решение не применять ко мне (как это было .файлы bak, сам SQL Server сделал, как часть плана обслуживания).

проблемой в моем случае была безопасность. Сценарий запускался как пользователь, который запускает SQL Server (MSSQL) (в моем случае и, вероятно, в большинстве случаев "сетевая служба"), не имел доступа к папке, в которой он пытался удалить файлы.

поэтому добавление " сетевой службы "и предоставление ей" изменить " помогло.


Я прочитал много разных подходов и решений, которые преследовали несколько человек при попытке решить проблему с расширенной хранимой процедурой xp_delete. Решения:

  1. убедитесь, что у вас нет точки (.) в расширении при настройке задачи обслуживания служб SSIS.
  2. обязательно щелкните включить папки первого уровня, если они существуют для каждой резервной копии базы данных.
  3. обязательно нажмите на кнопку файлы резервных копий вверху. Этот задача обслуживания проверяет тип файла. Для резервных копий базы данных я считаю, что он проверяет заголовок файла резервной копии.

в моем сценарии все вышеперечисленное было правильным. Есть несколько комментариев в интернете, где некоторые из них сказали, что процедура xp_delete глючит.

когда файлы резервных копий не удалялись, я извлек SQL для обслуживания и запустил его из SSMS. В результате появилось сообщение, что файл не является файлом резервной копии sql server. Это сообщение было ошибочным, так как резервная копия может быть успешно восстановлена, что приведет к созданию оперативной базы данных.

команды базы данных, используемые для проверки базы данных:

RESTORE HEADERONLY FROM DISK = N'<file path\filename>.Bak'
RESTORE VERIFYONLY FROM DISK = N'<file path\filename>.bak'

обе вышеуказанные команды указали, что файл резервной копии действителен.

затем я открыл средство просмотра событий и нашел сообщения, указывающие на ошибки входа для диспетчера соединений. Это было странно, потому что я проверил соединение с помощью кнопки тестового соединения. Ошибки не были связаны с любая учетная запись, которую я создал.

Сообщение Средства Просмотра Событий:

*не удается найти описание события ID 17052 из исходного MS SQL SERVER. Компонент, который вызывает это событие не установлен на этом локальном компьютере или поврежден. Компонент можно установить или восстановить на локальном компьютере. Если событие возникло на другом компьютере, отображаемая информация должна быть сохранена вместе с событием.

следующий информация была включена в мероприятие:

серьезность: 16 ошибка: 18456, OS: 18456 [Microsoft][SQL Server Native Client 11.0][SQL Server]ошибка входа пользователя " домен\имя_сервера$".*

затем я вошел в систему на машине, где xp_delete работал правильно. Просмотрев active directory и не найдя системную учетную запись, я перешел к средству просмотра событий, чтобы найти похожие сообщения. Здесь стало очевидно, что учетная запись domain\server$ является сопоставлено с безопасностью системы.

следующим шагом было сравнение безопасности базы данных, где xp_delete работал с базой данных, где он не работал. В базе данных, где xp_delete не работал, отсутствовали 2 входа в систему под защитой. В 2 отсутствует логины были: СИСТЕМА\ОРГАН НТ NT Service\MSSQLSERVER

после добавления службы NT\MSSQLSERVER xp_delete успешно работал.

один из подходов к тестированию - использовать задачу обслуживания для удаления отдельный файл.


попробуйте изменить первый параметр с 0 на 1.

вот маленький резюме на xp_delete_file Я только что нашел. Звучит так, будто вам не повезло с этой процедурой.


Я знаю, что это немного старо, но я хотел поделиться своими разочарованиями со всеми вами. У меня была та же проблема, что и многие из этих сообщений, но ничего не работало. Затем я вспомнил, что у нас есть слой шифрования в базе данных под названием NetLib. Это означает, что резервные копии зашифрованы, и поэтому xp_delete_file не может читать заголовки. Теперь я использую пакетный файл в ОС и вызываю его из задания агента. Надеюсь, это кому-то поможет.


обычно мы оказываемся в таких ситуациях, когда база данных перемещается на другой сервер или когда экземпляр SQL переустанавливается на тот же самый, но резервная копия остается в старом каталоге. Например: Вы перемещаете базу данных с server1 на server2, но у вас есть сервер с планом обслуживания, который выполняет периодическое резервное копирование или переустановку экземпляра SQL на server1 и вы восстанавливаете базу данных.

в случае резервного копирования наборы, которые хранятся в качестве информации в msdb больше нет, поэтому все старые резервные копии, которые были созданы, не будут удалены как нет информации проверяется на основе сбоев, полученных из таблиц с резервными наборами.

EXECUTE master.sys.xp_delete_file  0, -- FileTypeSelected (0 = FileBackup, 1 = FileReport)

первый аргумент показывает, что используются таблицы из msdb.

надеюсь, это кому-то поможет.