Удалить из папки файлы с определенным расширением sql
Я пытаюсь написать SQL, который удалит файлы типа".7z', которые старше 7 дней.
вот что у меня есть, что не работает:
Я также попытался изменить' 1 'a конец на '0'.
Это возвращает "успех", но файлы не удаляются.
Я использую SQL Server 2005, Standard, w / SP2
имел аналогичную проблему, нашел различные ответы. Вот что я нашел.
вы не можете удалить файлы 7z с помощью xp_delete_file. Это недокументированная расширенная хранимая процедура, которая является пережитком SQL 2000. Он проверяет первую строку удаляемого файла, чтобы убедиться, что это файл резервной копии SQL или файл отчета SQL. Он не проверяет на основе расширения файла. Из того, что я собираю, его предназначение-в планах обслуживания для очистки старых резервных копий и планирования отчетов.
вот пример, основанный на ссылке Tomalak для удаления файлов резервных копий старше 7 дней. То, что привлекает людей, - это схема "sys", конечная косая черта в пути к папке и отсутствие точки в расширении файла для поиска. Пользователь, запускаемый SQL Server, также должен иметь разрешения на удаление папки.
поскольку он недокументирован, xp_delete_file может исчезнуть или измениться в будущих версиях SQL Server. Многие сайты рекомендуют сценарий оболочки для удаления вместо этого.
насколько я знаю xp_delete_file удалять только файлы, распознанные SQL Server 2005 (файлы резервных копий, журналы транзакций. ). Возможно, вы можете попробовать что-то вроде этого:
этот sp будет удалять только собственные файлы резервных копий sql server или собственные файлы отчетов об обслуживании (в целях безопасности)
Как Smink предложил, Вы можете использовать
с соответствующими разрешениями на папку.
Я нашел этот вопрос, но решение не применять ко мне (как это было .файлы bak, сам SQL Server сделал, как часть плана обслуживания).
проблемой в моем случае была безопасность. Сценарий запускался как пользователь, который запускает SQL Server (MSSQL) (в моем случае и, вероятно, в большинстве случаев "сетевая служба"), не имел доступа к папке, в которой он пытался удалить файлы.
поэтому добавление " сетевой службы "и предоставление ей" изменить " помогло.
Я прочитал много разных подходов и решений, которые преследовали несколько человек при попытке решить проблему с расширенной хранимой процедурой xp_delete. Решения:
- убедитесь, что у вас нет точки (.) в расширении при настройке задачи обслуживания служб SSIS.
- обязательно щелкните включить папки первого уровня, если они существуют для каждой резервной копии базы данных.
- обязательно нажмите на кнопку файлы резервных копий вверху. Этот задача обслуживания проверяет тип файла. Для резервных копий базы данных я считаю, что он проверяет заголовок файла резервной копии.
в моем сценарии все вышеперечисленное было правильным. Есть несколько комментариев в интернете, где некоторые из них сказали, что процедура xp_delete глючит.
команды базы данных, используемые для проверки базы данных:
обе вышеуказанные команды указали, что файл резервной копии действителен.
*не удается найти описание события ID 17052 из исходного MS SQL SERVER. Компонент, который вызывает это событие не установлен на этом локальном компьютере или поврежден. Компонент можно установить или восстановить на локальном компьютере. Если событие возникло на другом компьютере, отображаемая информация должна быть сохранена вместе с событием.
следующий информация была включена в мероприятие:
серьезность: 16 ошибка: 18456, OS: 18456 [Microsoft][SQL Server Native Client 11.0][SQL Server]ошибка входа пользователя " домен\имя_сервера$".*
следующим шагом было сравнение безопасности базы данных, где xp_delete работал с базой данных, где он не работал. В базе данных, где xp_delete не работал, отсутствовали 2 входа в систему под защитой. В 2 отсутствует логины были: СИСТЕМА\ОРГАН НТ NT Service\MSSQLSERVER
после добавления службы NT\MSSQLSERVER xp_delete успешно работал.
один из подходов к тестированию - использовать задачу обслуживания для удаления отдельный файл.
С помощью диалогового окна Задача «Очистка после обслуживания» можно удалить старые файлы, связанные с планами обслуживания, включая текстовые отчеты, созданные планами обслуживания, и файлы резервных копий базы данных.
Задача «Очистка после обслуживания» автоматически не удаляет файлы во вложенных папках указанного каталога. Это снижает вероятность того, что злоумышленник сможет удалить файлы с помощью задачи «Очистка после обслуживания». Если нужно удалять файлы во вложенных папках первого уровня, установите флажок Включить вложенные папки первого уровня.
Параметры
Соединение
Отображает текущее соединение.
Создать
Создать новое соединение с сервером для его использования при выполнении этой задачи. Диалоговое окно Создание соединения описано ниже.
Файлы резервных копий
Удаляет файлы резервной копии.
Текстовые отчеты плана обслуживания
Удаляет текстовые отчеты предыдущих запусков планов обслуживания.
Удалить определенный файл
Удаляет определенный файл, указанный в поле Имя файла .
Имя файла
Путь к удаляемому файлу и его имя.
Удалить из папки файлы с определенным расширением
Удаляет все файлы с определенным расширением в указанной папке. Позволяет удалить сразу несколько файлов, например все файлы резервных копий с расширением BAK из папки «Вторник».
Папка
Путь к папке, содержащей удаляемые файлы, и ее имя.
Расширение файла
Введите расширение удаляемого файла. Не добавляйте другие символы до или после расширения (например, укажите BAK или TRN).
Включить вложенные папки первого уровня
Удаляет файлы с расширением, заданным в поле Расширение файла , из вложенных папок первого уровня относительно поля Папка.
Удалять файлы в зависимости от их возраста во время выполнения задачи
Задайте минимальный возраст удаляемых файлов, указав числовое значение и единицу времени в поле Удалить все файлы старше чем .
Удалить все файлы старше чем
Задайте минимальный возраст удаляемых файлов, указав числовое значение и временную единицу (день, неделя, месяц или год). Файлы, старше указанного временного интервала, будут удалены.
Просмотр T-SQL
Просмотрите инструкции Transact-SQL , выполняемые для данной задачи по отношению к серверу, на основе выбранных параметров.
Если количество затронутых объектов велико, построение этого отображения может занять значительное время.
Диалоговое окно «Создание соединения»
Имя соединения
Введите имя нового соединения.
Выберите или введите имя сервера
Выберите сервер для подключения при выполнении этой задачи.
.
Выберите для просмотра списка доступных серверов.
Введите данные для входа на сервер
Укажите способ проверки подлинности на сервере.
Использовать встроенную безопасность Windows
Подключение к экземпляру компонента Компонент SQL Server Database Engine с использованием проверки подлинности Windows.
Использовать указанные имя пользователя и пароль
Подключение к экземпляру Компонент SQL Server Database Engine с использованием проверки подлинности SQL Server. Этот параметр недоступен.
User name
Укажите имя входа, используемое при проверке подлинности SQL Server . Этот параметр недоступен.
Пароль
Укажите используемый при проверке подлинности пароль. Этот параметр недоступен.
Что нужно подкрутить в настройках безопасности "Surface Area Configuration" или как поменять параметры безопасности с помощью sp_configure, чтобы получить разрешение на выполнение вышеуказанной команды при наличии администраторских прав?
P.S. Правильно ли я понял, что для проведения профилактических работ (резервное копирование, модификация структуры БД командой ALTER TABLE и т.п.) необходимо выполнять:
Требуется удалить файл на диске из хранимой процедуры, например так:
Что нужно подкрутить в настройках безопасности "Surface Area Configuration" или как поменять параметры безопасности с помощью sp_configure, чтобы получить разрешение на выполнение вышеуказанной команды при наличии администраторских прав?
P.S. Правильно ли я понял, что для проведения профилактических работ (резервное копирование, модификация структуры БД командой ALTER TABLE и т.п.) необходимо выполнять:
Нет, неправильно. Большинство обслуживающих операций не требуют монопольности и тем более отключенности.
могу подсказать как руками не рисовать скрипты, а
атоматически создавать скрипты-наливашки, сравнивая различные версии БД
чаще реализуется автоматизацией (зависит от версии сервера) ssa
Большинство обслуживающих операций не требуют монопольности и тем более отключенности. Тогда можно ли при выходе каждого клиента вызывать следующий скрипт, когда кто-то из других клиентов, возможно, ещё сидит в БД?
БЭКАП делаем только на сервере путём вызова ХП.
Если что случись с БД, то можно ее и лог "ручками" в SSMS восстановить так:
могу подсказать как руками не рисовать скрипты, а
атоматически создавать скрипты-наливашки, сравнивая различные версии БД
в качестве реквизита требуется бутылка водки.
кратенько:
имеем БД на каком-то этапе,
начинаем распространять, метим "версия раз"
где-то она работает,
у себя дорабатываем, доработали,
метим - стала "версия два"
встает вопрос обновления у клиентов до версии два.
для создания скриптов из моего опыта
наилучший и опробованный вариант - это SQL Delta,
а для накатки и проверки необходимости такой накатки -
определенные танцы и бубны.
это если кратко.
ssaБольшинство обслуживающих операций не требуют монопольности и тем более отключенности. Тогда можно ли при выходе каждого клиента вызывать следующий скрипт, когда кто-то из других клиентов, возможно, ещё сидит в БД?
Здесь вопрос в нужности "при выходе каждого клиента вызывать следующий скрипт". И что под этим подразумевается? Сам бэкап делает сервер на серверные диски независимо от места поступления команды на выполение бэкапа.
Если что случись с БД, то можно ее и лог "ручками" в SSMS восстановить так:
Рома, ты продолжаешь подходить к серверу с файл-серверными подходами. У тебя хватит места на столько бэкапов? Они ведь у тебя будут накапливаться! Нафига восстанавливать лог, сделанный непосредственно после полного бэкапа? Ты может таки почитаешь хелп к серверу на тему бэкапов?
Тогда можно ли при выходе каждого клиента вызывать следующий скрипт, когда кто-то из других клиентов, возможно, ещё сидит в БД?
вот мое подшаманенное и вподворованное, гонять никого не нужно
для бекапа гонять совсем никого не нужно,
вешаем на джобы, либо танцы через планировщик,
бекап - это задача автоматическая,
либо конечно даем и возможность создания руками(принудительно)
и зачем это дело автоматизировать?
Для обслуживания базы данных не надо привлекать клиента!
Пусть это делает SQL Agent.
Воспользуйтесь DataBase Maintenance Plan, который сгенерит вам ряд SSIS пакетов и джобов, которые по определенным вами расписаниям будет запускать эти джобы.
alex11100, куда у себя ты поставил вызов ХП dbo.sp_BackupBase? Только в ручном режиме отдельным пунктом или на какое событие повесил?
А если я юзаю ТОЛЬКО версии Express 2005/2008, из которых последнюю (русскую) попробывал только на днях? Старый код вроде в 2008 работает без переделки + радует появление новых типов DATE и TIME (жаль еще тип данных boolean не ввели )
Можно ли и как в Express версии добраться до этого SQL Agent, DataBase Maintenance Plan и генерации джобов? Намекните, а дальше уж буду разбираться сам.
alex11100, куда у себя ты поставил вызов ХП dbo.sp_BackupBase? Только в ручном режиме отдельным пунктом или на какое событие повесил?
А если я юзаю ТОЛЬКО версии Express 2005/2008, из которых последнюю (русскую) попробывал только на днях? Старый код вроде в 2008 работает без переделки + радует появление новых типов DATE и TIME (жаль еще тип данных boolean не ввели )
Можно ли и как в Express версии добраться до этого SQL Agent, DataBase Maintenance Plan и генерации джобов? Намекните, а дальше уж буду разбираться сам.
Учитывая, что у тебя экспресс, все твои вопросы теряют смысл из-за отсутствием в нем нужных тебе фич. Версию сервера надо сообщать как можно раньше.
Но решение есть. Вместо sqlagent - виндовый планировщик. Вместо плана обслуживания - набор батников, запускающих sqlcmd с передачей ему в качестве параметров показанных здесь скриптов.
Бэкапы запускают не по событию, а по времени.
аналогично, касательно сопровождаемой сейчас системы:
у меня сейчас только экспрессы,
поэтому сделал менюшку,
жмут руками
а так, конечно для экспресса решается через планировщик
alex11100наилучший и опробованный вариант - это SQL Delta
А это что за beast такой?
Я вот знаю только Red Gate Software Ltd SQL Packager 6.0.0.107.
Нафига восстанавливать лог, сделанный непосредственно после полного бэкапа?
Согласен, не надо! Почитал. Но я видел САМ реально, как после падения сервера у ребят была целая проблема восстановления базы данных. В общем, если база грохнулась, видимо надо пользоваться AttachDatabase из резервной копии без восстановления лога? Так? Тем более Express версия это позволяет. Мне просто нужно, чтобы в голове был четкий план конкретных действий "на случай войны"
Кстати, насчет bat-файлов: достаточно ли будет написать bat-файл, стартующий из планировщика Windows, например в 01:00 ночи (когда заведомо никто с базой не работает) просто копирующий 2 файла *.mdf и *.ldf базы данных в отдельную папку. Можно ли потом, в случае аврии, будет просто заменить рабочую БД на эти ранее сохраненные в отдельном месте 2 файла без дополнительных плясок с бубном?
ssaНафига восстанавливать лог, сделанный непосредственно после полного бэкапа? Согласен, не надо! Почитал. Но я видел САМ реально, как после падения сервера у ребят была целая проблема восстановления базы данных. Ну и что? И сделал из этого неправильные выводы. И теперь на их основе будешь дальше кормить свои страхи? В общем, если база грохнулась, видимо надо пользоваться AttachDatabase из резервной копии без восстановления лога? И откуда это "видимо"? Теперь еще и в этой ветке мне надо писать "КАК люди до этого додумываются?" Так? Тем более Express версия это позволяет. Мне просто нужно, чтобы в голове был четкий план конкретных действий "на случай войны" Вот для этого и предлагается почитать про бэкапы и стратегии бэкапирования.
Кстати, насчет bat-файлов: достаточно ли будет написать bat-файл, стартующий из планировщика Windows, например в 01:00 ночи (когда заведомо никто с базой не работает) просто копирующий 2 файла *.mdf и *.ldf базы данных Как у тебя все просто! И кто тебе их даст? Они открыты в монопольном режиме сервером. в отдельную папку. Можно ли потом, в случае аврии, будет просто заменить рабочую БД на эти ранее сохраненные в отдельном месте 2 файла без дополнительных плясок с бубном?
Рома! Ты неисправим! Пока что ты сам себе создаешь проблемы и героически пытаешься их решить. Еще раз - брось свои файл-серверные замашки.
В батнике, запускаемом виндовым шедулером в 01-00, пишешь запуск sqlcmd со скриптом бэкапирования. Для начала этого уже хватит.
Исправлено: ssa, 11.09.09 15:58
2alex11100 Поясните, а что в коде делает вот эта строка? Разве @nResult не достаточно?Ну уж раскрой еще один секрет, раз уж ты пользуешься не командой SqlExec, а одноименным методом своего класса (объекта) oServer с переставленными местами параметрами по отношению к стандартному SqlExec. какую цель преследует передача туда значения set("Datasession") в строке:
Не видно что внутри oServer.SqlExec().
Ну зачем передавать датасессию то вполне понятно - методы объекта всегда работают в той датасессии, в которой объект был создан - и этот самый oServer судя по всему создаётся как глобальный объект - а курсоры, которые он порождает, очевидно должны создаваться в разных датасессиях - вот и приходится передавать номер и внутри метода явно туда переключаться - и не забывать переключаться обратно по завершении метода кстати.
Задача «Очистка после обслуживания» удаляет файлы, относящиеся к планам обслуживания, включая файлы резервных копий баз данных и отчеты, созданные планами обслуживания. Дополнительные сведения см. в разделах Планы обслуживания и Резервное копирование и восстановление баз данных SQL Server.
С помощью задачи «Очистка после обслуживания» пакет может удалять файлы резервных копий или отчеты планов обслуживания на указанном сервере. Задача «Очистка после обслуживания» имеет параметр удаления специфических файлов или удаления группы файлов в папке. При необходимости можно указать расширение удаляемых файлов.
При настройке задачи «Очистка после обслуживания» для удаления файлов резервных копий по умолчанию установлено расширение файла BAK. Для файлов отчета расширение по умолчанию — TXT. При необходимости расширение можно изменить; единственное ограничение: расширение должно иметь меньше 256 символов.
Если необходимо удалить старые ненужные файлы, задача «Очистка после обслуживания» может быть настроена для удаления файлов, существующих определенный период времени. Например, задача может быть настроена на файлы, существующие дольше двух недель. Можно указать давность удаляемых файлов, используя дни, недели, месяцы и годы. Если минимальный срок для удаления файлов не устанавливается, удаляются все файлы указанного типа.
В отличие от ранних версий задачи «Очистка после обслуживания» версия SQL Server этой задачи не удаляет автоматически файлы во вложенных каталогах указанной папки. Это ограничение сокращает контактную зону любой атаки, использующей функции задачи «Очистка после обслуживания» для умышленного удаления файлов. Для удаления вложенных папок первого уровня необходимо выбрать это действие, установив флажок Включить вложенные папки первого уровня в диалоговом окне Задача "Очистка после обслуживания" .
Настройка задачи «Очистка после обслуживания»
Свойства задаются с помощью конструктора служб Integration Services . Эта задача находится в разделе Задачи плана обслуживания****области элементов в конструкторе служб Integration Services .
Дополнительные сведения о свойствах, которые можно задать в конструкторе служб Integration Services , см. в следующем разделе:
Связанные задачи
Дополнительные сведения о настройке свойств этих свойств в конструкторе Integration Services см. в разделе Задание свойств задач или контейнеров.
Для сохранения целостности структуры баз данных и обеспечения нормальной производительности необходимо проводить периодическое обслуживание. В этой статье рассмотрим какие задания по обслуживанию необходимо выполнять для баз данных 1С Предприятия, размещенных в MS SQL.
Настройка плана обслуживания баз данных MS SQL Server выполняется через программу Microsoft SQL Management Studio. Рассмотрим задачи, которые мы будем выполнять в рамках регулярного обслуживания баз данных:
-
(раз в неделю, в воскресенье в 2:00); (раз в день, с понедельника по субботу в 2:00); (раз в день); (раз в день в 4:00); (раз в день).
В чем отличие полного бэкапа от разностного?
Полное резервное копирование сохраняет всю базу данных целиком.
Разностное резервное копирование сохраняет все изменения созданные в базе данных с момента последнего полного бэкапа.
Такой подход к резервному копированию позваляет экономить свободное пространство на носителях информации.
Создание полного бэкапа базы.
В обозревателе объектов переходим к пункту "Управление \ Планы обслуживания". В контекстном меню выбираем "Создать план обслуживания".
В этом основном плане обслуживания будем создавать вложенные планы полного бэкапа, промежуточного (разностного) бэкапа, перестроение индекса и обновление статистики.
В созданном плане нажимаем кнопку "Добавление вложенного плана"
Вводим название "Полный бэкап" и описание. Задаем расписание для выполнения задания: Раз в неделю в воскресенье в 2:00.
Добавляем в созданный план задание. Для этого с панели элементов перетаскиваем в поле заданий вложенного плана элемент с названием Задача "Резервное копирование базы данных".
Открываем задание на редактирование: правой клавишей мыши по заданию, выбираем пункт "Изменить".
- Тип резервной копии: Полное;
- Базы данных: если выбрать "Все пользовательские базы данных", то будет выполняться бэкап всех созданных вами баз данных, но есть возможность указать на конкретные базы;
- Создать файл резервной копии для каждой базы данных: отмечаем пункт "Создавать вложенный каталог для каждой базы данных", чтобы удобнее было ориентироваться в бэкапах и указываем путь как папке, в которой будут храниться резервные копии;
- Отмечаем пункт "Проверять целостнойсть резервной копии";
- Устанавливаем параметр "Сжимать резервные копии".
Создание разностного бэкапа.
Создание плана на выполнение разностного бэкапа выполняется аналогично полному бэкапу.
Отметим некоторые отличия в настройке:
- Расписание выполнения заданий: с понедельника по субботу в 2:00;
- Тип резервной копии выбираем "Разностное"
Очистка устаревших бэкапов.
Для очистки устаревших бэкапов баз 1С Предприятия в MS SQL выбираем на панели элементов плана обслуживания Задачу "Очистка после обслуживания".
В моем случае разностный и полный бэкап хранятся в одной папке. Поэтому я добавляю только одно такое задание во вложенный план для разностного бэкапа. Если вы резервные копии будете хранить отдельно, то лучше создать отдельное задание в плане каждого бэкапа.
Перетаскиваем задачу с Панели элементов в план и задаем такие настройки:
- Удалить файлы следующего типа: Файлы резервных копий;
- Удалить из папки файлы с определенным расширением: указываем папку хранения бэкапов баз 1С;
- Включить вложенные папки первого уровня: отмечаем галочкой, потому-что у нас для бэкапов баз создаются отдельные папки
- Удалить файлы на основе возраста во время выполнения задачи: здесь все ограничивается лишь вашими потребностями и объемом жесткого диска, а мне достаточно 4 недель.
Чтобы в текущем плане после выполнения первого задания начало выполнятся следующее, их необходимо соединить между собой стрелками. Для этого выделяем первое задание и ведем стрелку от него к следующему.
Через стрелки можно задавать условие, при котором будет выполнять следующее задание: ошибка, успешное завершение, выполнение. Изменить условие можно щелкнув правой клавишей мыши по стрелке.
По умолчанию стрелка зеленого цвета. Это значит, что следующее задание будет выполняться только при успешном завершении первого. Это условие подходит для моего случая.
Переходим к очень важному и ответственному пункту: Перестроение индекса и обновление статистики.
Дефрагментация индекса (реорганизация или перестроение).
В процессе работы базы данных 1С Предприятия, в результате постоянной записи и удаления данных, образуются пустые (фрагментированные) области. По этой причине может увеличиваться бесполезный объем БД и замедляться скорость взаимодействия с ней.
Для устранения фрагментированных областей баз данных в MS SQL существует возможность проведения Реорганизации индекса и Перестроение индекса.
В чем разница между реорганизацией и перестроением?
Перестроение индекса означает, что фрагментация будет устранена путем удаления и пересоздания индексов.
При Реорганизации индекска происходит перестроение индексов в соответствии с логическим порядком. Этот способ наименее ресурсозатратный и является более предпочтительным для регулярного обслуживания баз данных.
В каких случаях требуется реорганизация индекса?
- Уровень фрагментации от 5% до 30%, то проводим реорганизацию.
- Фрагментация свыше 30% необходимо проводить перестроение индекса
Под выполнение этих задач очень подходит инструкция Transact-SQL со следующим содержимым:
Создаем вложенный план с названием "Дефрагментация индекса и обновление статистики" с расписанием раз в день в 4:00 и перетаскиваем в него из Панели элементов Задачу "Выполнение инструкции T-SQL".
Вставляем в задачу приведенную выше инструкцию T-SQL.
Обновление статистики.
Обновление статистики в базах данных MS SQL, как и дефрагментация индекса, имеет большое значение для повышения производительности работы SQL сервера. Благодаря обновлению статистики SQL Server способен более эффективно выполнять планы запроса.
Выбираем на панели элементов Задача "Обновление статистики" и добавляем ее во вложенный план "Дефрагментация индекса и обновление статистики".
- Базы данных: все пользовательские базы данных;
- Обновить: вся собранная статистика;
- Тип просмотра: полный просмотр.
При помощи стрелки связываем условием выполнение задачи по обновлению индекса с задачей по дефрагментации. Таким образом в случае успешного выполнения дефрагментации будет проведено обновление статистики.
Читайте также: