Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS Windows > Умное резервное копирование + расписание


Автор: fridkaratel 5.5.2011, 11:30
Возник такой вопрос касаемо резервного копирования.

Изучение материалов в интернете, программ и документаций не привело к тому, что хотелось бы сделать.
Всё не то... или не так..

Суть задачи:
1. Имеются папки с файлами, например, C:\Documents; C:\Letters и т.п.
2. Необходимо, скажем, каждый день в 00:00 проверять, есть ли изменения в папках - смотреть, судя по всему, по датам изменения файлов
3. Если изменения есть, то паковать в архив WinRAR с макс. сжатием
4. Созданный архив перемещать в папку на сетевом диске.

Так как имеются два компьютера, то структура папок на сетевом диске такая:
Код

S:\
    USER-PC
        C
            Documents
            Letters
    USER-NOTEBOOK
        D
            Users
                USER-NOTEBOOK
                    Desktop

То есть, чтобы сохранялись все пути согласно расположению на локальном компьютере.
Здесь USER-PC и NOTEBOOK-PC - это имя компьютера; S:\ - сетевой диск с полным доступом чтения/записи.

Плюсы bat-файла:
1. Удобное и быстрое редактирование
2. Не нужно ничего устанавливать из стороннего ПО
3. Запуск по расписанию встроен в Windows 7
4*.Бэкап БД можно сделать также через запрос по http к Sypex Dumper'у.

Минусы bat-файла:
1. Довольно сложно писать что-то более "разумное"
2. Слишком много "букав" smile
3. Не всё можно сделать средствами bat-файла, зачастую приходится очень извращаться
4. Вообще, написание чего-то сложного в bat-файле - это написание костылей... smile

Что касается специализированного софта, то:
1. Может быть я не нашёл ещё такого софта, что выполняет эти задачи
2. В основном, попадались или программы для полного копирования диска, или же мелкие типа "скопировать из одного места в другое в заданное время"
3. Нельзя указать, что если есть изменения - делай копию всей папки, если изменений нет - не делай копию.
4. Как написал выше, всё не то... smile
5. Не везде есть поддержка бэкапа базы данных MySQL

P.S.: Приведу пример, для чего это необходимо...
Имеется локальный веб-сервер, на котором в сети держатся порядка 10ти сайтов и сервисов.
Например, сегодня я решил улучшить один из сайтов, внёс изменения, поправил картинки/скрипты и т.п.
Ночью, когда все спят и никаких изменений не производится, надо сделать резервную копию всей папки с этим сайтом, а не только изменённых файлов.
В остальных 9ти никаких изменений не произошло, соответственно резервные копии смысла делать нет.

Автор: Akella 6.5.2011, 12:56
Ну и.... на каком шаге ошибка?

Автор: mihanik 6.5.2011, 13:07
Есть ОЧЕНЬ ХОРОШАЯ встроенная утилита.
NTBACKUP называется.

Почитай описалово.
Я бы использовал именно её.

Автор: CompWorm 6.5.2011, 13:10
из той "сути", что ты описал, всё вполне выполнимо в рамках батника.

запости батник и какие ошибки он выдаёт.

Автор: Akella 6.5.2011, 13:56
Цитата(fridkaratel @  5.5.2011,  11:30 Найти цитируемый пост)
1. Может быть я не нашёл ещё такого софта, что выполняет эти задачи

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

Автор: fridkaratel 6.5.2011, 14:24
По-порядку... smile

1. Мне не надо копировать только изменившиеся - мне надо копировать ВСЮ папку со всеми подпапками и файлами, если в этой папке имеется хотя бы один изменившийся или добавленный файл...

2. Должна быть возможность исключить часть файлов из обработки как по расширению, так и по названию папки... Например, есть резервные копии IDE, той же Aptana Studio или же кэш тысяч страниц, чтобы не запрашивать каждый раз БД... Понятное дело, что кэш я могу, если понадобится, сделать заново - зачем мне его хранить в резервной копии smile

