Копирование резервных копий
Здравствуйте!
Вопрос в следующем: на сервере делается ежедневный бэкап комплекта баз (с раширением bak), хочу сделать на другом сервере (с подключенным хранилищем) задание на копирование этого комплекта по расписанию. Месячные комплекты (будут копироваться 1 числа каждого месяца, т.к. копирование в последний день месяца заморочено (для меня) - из-за разного кол-ва дней в месяце) будут копироваться в Y:\Backup\Month (будут архивироваться винраром в файл с именем даты копии; можно копировать из папки ежедневного бэкапа, с проверкой на актуальность); недельные, по воскресеньям (можно копировать из папки ежедневного бэкапа (если он был, если нет - то с сервера \\192.168.1.1\Backup)) в папку Y:\Backup\Week и каждую неделю будут перезаписываться (архивировать не надо); и ежедневные в папку Y:\Backup\Day (тоже будут перезаписываться каждый день, без архивирования). Так же хотелось бы сделать проверку - вдруг сервак 1 числа будет выключен, значит ни ежедневный бэкап, ни месячный не скопируются. Т.е. по идее скрипт должен запускаться каждый день и проверять был ли месячный бэкап в этом месяце, если нет - копировать самый последний (и что бы не проверять когда был дневной бэкап (может он тоже старый) копировать сразу с другого сервера (например \\192.168.1.1\Backup, или все таки проверить на актуальность дневной и копировать из папки Day, сразу через винрар). По этому же принципу проверять и еженедельный бэкап (может через разницу дат? например если разница больше 6 дней - копировать из папки Day (если там актуальный) либо с другого сервера (\\192.168.1.1\Backup) - если не актуальный бэкап. Имена файлов бэкапов всегда одинаковые, с расширением bak. Бэкап каждой БД делается в отдельный файл. Бэкап делается каждый день с перезаписью (\\192.168.1.1\Backup). Как в целом я себе это представляю (если делать скрипт для всех задач в одном батнике): rem Устанавливаем переменные @Echo off set year=%date:~-4,4% set month=%date:~-8,4% set day=%date:~-10,2% set datetemp=%year%%month%%day% Set Files=y:\Backup\Day\*.* Set BackUp=y:\Backup\Month\ set Msg=Nothing to do set Chk=%datetemp:~0,7% rem Копируем бэкап за день rem Проверяем как давно делался недельный бэкап, если больше 6 дней, то копируем либо из папки Day (если актуальный бэкап) либо с сервера (\\192.168.1.1\Backup). rem Проверяем делался ли месячный бэкап - если нет архива за этот месяц, то делаем архивный бэкап. rem Соответственно все действия пишем в лог файл. Заранее благодарю за помощь! |
Linzer,
Вот вариант. Постановку слегка изменил в части недельных копий
Код:
@Echo Off Если сегодняшней копии нет, ничего не делаем. Если нет копии прошлого месяца (делаем, в идеале, в первом числе текущего месяца) архивируем сегодняшний бэкап в папку месяца. Если копия прошлого месяца есть, архивируем сегодняшний бэкап в недельную папку. В этой папке храним не более заданного числа архивов бэкапов каждой базы. В моём примере это 3 дня (можете исправлять как нужно). Подозреваю, больше и не нужно. Для архивирования выбирал уровень компрессии -m1 для ежедневной копии в папке Week. Работает очень быстро и бэкапы баз жмет неплохо. Для месячной копии можно выбрать более высокий уровень компрессии (у меня здесь -m2) Вообще-то уровень компрессии стОит выбирать из соображений временнЫх затрат в зависимости от объема бэкапов. Ведется лог процесса. Пропишите свои пути к архиватору, файлам и папкам. В выделенном фрагменте перечисляются нужные базы. В чём удобство - можно для каждой базы прописать свои пути. Если хотите, можете не перечислять все базы в выделенном фрагменте кода, его можно заменить на Код:
rem --------- |
Linzer, При указания сетевого пути WMIC не определяет дату файла. Замените зачеркнутый кусок на
Код:
Call :MdOut "%~dp6" %6 ||Exit /B 3 |
Цитата:
Архивы делаются, но почему то архив за месяц (за этот) делается с именем Base1.bak_201809.Rar. И еще вопрос - если использовать копирование сразу всех баз: rem --------- FOR %%i IN ("Z:\192.168.1.1_Backup\*.bak") DO Call :BakCopy "%%~i" "Z:\Backup\Day" "Z:\Backup\Week" "Z:\Backup\Month" 3 "Z:\Backup\Log\%tNow%.log" rem --------- Можно ли указать кол-во дней хранения для каждой папки? Может так: FOR %%i IN ("Z:\192.168.1.1_Backup\*.bak") DO Call :BakCopy "%%~i" "Z:\Backup\Day" 1 "Z:\Backup\Week" 5 "Z:\Backup\Month" 30 "Z:\Backup\Log\%tNow%.log" |
Цитата:
Цитата:
Можно указать, конечно, кол-во бэкапов для каждой папки. Доработаю. Выложу. |
Цитата:
Цитата:
Спасибо за ответы! |
Ваши пожелания, включая те, от которых Вы отказались
Код:
@Echo Off Для бэкапов за месяц в папке "Z:\Backup\Month" 1 бэкап Число лог файлов "Z:\Backup\Log\%tNow%.log" 35 штук Числа можете выставить свои. Имя месячного бэкапа (выделил красным) сделал как Вы хотите. Но это нелогично. Цитата:
|
Время: 13:41. |
Время: 13:41.
© OSzone.net 2001-