Имя: Пароль:
1C
1С v8
Автоматическое резервное копирование на ftp
0 Adolf88
 
07.08.15
17:18
Всех с пятницей, коллеги!
Возник вопрос по поводу бэкапа баз в SQL 2005. Сейчас делаем так:
1) Выгружаем бэкап средствами sql в *.bak
2) Архивируем в *.rar через сценарий Transact SQL. На этом шаге файлу присваивается уникальное имя - имя базы+дата создания архива
3) удаляет *.bak
Сливается всё это на хард, подключенный к этому же компу. Для пущей надежности хотелось бы иметь ещё одну копию где-нибудь. Задумал использовать для этого облака, однако скорость у всех тестируемых мной программ (Iperius Backup, Cloudberry Backup, Handy Backup) прости катастрофически низкая. Максимум, чего удалось достичь - 150кбайт/сек на Google Drive. Для нас это абсолютно не приемлемо. Теперь пришла идея бэкапить на ftp-шник в локалочке.
И в связи с этим вопрос - как можно с помощью скриптов T-sql, ну или CmdExec'a:
1) Получить имя самого последнего файла в папке?
2) Закинуть этот файл на ftp?
Со вторым более менее понятно - в CmdExec есть команда "ftp". А вот над первым что-то я призадумался.
Да и вообще, делитесь своим опытом, как вы бэкапите.
1 ДенисЧ
 
07.08.15
17:25
Если фтп в локалке, может проще на него просто копировать как на файл-сервер?
2 sash-ml
 
07.08.15
17:27
как то так
CREATE TABLE #DirectoryTree (

       id int IDENTITY(1,1)

      ,subdirectory nvarchar(512)

      ,depth int

      ,isfile bit);




INSERT #DirectoryTree (subdirectory,depth,isfile)

EXEC master.sys.xp_dirtree 'D:\Backup\TRON4\TEST2\MyDb1',1,1;




SELECT * FROM #DirectoryTree

WHERE isfile = 1 AND RIGHT(subdirectory,4) = '.BAK'

ORDER BY id;

GO
3 gigi789
 
07.08.15
17:29
4 Demasiado
 
07.08.15
17:31
(0) Яндекс диск? поставить тулзу и она автоматом синхронизирует в облако
5 ДенисЧ
 
07.08.15
17:32
(4) "Надумал использовать для этого облака,"
6 Adolf88
 
07.08.15
17:34
(1)
Если бы это было так просто, то я бы уже давно так сделал. Проблема в том, что в качестве выходного пути для скрипта, который из батника делает архив, нельзя указать путь к каталогу на ftp. Чтобы залить что-то на ftp, к нему надо вначале подключиться при помощи ряда команд, а потом уже заливать файл.
(3) Благодарю за ссылку. Но не подходит. Сейчас объясню, почему. Дело в том, что сеть в последнее время наводнило большое количество адовых шифровальщиков и если такой вдруг проникнет на сервер, то скорее зашифрует к чертям и те бэкапы, которые на локальных дисках и те, которые на ftp, подключенных, как локальные. С меньшей долей вероятности он подключиться к sql-серверу, найдет там регламентные задания, из заданий выдернет логин-пароль, подключится с этим логином-паролем и зашифрует файло. Поэтому тут только варик со скриптовой заливкой на ftp. (2) Благодарю, сейчас буду проверять.
(4) Яндекс диск тоже видится, как локальный диск на компе, так же не особо приемлемый вариант.
7 Demasiado
 
07.08.15
17:34
(5) ЯД тоже вроде облачный, или я не прав?
8 Demasiado
 
07.08.15
17:35
вононоче, Михалыч...(с)
9 Adolf88
 
10.08.15
11:30
(2)
Благодарю, работает. Но не совсем так, как я требуется. Оно выдает список всех файлов. А мне нужно только самый поздний.
10 sash-ml
 
10.08.15
11:39
(9) Используй курсор, пример ниже выберет первую строку в переменную
DECLARE @fileName VARCHAR(512)

DECLARE my_cur CURSOR FOR
SELECT subdirectory FROM #DirectoryTree

OPEN my_cur

FETCH NEXT FROM my_cur INTO @fileName
CLOSE my_cur
DEALLOCATE my_cur
11 Adolf88
 
10.08.15
11:58
(10) Говорит, что запрос успешно выполнен. Результат - пустой.
12 sash-ml
 
10.08.15
12:31
(11) в смысле пустой, ведь был список файлов, имя файла должно быть в переменной.
допиши вывод если хочешь проверить содержимое переменной
SELECT @fileName as fileName
13 Jump
 
10.08.15
12:42
(0)Если речь про локалку -
Поднимаешь любой самый легкий фтп, на сервере где база - на бэкап сервере любой консольный фтп клиент, например wget,  запускается из планировщика и вытягивает бэкап.
14 Adolf88
 