3. В BAT-файле проблемно пробежаться по всем файлам, да и вообще работать с подстроками, выделением чисел из текста и т.п. Из-за этого сложности создать тот путь, который я описал в начале топика.

4. Я больше склоняюсь к BAT-файлу, но у него нет интерфейса, что не есть гуд... Более того, отслеживание ошибок, процесса выполнения (например, упаковки архива) и т.п. - это трудный процесс, потому что в BAT-файл не заложено таких возможностей, а, следовательно, надо делать "на костылях"... Я вообще думал, написать Adobe AIR приложение на JavaScript'е... smile

5. Не приемлим вариант создания бэкапа в какой-то собственный формат программы... Лучше вообще в ZIP паковать - и кроссплатформенно, и не зависит от установленных на компьютере программ...

6. Ошибок никаких нет... Я писал BAT-файл, пытался что-то вразумительное сделать, но потом удалил его... Намучился и не сдержался smile Всё там было относительно просто:
Код

::====================================================================================================================================
:: >> Основные настройки скрипта
@echo off
setlocal
:: << << <<
::====================================================================================================================================
:: >>Назначаем необходимые переменные
set BACKUP_DIR=S:\
set PC_NAME=USER-PC
:: Здесь, конечно, хорошо бы не вручную задавать имя компьютера, а брать из netstat или чего-то в этом духе...
set WINRAR=C:\Program Files\WinRAR\WinRAR.exe
:: << << <<
::====================================================================================================================================
:: >> Определяем массив папок для копирования
set "FOLDER:01=C:\Documents"
set "FOLDER:02=C:\Letters"
set "FOLDER:03=W:\XAMPP"
:: ...и так далее...
:: << << <<
::====================================================================================================================================
:: >>  Упаковка файлов в архив
:: Здесь происходит упаковка в архив с макс. сжатием, вместо имени файла идёт дата последнего изменения
for /f "tokens=2 delims==" %%i in ('set FOLDER') do (
    "%WINRAR%" "%%i" /ключи для упаковки
)
:: Думал как делать - сжимать в архив каждый день в 00:00.
:: Так как имя архива - это самая последняя дата в изменении файлов, поэтому, если не было изменений, архив будет иметь одно и тоже имя.
:: Если в папке бэкапа уже есть такой архив, то просто удаляем свежесозданный.
:: Если архива с таким именем нет, то перемещаем созданный архив в папку бэкапа.
:: << << <<
::====================================================================================================================================
:: Ну и, собственно перемещение через move, copy, xcopy - без разницы... С соблюдением той структуры папок, что я описал выше...
:: Только как из C:\Documents сделать папку S:\USER-PC\C\Documents? :)
::====================================================================================================================================
pause


Проблемы:
1. У меня есть папки, в которых несколько Гб информации... Соответственно, если сначала упаковывать с макс. сжатием, а потом проверять, есть ли изменения - это как-то глупо smile Да и времени на упаковку мелких файлов с 10000 штук будет уходить немало...
2. Сложновато отлавливать ошибки... Если бы было try...catch, то другое дело, а так... Даже и сверить-то нечего... Вот возникнет ошибка при обработке WinRAR'ом, например, файл открыт будет (например, .htaccess или .error_log на веб-сервере)...
3. Не видно процесса упаковки/хода выполнения... Конечно, это можно сделать, но там опять же... ну не предназначет BAT для такого smile

Поэтому я и думал, что может кто видел или пользуется программами, которые могут мне подойти...
При старте топика я описал ситуацию, в которой мне нужен бэкап...
Чтобы в случае чего можно было не восстановить какие-то файлы из резервной копии, а откатиться целиком на ту версию сайта, которая была, скажем, месяц назад...

Во-от smile

Автор: Akella 6.5.2011, 15:44
Зачем в bat файле FOR?

Автор: fridkaratel 6.5.2011, 16:17
Цитата(Akella @ 6.5.2011,  23:44)
Зачем в bat файле FOR?

