Модераторы: skyboy

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Найти файлы и определить по имени их дату? 
:(
    Опции темы
Nicholas
  Дата 31.10.2013, 05:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 30.9.2004

Репутация: нет
Всего: 0



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

Надо сделать так чтобы при каждой архивации скрипт находил всей файлы в каталоге и в зависимости от даты создания (она указана в имени файла) удалял файлы которые хранятся больше месяца.

Честно говоря с SQL я не дружу, поэтому буду рад готовому скрипту в котором нужно сделать небольшие доработки. smile



Это сообщение отредактировал(а) Nicholas - 31.10.2013, 05:17
PM MAIL ICQ   Вверх
Akina
Дата 31.10.2013, 07:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



 smile А при чём тут SQL?


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Nicholas
Дата 31.10.2013, 07:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 30.9.2004

Репутация: нет
Всего: 0



При том,  что бекап и архивация у меня на скрипте SQL написана, хочу добавить удаление старья.

вот сюда:

Код

DECLARE @name varchar(100)
DECLARE @cmd sysname



-- Резервное копирование --------------------------------------------------------------------------------------------------------------

-- База 2013
SELECT @name = '2013'

exec( 'BACKUP DATABASE '  +@name+' TO  DISK = N''e:\backup$\arh\'+@name+'.bak'' WITH INIT ,  NOUNLOAD ,  NOSKIP ,  STATS = 10,  NOFORMAT')


-- Архивирование ------------------------------------------------------------------------------------------------------------------------------

-- База 2013
SELECT @name = '2013'

SET @cmd = 'e:\backup$\Rar.exe a -ag -df e:\backup$\arh\' +@name+ '_ e:\backup$\arh\' +@name+ '.bak'
exec master..xp_cmdshell @cmd



Это сообщение отредактировал(а) Nicholas - 31.10.2013, 07:40
PM MAIL ICQ   Вверх
Akina
Дата 31.10.2013, 08:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Создайте стандартный план обслуживания БД - там есть в т.ч. и пункт удаления файлов старше указанного возраста.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Nicholas
  Дата 1.11.2013, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 30.9.2004

Репутация: нет
Всего: 0



Цитата(Akina @ 31.10.2013,  08:21)
Создайте стандартный план обслуживания БД - там есть в т.ч. и пункт удаления файлов старше указанного возраста.

Не видел я там такого, подскажи где.

Короче сделал проще, для меня проще. 
Т.к. все файлы лежат в одной директории, то просто удаляю все у которых в имени старше двух месяцев дата указана.

Код

DECLARE @name varchar(100)
DECLARE @path varchar(255)
DECLARE @day  varchar(2)
DECLARE @cmd sysname

-- База 2013
SELECT @name = '2013'

-- формируем имя удаляемых файлов давностью 2 месяца 
set @Month = right('0'+CONVERT(varchar(3),MONTH(SYSDATETIME())-2),2);

--print 'Month =' + right('0'+CONVERT(varchar(3),MONTH(SYSDATETIME())),2);

-- путь удаляемых файлов
set @path = 'e:\bek'

-- формируем командную строку для выполнения 
set @cmd ='del /q '+ @path +'\'+ @name + '_'+CONVERT(varchar(5),YEAR(SYSDATETIME ( ))) + Cast(@month as varchar)+ '*';

-- удаляем! :)
exec master..xp_cmdshell @cmd

PRINT 'Полученные параметры = " ' + @cmd + ' "' 


Это сообщение отредактировал(а) Nicholas - 1.11.2013, 10:00
PM MAIL ICQ   Вверх
Akina
Дата 1.11.2013, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Цитата(Nicholas @  1.11.2013,  10:57 Найти цитируемый пост)
Не видел я там такого



Присоединённый файл ( Кол-во скачиваний: 10 )
Присоединённый файл  1.jpg 77,33 Kb


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Nicholas
Дата 1.11.2013, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 30.9.2004

Репутация: нет
Всего: 0



А ну там удаляет файлы бекапа которые sql делает,а у меня то архивы лежат на сетевом хранилище...
PM MAIL ICQ   Вверх
Akina
Дата 1.11.2013, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Ты всё ещё не дошёл до простой мысли, что твои архивы, валяющиеся в файловой системе две недели, уже вообще никаким боком не привязаны к SQL-серверу?

Удаляй их планировщиком ОС в рамках стандартного еженедельного обслуживания дисковой подсистемы сервера.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Nicholas
  Дата 6.5.2015, 05:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 30.9.2004

Репутация: нет
Всего: 0



Цитата(Akina @  1.11.2013,  14:36 Найти цитируемый пост)
Ты всё ещё не дошёл до простой мысли, что твои архивы, валяющиеся в файловой системе две недели, уже вообще никаким боком не привязаны к SQL-серверу?

Удаляй их планировщиком ОС в рамках стандартного еженедельного обслуживания дисковой подсистемы сервера. 


Сейчас уже дошел...  smile  smile 

Но это не показатель, в общем все,что мне нужно это определить дату создания (не модификации) файла. Вопрос как это сделать, НЕ по имени, а прочитав свойства файла?

Список файлов я получаю вот так, удалить тоже не проблема через xp_cmdshell, вопрос только в дате, помогите может кто знает, на всех форумах твердят одно причем тут sql да не причем, просто я так хочу вот и все.

Код

DECLARE @Path VARCHAR(100)
SET @Path = 'E:\backup$\arh\SSm'

-- получение списка файлов 
IF OBJECT_ID('TEMPDB..#dirtree') IS NOT NULL DROP TABLE #dirtree
CREATE TABLE #dirtree(ID int NOT NULL identity(1,1) primary key, subdirectory VARCHAR(256), depth INT, [file] INT)
INSERT INTO #dirtree (subdirectory,depth,[file]) EXEC xp_dirtree @Path, 0, 1

declare @id bigint
declare curs cursor fast_forward --static
for
select id
from #dirtree
open curs
fetch next from curs into @id

while @@fetch_status = 0
   begin --Начало для цикла перебора курсора    
      Declare @myfile VARCHAR(100)
      select @myfile = subdirectory FROM #dirtree WHERE id = @id
      
      print 'Идентифтикатор строки =' + RTRIM(@id)+' имя файла ='+RTRIM(@myfile)
      fetch next from curs into @id 
   end--Конец цикла перебора курсора
close curs
deallocate curs


Это сообщение отредактировал(а) Nicholas - 6.5.2015, 06:31
PM MAIL ICQ   Вверх
Nicholas
  Дата 7.5.2015, 03:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 30.9.2004

Репутация: нет
Всего: 0



В общем так...
У меня бекапятся базы, каждая в свой каталог и в имени файла у всех дата, добавил код в процедуру бекапа и теперь каждый раз после создания нового, sql проверяет есть ли файлы старше 10 дней, если есть удаляет.

Код

DECLARE @Path VARCHAR(100)
Declare @fileDate VARCHAR(100)
DECLARE @cmd sysname

SET @Path = 'E:\backup$\arh\SSmart'

-- получение списка файлов 
IF OBJECT_ID('TEMPDB..#dirtree') IS NOT NULL DROP TABLE #dirtree
CREATE TABLE #dirtree(ID int NOT NULL identity(1,1) primary key, subdirectory VARCHAR(256), depth INT, [file] INT)
INSERT INTO #dirtree (subdirectory,depth,[file]) EXEC xp_dirtree @Path, 0, 1
--select * FROM #dirtree
-- получаем системную дату
--select convert(char,GetDate(),108) as CurretT
--select convert(char,GetDate(),110) as CurretD

declare @id bigint
declare curs cursor fast_forward --static
for
select id
from #dirtree
open curs
fetch next from curs into @id

while @@fetch_status = 0
   begin --Начало для цикла перебора курсора    
      Declare @myfile VARCHAR(100)
      select @myfile = subdirectory FROM #dirtree WHERE id = @id
      set @fileDate = left(right(@myfile,18),8)
  --    print 'Идентифтикатор строки =' + RTRIM(@id)+' имя файла ='+RTRIM(@myfile)+' дата='+RTRIM(@filedate)
   --   print 'Дата раньще которой надо удалить бекапы='+Convert(Varchar, dateadd(DAY,-10,GETDATE()), 112)
      if @filedate <  Convert(Varchar, dateadd(DAY,-10,GETDATE()), 112) 
      begin
            print 'Найден бекап старше 10 дней - будем удалять файл '+@Path+'\'+@myfile
            set @cmd = 'del /q '+ @path +'\'+ @myfile
            print '@cmd='+@cmd 
        --    exec master..xp_cmdshell @cmd
        end 
    fetch next from curs into @id -- увеличение счетчика строк
   end--Конец цикла перебора курсора
close curs
deallocate curs


Надо в этот код еще добавить проверку на существование свежих файлов, перед удаление старых и будет нормально...

Это сообщение отредактировал(а) Nicholas - 7.5.2015, 03:32
PM MAIL ICQ   Вверх
Akina
Дата 7.5.2015, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Ну почему надо делать непременно через задницу? Напиши ты простейший VBS-скрипт, который выполняет поставленную задачу! а его уже, если прёт, запускай из SQL-процедуры.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Nicholas
Дата 7.5.2015, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 30.9.2004

Репутация: нет
Всего: 0



vbs  для меня китайская грамота, проще в sql разобраться. и почему через зад не понятно, что плохого в этом коде?
PM MAIL ICQ   Вверх
Akina
Дата 7.5.2015, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Цитата(Nicholas @  7.5.2015,  12:40 Найти цитируемый пост)
почему через зад не понятно, что плохого в этом коде? 

Ну как тебе сказать... 
Вот есть задача. Всегда найдётся инструмент, предназначенный для решения этой задачи. Или по крайней мере наилучшим образом подходящий для её решения. И есть куча инструментов, которые хоть и не предназначены, но тем не менее помогут её хоть как-то решить. Ну классические примеры - гвозди и микроском, королевская печать и орехи...
Так вот в данном случае ты берёшь не предназначенный для этой задачи инструмент, а именно какой попался под руку. Просто потому, что ты с ним больше знаком. Вот тот самый случай, когда биолог забивает гвозди микроскопом, потому как тот ему более родной, чем молоток.

Цитата(Nicholas @  7.5.2015,  12:40 Найти цитируемый пост)
vbs  для меня китайская грамота

Ну напиши на любом другом языке программирования, какой для тебя не китайская грамота. 
Хотя, если честно, то написание VBS-кода для ТАКОЙ задачи - совершенно элементарная вещь.
Код

' Определить переменные
Dim fso, fldr, f
' Получить объект для работы с файловой системой
Set fso = CreateObject("Scripting.FileSystemObject")
' Подключиться к нужному каталогу - тут можешь подставить свой
Set fldr = fso.GetFolder("c:\archives")
' Перебрать все файлы в каталоге
For Each f In fldr.Files
    ' Если дата создания меньше, чем текущая минус 1 месяц
    ' Можешь использовать другие его свойства, например, .DateLastModified
    If f.DateCreated < DateAdd("m", -1, Now()) Then
        ' Удалить файл
        f.Delete
    End If
Next


Добавлено через 13 минут и 20 секунд
PS. Не клади сам скрипт в папку архивов - а то через месяц он сам себя удалит...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Nicholas
  Дата 13.5.2015, 03:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 30.9.2004

Репутация: нет
Всего: 0



Akina, а как сделать перебор еще и по подпапкам внутри указанной?
PM MAIL ICQ   Вверх
Akina
Дата 13.5.2015, 08:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Оформить приведённый код как процедуру-1, принимающую каталог для удаления файлов.
По аналогии написать код процедуры-2, который не только вызывает процедуру-1 для текущего каталога, но и получает список подкаталогов текущего каталога и вызывает себя для каждого из них рекурсивно. 
В основной процедуре вызывать процедуру-2 для начального каталога.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.0896 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.