10.08.15
14:01
(12)
Теперь работает.
Только после второго запуска sql выдает ошибочку
Сообщение 2714, уровень 16, состояние 6, строка 1
В базе данных уже существует объект с именем "#DirectoryTree"
В принципе, всё логично.
Можно создать таблицу разок, потом при каждом запуске делать delete.
Теперь вопрос - а при обновлении конфигурации (у нас все типовые) таблица #DirectoryTree не слетит?
И можно как-нибудь обойтись без создания этой таблицы? Просто передать результат sys.xp_dirtree в таблицу, и выбрать из неё первую запись?
15 magicSan
 
10.08.15
14:04
??? кидаешь текущий бекап в папку "текущий" и дальше с этой папки именуешь как хочешь и грузишь в облака , фтп, локальную копию и куда угодно
16 Adolf88
 
10.08.15
14:05
(10)
Блин, невнимательно посмотрел. Возвращает имя первого файла (нужно последнего).
17 Adolf88
 
10.08.15
14:07
(15) Текущий бэкап создаётся в формате *.bak и довольно увесистый. Я же хочу его архивировать в *.rar (имя которого заранее неизвестно) и уже архив кидать на ftp.
18 magicSan
 
10.08.15
14:07
(17) В плане обслуживания сразу архивируй.
19 Adolf88
 
10.08.15
14:11
(18) Так и делаю.
Ты предлагаешь такой вариант, при котором будет доступна только последняя копия файла (т.к. у него всегда будет заранее определенное одинаковое имя). Мне же нужно, чтобы архив хранился за последний месяц по дням, и имя каждого файла было "имя базы"+ддммгггг.rar.
20 magicSan
 
10.08.15
14:13
(19) нет там будет текущая и из неё ты уже будешь копировать с любым иминем куда хочешь.
21 magicSan
 
10.08.15
14:13
(19) Хочешь сказать сжатую базу ещ раз пережимаешь? ахахах
22 magicSan
 
10.08.15
14:14
(19) Ты сжатую базу жмешь ещё раз раром???
23 sash-ml
 
10.08.15
14:15
(16) если имена файлов у тебя нормально можно сортировать то сортируй выборку чтобы первый был последний
ORDER BY subdirectory DESC
разные базы складывай в разные папки, или при выборке на каждую базу накладывай фильтр
RIGHT(subdirectory,4) = '.BAK' AND LEFT(subdirectory,3) = = 'УПП'
24 Adolf88
 
10.08.15
14:19
(22)
Нет.
>ты уже будешь копировать с любым иминем куда хочешь
Чтобы скопировать с этим именем, мне это имя нужно сначала получить. Присваивается имя в ходе архивации из *.bak в *.rar.
(23)
Вот, теперь ровно то, что надо. Благодарю. Осталось только на ftp залить.
25 magicSan
 
10.08.15
14:21
facepalm
1. Планом сжимаешь базу кидаешь в база.бэк
2. из база бэк копируешь куда хочешь и в этот момент меняешь имя
26 sash-ml
 
10.08.15
14:23
(14)
if object_id('tempdb..#DirectoryTree ') is not null
    drop table #DirectoryTree
27 sash-ml
 
10.08.15
14:34
28 Adolf88
 
10.08.15
14:34
(26)
Как-то непонятно object_id работает. Таблицу в списке таблиц вижу, а object_id вся равно null возвращает.
29 Adolf88
 
10.08.15
14:41
(26)
Сорян, протупил маленько. Работает object_id как надо.
30 Adolf88
 
10.08.15
14:53
(27)
Спасибо тебе, мил человек.
31 sash-ml
 
10.08.15
14:58
(30) этот  скрипт пишет команды ФТП во временный файл, такчто файлик нужно удалять после аплоада
32 Rlogin
 
10.08.15
15:02
Скулем выгружаешь всегда в одно место.
А сторонним софтом забираешь оттуда, сжимаешь и рассовываешь по местам хранения, например другой каталог в сети и фтп (я обычно в 2 места кладу).
В качестве софта уже не первый год исправно трудится Cobian Backup
33 Adolf88
 
10.08.15
15:05
(31)
Буду иметь в виду.
(32)
Cobian Backup не пробовал. Обязательно надо его оценить.
34 Dmitrith
 
10.08.15
15:05
У меня полный бэкап делается в определенное время. Минут через 15 запускается батник, который копирует все сегодняшние файлы (по имени файла) в сеть:

@Echo Off
set god=%date:~-4%
set mes=%date:~3,2%
set den=%date:~0,2%
set if=my_base_backup_%god%_%mes%_%den%*.bak

echo %ddt% %mes% %den%
echo %if%

rem my_base_backup_2015_06_29_060002_0308325.bak
copy C:\tmp\my_base\%if% \\server\%god%\
Ошибка? Это не ошибка, это системная функция.