Чтобы упаковать каждую папку в отдельный архив и уложить в отдельные папки в бэкапе... smile

Автор: Akella 6.5.2011, 16:18
А что, в один архив нельзя? Зачем каждую папку в отдельный архив %)
Может вообще можно без упаковки?

Автор: fridkaratel 6.5.2011, 16:28
Цитата(Akella @ 7.5.2011,  00:18)
А что, в один архив нельзя? Зачем каждую папку в отдельный архив %)
Может вообще можно без упаковки?

Ну, во-первых, изменения могут быть только в одной из трёх (в одной из N) папок...

А, во-вторых, упаковка нужна ввиду того, что там может быть 10 000 файлов весом по 1-4 Кб... А то и меньше, соответственно, расход HDD на 2 Tb для резервных копий будет неразумным... Например, кластер размером в 16 Кб.

Ну и... мне не нужен быстрый доступ к резервным копиям, и в случае чего их можно быстро скопировать на другой жёсткий. Думаю, не стоит объяснять, почему 10 000 файлов по 1 кб будут копироваться в несколько раз медленнее, чем 1 файл в 10 Мб smile

Автор: Akella 6.5.2011, 16:56
Копируй всё в один архив без FOR. Winrar это умеет.

Автор: fridkaratel 6.5.2011, 19:43
Зачем мне один архив? Я же написал, что мне не нужен "дутый" архив со всеми папками и файлами - мне нужен только архив одной папки...

Хорошо, по-другому попробую... smile

У меня есть N проектов...
Сегодня я занимаюсь одним из них...
И мне надо в автоматическом режиме сделать копию этого проекта - упаковать в архив и закинуть на сетевой диск с соблюдением вложенности папок, как на моём компьютере.
Остальные проекты я сегодня не трогал, поэтому и копии делать с них не надо, разумно ведь... smile

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

Вот, это я считаю умной резервной копией...
Чтобы не плодить кучу-кучу копий или тупо одним куском делать резервную копию всего HDD...
У меня 4 HDD, и файлы лежат на разных диска - делать копии всех дисков? smile

По теме кто-нибудь может посоветовать что-нибудь дельное, может, куда ещё запостить?
Так сказать, в более "специфический" раздел или форум...?

Автор: 01MDM 7.5.2011, 07:30
fridkaratel,
А просто xcopy не подойдет? Я для бэкапа данных на внешнем HDD создал копию рабочей папки и просто запускаю:
Код

xcopy /e /d /y d:\files g:\files

Добавляются новые файлы, перезаписываются измененные, а старые, даже если они удалены из рабочей папки ( d:\files ), то они все равно остаются на g:\files. Для резервного архивирования можно и не создавать зеркальной папки, но тогда необходимо явно указать контрольную дату для сверки изменений. Например где-то так:
Код

@echo off
setlocal

for /f "tokens=1-3 delims=." %%i in ( "%date%" ) do set "ch_date=%%j-%%i-%%k"
xcopy /e /d:%ch_date% c:\project c:\%date%\
7z a c:\%date%.7z c:\%date%

pushd \\server\shara
move c:\%date%.7z
popd

rd /s /q c:\%date%

Т.е. здесь будут архивированы и отправлены на сетевой диск только файлы ( с сохранением структуры ), которые изменены начиная с даты указанной в ключе /d:m-d-y ( в примере выше я взял текущую дату )

Автор: MelkorLiGray 22.3.2012, 13:30
Всем привет, а у меня несколько другой вопрос. Не такой масштабный и не такой заковыристый. Конечно, как и всем - хочется щелк-щелк - готова, берем с полки пирожок. но для начала, мне нужно вот что:

Что бы вот в этом бат-фаиле автоматически вводился логин и пароль. 
А то он при запуске просит его ввести. 
Вот:
Код

@echo off

set dateOraStartUp=%date%_%time%
set dateOraStartUp=%dateOraStartUp: =_%
set dateOraStartUp=%dateOraStartUp:,=-%
set dateOraStartUp=%dateOraStartUp::=-%
set dateOraStartUp=%cd%\ab_full_%dateOraStartUp:.=-%

exp ab/%1@%2 grants=n owner=AB file='%dateOraStartUp%.dmp' log='%dateOraStartUp%.log'


ДА, я уже гуглил и продолжаю гуглить - ничего пока не понимаю, в том, что нахожу. 
Да, для понимания того, что нахлжу неплохо бы почитать справку ,и всякие ресурсы учащие писать bat файлы.
НО, мне пока нужно тупо вписать пару строк, а далее я уже, возможно займусь изучением написания этих штуковин, что бы доточить что там надобно.. 

Автор: kin 22.3.2012, 14:02
Привет!
Господа, зачем придумывать велосипед. fridkaratel, mihanik уже писал вам, что для вашей  задачи подойдет NTBACKUP. Если я Вас правильно понял, вся проблема  заключается в определении "изменялся/не изменялся". Так вот, Вы забыли про атрибуты объектов файловой системы, а в частности атрибут "архивный". Если вы почитаете описание NTBACKUP и поймете, как она работает, то сразу решите свою проблему, а если чуть-чуть пошаманите с ключами и опциями архиватора (если оно Вам нужно), то поймете, что ваша проблема превращается в ничто

Автор: Akina 22.3.2012, 16:19
Цитата(MelkorLiGray @  22.3.2012,  14:30 Найти цитируемый пост)
Всем привет, а у меня несколько другой вопрос. 

Влепите ему по самые гланды за нарушение Правил...

Цитата(kin @  22.3.2012,  15:02 Найти цитируемый пост)
fridkaratel, mihanik уже писал вам, что для вашей  задачи подойдет NTBACKUP. 

Внимательно прочитайте всё, что пишет ТС. NTBackup не сможет выполнить все требования. Особенно он спасует на архивации подкаталога на основе наличия в нём изменённого файла.

fridkaratel, с учётом всех требований - я более чем сомневаюсь в наличии подобной готовой утилиты... но если Вы намерены не останавливаться в поисках и писАть своё средство - рекомендую отказаться от батника в пользу написания VBS-скрипта.

Автор: MelkorLiGray 22.3.2012, 16:24
Цитата(Akina @  22.3.2012,  16:19 Найти цитируемый пост)
Влепите ему по самые гланды за нарушение Правил...



За что? 

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


Автор: Akina 22.3.2012, 18:06
MelkorLiGray, читайте Правила. Пункт 10.

Автор: kin 22.3.2012, 19:52
Цитата(Akina @  22.3.2012,  16:19 Найти цитируемый пост)
Внимательно прочитайте всё, что пишет ТС. NTBackup не сможет выполнить все требования. Особенно он спасует на архивации подкаталога на основе наличия в нём изменённого файла.
 Да, действительно, прочитал невнимательно..., остается только шаманить, со скриптами, батниками, архиваторами и пр...


Автор: Akina 22.3.2012, 20:17
Цитата(kin @  22.3.2012,  20:52 Найти цитируемый пост)
остается только шаманить

Да нет тут никакого шаманства. Из VBS просто рекурсивно обходим дерево каталогов и сканим в каждом файлы на предмет изменённости (критерий - придётся выбирать, тут есть тонкости). Как только попался изменённый файл - передаём каталог на обработку архиватору, и (в зависимости от ожидаемого количества архивов и допустимого числа одновременно запущенных архиваторов) либо ждём завершения его работы, либо сразу выскакиваем из этого каталога, не трогая его подкаталогов. Достаточно тривиальный скрипт.

Автор: MelkorLiGray 23.3.2012, 12:05
Цитата(Akina @  22.3.2012,  18:06 Найти цитируемый пост)
MelkorLiGray, читайте Правила. Пункт 10. 


Будьте великодушны, простите и потрите мои посты. Я создам тему соразмерно правилам.
Обязуюсь быть внимательней.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)