Скрипт резервного копирования файлов bat
Накидал маленький BAT скрипт для резервного копирование MySQL баз. Внесите свои данные и через scheduler настройте расписание резервного копирования.
Меняем формат файла и пробуем его запустить
Жмем " Применить " и " Ок ". Теперь мы можем менять расширение известных системе файлов, а посему направляемся к нашему файлику, жмем правой кнопкой мышки, выбираем " Переименовать " и методом печатания на клавиатуре меняем расширение с txt на bat (на вопрос системы стоит ли это делать отвечаем утвердительно).
В результате мы имеем следующую картину (в вашем случае файлик называется иначе, но имеет тот же формат):
Собственно, все, что нам остается - это запустить этот файл простым кликом по нему мышки.
Если Вы все сделали правильно, то перед Вами промелькнет консоль и по известному пути появится новая папочка с заданным заранее названием и файлами внутри скопированными из известной Вам папки, т.е картина получится примерно следующая:
Ну или несколько другая, в зависимости от того какие пути и названия папок Вы прописывали в команде.
Отредактировать файлик можно сменив ему расширение обратно на .txt и открыв любым текстовым редактором.
Функции
- С помощью mysqldump делает резервные копии всех баз данных mysql на сервере.
- Каждый бэкап сохраняется в отдельную подпапку вида DD.MM.YYYY_hhmmmss.
- С помощью 7-Zip архивирует резервные копии.
- Удаляет старые резервные копии.
@echo off
SetLocal EnableDelayedExpansion
set user=root
set pass=your_password_is_here
set prot=tcp
set port=3306
set host=localhost
set BackupDir=D:\MySQL\
set NumFolders=10
set h=%time:~0,2%
set h=%h: =0%
set FullBackupDir=%BackupDir%%date%_%h%%time:~3,2%%time:~6,2%\
md %FullBackupDir%
for /F "delims=|" %%a in ('mysql -u%user% -P%port% -h%host% -p%pass% -s --execute="show databases;"') do (
rem === backup database ====
mysqldump.exe ^
--user=%user% ^
--host=%host% ^
--protocol=%prot% ^
--port=%port% ^
--password=%pass% ^
--default-character-set=utf8 ^
--single-transaction=TRUE ^
--routines ^
--events ^
--add-drop-table ^
--add-locks ^
--extended-insert ^
--lock-tables ^
--dump-date ^
--disable-keys ^
--tz-utc ^
"%%a" > %FullBackupDir%%%a.sql 2>nul
rem === zip ====
"%a7z%" a -tzip -bb0 -bd -sdel "%FullBackupDir%%%a.zip" "%FullBackupDir%%%a.sql" 2>nul >nul
)
for /f "tokens=* delims=" %%D in ('dir %BackupDir% /ad /b /o-d') do (
if not %%D=="" (
if not !NumFolders!==0 (
set /a NumFolders-=1
) else (
rd /s /q %BackupDir%%%D 2>nul >nul
)
)
)
- user - логин в MySQL
- pass - пароль
- prot - протокол
- port - порт
- host - сервер
- BackupDir - папка куда бэкапить
- NumFolders - сколько подпапок с бэкапами хранить
- a7z - путь к 7z.exe
Добавляем в файл команду, например, для копирования
Далее, собственно, нам в этот файлик нужно ввести команду, которая будет воспроизводиться по средством консоли ( cmd ) при запуске этого файла. В данном случае мы воспользуемся командой xcopy ибо именно она позволяет копировать файлы, каталоги и подкаталоги. Учитывая все пути у нас получится следующая команда:
xcopy C:\test\testcopy C:\test\backup /f /i /y /s
Разъясняю что тут к чему:
- xcopy - это сама команда;
- C:\test\testcopy - это источник, т.е. папка откуда копируются файлы и каталоги;
- C:\test\backup - это результат, т.е. место, куда будут скопированы файлы и каталоги;
- /f /i /y /s - дополнительные параметры синтаксиса для команды xcopy (см.синтаксис ниже по тексту).
Количество строчек может быть любым, т.е. если Вам надо скопировать 100 папок, Вы пишете 100 строчек в одном файле и меняете в них только пути.
Далее, касательно синтаксиса (какие дополнительные параметры есть, какие можно дописать и зачем они нужны).
Какие есть (т.е. те, что я указал в данном примере):
- /f - выводит имена исходных файлов и файлов-результатов в процессе копирования
- /i - создает новый каталог в случае, если тот отсутствует в конечном пути
- /y - перезаписывает файл в случае, если он уже есть
- /s - копирует каталоги и подкаталоги, если они не пусты. Если параметр /s не задан, команда xcopy будет работать только с одним каталогом.
Как по мне - это основной список параметров необходимых для "тихого" копирования, т.е. без лишних вопросов о перезаписи, создания каталогов и прочей шушеры. Касательно остального синтаксиса можно почитать, например, тут.
Далее нам надо сменить формат файла с txt на bat . Делается это следующим образом.
Функции
- С помощью mysqldump делает резервные копии всех баз данных mysql на сервере.
- Каждый бэкап сохраняется в отдельную подпапку вида DD.MM.YYYY_hhmmmss.
- С помощью 7-Zip архивирует резервные копии.
- Удаляет старые резервные копии.
@echo off
SetLocal EnableDelayedExpansion
set user=root
set pass=your_password_is_here
set prot=tcp
set port=3306
set host=localhost
set BackupDir=D:\MySQL\
set NumFolders=10
set h=%time:~0,2%
set h=%h: =0%
set FullBackupDir=%BackupDir%%date%_%h%%time:~3,2%%time:~6,2%\
md %FullBackupDir%
for /F "delims=|" %%a in ('mysql -u%user% -P%port% -h%host% -p%pass% -s --execute="show databases;"') do (
rem === backup database ====
mysqldump.exe ^
--user=%user% ^
--host=%host% ^
--protocol=%prot% ^
--port=%port% ^
--password=%pass% ^
--default-character-set=utf8 ^
--single-transaction=TRUE ^
--routines ^
--events ^
--add-drop-table ^
--add-locks ^
--extended-insert ^
--lock-tables ^
--dump-date ^
--disable-keys ^
--tz-utc ^
"%%a" > %FullBackupDir%%%a.sql 2>nul
rem === zip ====
"%a7z%" a -tzip -bb0 -bd -sdel "%FullBackupDir%%%a.zip" "%FullBackupDir%%%a.sql" 2>nul >nul
)
for /f "tokens=* delims=" %%D in ('dir %BackupDir% /ad /b /o-d') do (
if not %%D=="" (
if not !NumFolders!==0 (
set /a NumFolders-=1
) else (
rd /s /q %BackupDir%%%D 2>nul >nul
)
)
)
- user - логин в MySQL
- pass - пароль
- prot - протокол
- port - порт
- host - сервер
- BackupDir - папка куда бэкапить
- NumFolders - сколько подпапок с бэкапами хранить
- a7z - путь к 7z.exe
Bat файл - что к чему, вводная
Для начала немного о том, что такое bat файл , зачем он нужен и с чем его (или их) едят. Дабы не изобретать велосипед воспользуюсь выдержкой из Википедии:
Пакетный файл (т.е bat файл, от англ. batch file ) — текстовый файл в MS-DOS, OS/2 или Windows , содержащий последовательность команд, предназначенных для исполнения командным интерпретатором.
Пакетный файл — аналог shell script в Unix -подобных операционных системах.
Пакетные файлы полезны для автоматического запуска приложений. Основная область применения — автоматизация наиболее рутинных операций, что регулярно приходится совершать пользователю компьютера.
Примерами таких операций могут служить — обработка текстовых файлов; копирование, перемещение, переименование, удаление файлов; работа с папками; архивация; создание резервных копий баз данных и т. п.
Пакетные файлы поддерживают операторы if и goto (а в системах семейства Windows NT и расширенный оператор for ), что позволяет обрабатывать результаты выполнения предыдущих команд или приложений и в зависимости от этого выполнять дальше тот или иной блок команд (как правило, в случае удачного завершения приложение возвращает 0 в переменной errorlevel; в случае неудачного — 1 или большее значение).
Пакетные файлы в DOS имеют расширение . bat ; для других операционных систем они могут иметь другие расширения — например, . CMD в Windows NT и OS/2 , или .BTM в 4DOS или подобных оболочках.
С теорией разобрались, приступим к, собственно, практике, а именно созданию bat-ника.
Как создать bat файл и использовать его
Давайте подготовим небольшое тестовое поле, чтобы было на базе чего экспериментировать. Откройте мой компьютер и создайте на диске C:\ папочку test . Зайдите в неё и создайте в ней папку testcopy .
Накидайте туда файлов (штук 5-10 ) - фотки, документы и тд и тп (любых короче). Поле для экспериментов готово. Далее нам надо создать, собственно, сам bat файл по нажатию на который у нас будет происходить копирование папки C:\test\testcopy в, скажем, папку C:\test\backup . Создавать вторую папку (которая backup ) не надо - она будет появляться автоматически.
Создать bat очень просто. Жмем правой кнопкой мышки там где хотим его создать (расположение не важно - можно прямо на рабочем столе) и выбираем " Создать " - " Текстовый документ ".
Задаем созданному файлу название и открываем его блокнотом или любым другим текстовым редактором. Т.е. на данный момент мы имеем открытый текстовый файлик, который называется, допустим, копирование.txt .
Пример настройки расписания
В Task Scheduler настраиваем новое задание.
Выбираем пользователя, от имени которого будет выполняться резервное копирование. После сохранения задания нас спросят пароль от него. Ставим галку Run whether user is logged or not - запускать даже если юзер не залогинен.
В триггерах настраиваем расписание. У меня резервное копирование происходит каждые 6 часов.
Сегодня мы узнаем про то, что такое bat файл и заодно создадим один из них.
Думаю, что многие, так или иначе, периодически создают резервные копии (так называемые backup -ы) тех или иных файлов и папок.
Вроде все привычно и делать ничего особо сложного не надо: вставить флешку, открыть " Мой компьютер ", найти что надо скопировать, выделить, тыкнуть мышкой, выбрать "скопировать", перебраться в нужный каталог, тыкнуть "вставить" и тд.
Но зачастую все эти клики и лишние телодвижения несколько утомляют и отнимают ценное время, особенно при частых копированиях одних и тех же данных. В этой статье я расскажу как автоматизировать этот процесс посредством консоли, а точнее написания такой штуки как bat файл .
Послесловие
Как я уже сказал и Вы сами наверное осознали - использование подобного bat файл 'а зачастую экономит кучу времени, т.е. один раз написал и периодически запускаешь одним кликом и вместо многоминутных тычков мышкой и ползания по всем папкам получаешь автоматизированный процесс копирования.
При желании можно поставить запуск этого bat -ника в определенные дни через планировщик Windows (или другие программы позволяющие это делать) и вообще забыть о проблеме долгих ручных backup 'ов.
Если есть какие-то вопросы или проблемы - спрашивайте. Как всегда помогу чем смогу ;)
PS: Если мне не изменяет память, то это кусочек темы из умных админских книжек, а именно из раздела " Автоматизация администрирования ".. так что можете собой гордится :)
Белов Андрей (Sonikelf) Заметки Сис.Админа [Sonikelf's Project's] Космодамианская наб., 32-34 Россия, Москва (916) 174-8226
Одной из самых проблемных задач для обычного пользователя является резервное копирование под Windows, которое обеспечивало бы закрытие следующих вопросов:
- быстрое (идеально в фоне);
- сохраняло бы как актуальную версию файлов, так и предыдущие;
- хранилище файлов было бы недоступно вирусам или стихийным бедствиям типа уничтожения носителя или его воровства;
- содержимое резевной копии было бы доступно только пользователю, т.е. паролировалось.
- аккаунт в яндексе, чтобы получить доступ по webdav к яндекс-диску. Применение любого другого хранилища не возбраняется;
- 7z — консольный архиватор, распространяется бесплатно;
- curl — консольный инструмент для работы с интернетом, распространяется бесплатно.
Далее в этом каталоге желательно сформировать каталог, в который нужно поместить файлы и каталоги для будущего архива. У меня он называется «backup» и в него я помещаю жесткие ссылки на файлы или связь каталогов (соответствующий функционал есть в FAR по комбинации клавиш Alt+F6). Таким образом, я могу, не меняя структуру существующих данных, создать удобную мне структуру для резервого копирования.
Следующий каталог — «temp». Предназначен для хранения архива данных перед отправкой его на сервер. Заодно он будет являться зашифрованной копией актуальных данных, что обеспечивает дополнительное их резервирование на случай атаки вирусов.
После чего в исходном каталоге нужно создать достаточно простой bat (cmd) файл «full.bat» следующего содержания:
- set filebkp=work — задание общего названия компьютера и пути на сервере, по которому будет храниться резервная копия. Т.к. компьютеров может быть несколько, то это может быть резервная копия рабочего компьютера (work), домашнего (home), ноутбука (book), указание индивидуального названия не позволит копиям смешиваться друг с другом.
- set pathbkp=backup — задание пути к каталогу, где хранятся данные для резервного копирования, в данном случае указан каталог с жесткими ссылками и связями каталогов, который Вы должны были создать ранее.
- set srvbkp=https://user:password@webdav.yandex.ru/backup/%filebkp% — задание каталога на сервере, куда будет заливаться резервная копия. user и password — пароли от Вашей учетки на яндексе;
- set full=%filebkp%-full — задание заранее названия архива.
- del /F /Q "%pathtemp%"\ — удаление (очистка) временного каталога
- 7z.exe a "%pathtemp%\%full%".7z -x!*.log; -r -mx1 "%pathbkp%\*" -ppass_for_archive — строка запуска архиватора. pass_for_archive — Ваш пароль к архиву.
- curl.exe -k -X DELETE "%srvbkp%" --verbose -o .\stdout — удаление на сервере каталога назначения.
- curl.exe -k -X MKCOL "%srvbkp%" --verbose -o .\stdout — заново создание на сервере каталога назначения.
- curl.exe -k -T "%pathtemp%\%full%".7z "%srvbkp%"/ --progress-bar --verbose -o .\stdout — заливка с помощью curl архива на сервер.
Расшифровать этот файл я думаю Вы сможете сами — скрипт с помощью 7z анализирует уже имеющийся в каталоге «temp» полный архив и исходный каталог, находит изменившиеся файлы, запаковывает их в инкрементный архив, именованный по текущей дате и времени, и отправляет на сервер. Таким образом, если полная архивация занимает скажем 1 гигабайт и 3 минуты времени, то измененные файлы обычно занимают 10-50 мегабайт и улетают на сервер за несколько секунд. Поместив «inc.bat» в планировщик заданий Windows, Вы позволите этому процессу происходить по расписанию в удобное для Вас время, что позволит забывать о нем.
Когда же Вам покажется, что время создания инкрементных копий стало слишком большим, можно снова запустить «full.bat» — это очистит все каталоги от полных и инкрементных архивов и создаст свежий вариант полной версии.
Несколько лет назад узнала, что с WinRar можно работать через консоль. Сразу же было решено написать простенький bat-ник для организации резервного копирования важных файлов.
О том, как добавить пакетный файл в планировщик заданий, можете почитать тут :)
Синтаксис команд консольного WinRar:
Полный список команд и ключей можно позырить тут . Рассмотрим необходимые для архивации:
Команды:
A Добавить файлы в архив
U Обновить файлы в архиве
Ключи:
-r Обрабатывать вложенные папки
-m Установить метод сжатия (n = 0 .. 5, стандартный метод сжатия - 2)
-dh Открывать совместно используемые файлы
-ag[формат] Добавить к имени архива текущую дату и время
-x или -x Исключить из обработки файлы (можно указать только определенный формат, например, с ключом -x*.exe в архив не будут добавляться .exe файлы)
-hp[пароль] Зашифровать архив паролем
-ow Обработать информацию о правах доступа к файлам
Пример: Нужно заархивировать файл "Новый проект.jpg" в папку test на диске D:
Результат выполнения:
Итак, мой батник для ручного создания архива
rem Наводим красоту
TITLE BACKUP MASTER
COLOR 0A
CLS
@ECHO off
rem Сохраняем и задаем пути в переменные
SET current_path=%cd%
SET backup_path=%current_path%Backup\
SET backup_list=@%current_path%backup_list.txt
SET rar_path="C:\Program Files\WinRAR\rar.exe"
rem Создаем папку для бэкапов и txt для списка файлов
MKDIR Backup
IF NOT EXIST backup_list.txt (type NUL>backup_list.txt)
rem Предлагаем открыть список архивируемых файлов
:start
CHOICE /T 120 /C yne /CS /D n /M "Open backup_list? yes (y), no (n) or exit (e)"
IF %ERRORLEVEL%==1 (GOTO edit_list)
IF %ERRORLEVEL%==2 (GOTO make_backup)
IF %ERRORLEVEL%==3 (GOTO exit)
rem Редактируем список файлов
:edit_list
START %current_path%backup_list.txt
rem Делаем бэкап
:make_backup
rem Выводим список бэкапов в папке Backup
TREE %current_path%Backup /f
rem Предлагаем ввести имя файла или сгенерировать по дате
CHOICE /T 9999 /C nde /CS /D d /M "To enter file name (n). To name in format backup_file_DD.MM.YYYY (d). For exit (e)"
IF %ERRORLEVEL%==1 (SET /p archive_name="Enter name: ")
IF %ERRORLEVEL%==2 (SET archive_name=backup_file -ag_DD.MM.YYYY)
IF %ERRORLEVEL%==3 (GOTO exit)
rem Предлагем создать новый файл и обновить существующий
CHOICE /T 9999 /C une /CS /D n /M "Update existing (u) or make new (n)? For exit (e)"
IF %ERRORLEVEL%==1 (GOTO update)
IF %ERRORLEVEL%==2 (GOTO make_new)
IF %ERRORLEVEL%==3 (GOTO exit)
rem В случае обновления архива
:update
ECHO Updating.
%rar_path% u -r -m2 -dh -ow %backup_path%%archive_name% %backup_list%
GOTO continue_or_exit
rem В случае создания нового архива
:make_new
ECHO Making new.
%rar_path% a -r -m2 -dh -ow %backup_path%%archive_name% %backup_list%
rem Продолжаем создавать архивы или выходим
:continue_or_exit
CHOICE /T 9999 /C ce /CS /D c /M "Continue (c) or exit (e)?"
IF %ERRORLEVEL%==1 (GOTO start)
В состав Windows 7 и 8 входит утилита robocopy, служащая для репликации папок. Давайте рассмотрим, как с помощью нее мы можем организовать резервное копирование наших файлов. Никакие дополнительные программы нам не понадобятся, возьмем лишь то, что уже есть в Windows.
Для примера будем бэкапить папки “Документы” и “Рабочий стол” (мы же страсть как любим хранить все на рабочем столе! )) в папку D:\backup. В этой папке создаем два текстовых файла backup.bat и work.bat и папку _log, где будем хранить отчеты. Подробно описывать командную строку и bat-файлы здесь не буду, информации достаточно в интернете, только вставлю комментарии где нужно.
Наш бэкап будет точной копией наших файлов, “зеркалом”, со всеми вытекающими последствиями. Например, если вы удалите нужный файл, то после синхронизации он будет удален и из резервной копии. Это не всегда удобно, но мы рассматриваем частный случай.
Файл backup.bat с комментариями
D:
cd D:\backup\
В этой папке храним наши резервные копии и bat-файлы.
set day=%DATE:~0,2%
set month=%DATE:~3,2%
set year=%DATE:~6,4%
set /a ttt=%TIME:~0,2%
set minute=%TIME:~3,2%
set second=%TIME:~6,2%
if %ttt% LSS 10 (
set hour=0%ttt%) else (
set hour=%ttt%)
set logfilename=%year%-%month%-%day%_%hour%-%minute%-%second%_backup.log
Задаем имя лог-файла. Собственно, все вышестоящие манипуляции с датой-временем лишь для того, чтобы это имя было удобным.
call D:\backup\work.bat>D:\backup\_log\%logfilename%
Выполняем копирование, и результаты пишем в лог.
2>nul forfiles /p «D:\backup\_log» /d -14 /c «cmd /c del /f /q @file»
Удаляем логи старше 14 дней (ключ /d -14)
Файл work.bat с комментариями
ROBOCOPY с:\Users\username\Desktop d:\backup\Desktop /FFT /MIR /R:3 /W:5 /TEE /FP /NDL /NP
Это основная команда, рассмотрим ее подробнее
c:\Users\username\Desktop — “откуда”.
d:\backup\Desktop — “куда”.
/FFT — используется время файлов FAT. Огрубляет время последнего изменения файлов до двух секунд, благодаря этому в разных системах файл определяется, как не изменившийся, и лишний раз не копируется. Этот ключ полезен, например при бэкапе на сетевое хранилище (NAS).
/MIR — создает зеркало дерева папок.
/R:3 /W:5 — число повторных попыток неудавшегося копирования файла и интервал в секундах между попытками. Если не задать, то любой битый сектор подвесит наш скрипт почти на год (миллион попыток с интервалом 30 секунд)
Ну а дальше идет вкусовщина:
/FP — в выводе будут отображаться полные пути файлов, это нам для лога.
/NDL — а вот имена папок отображаться не будут.
/NP — и ход процесса, число скопированных процентов файла тоже.
Вообще утилита robocopy очень гибкая, все ключи можно посмотреть например здесь.
ROBOCOPY c:\Users\username\Documents d:\backup\Documents /FFT /MIR /R:3 /W:5 /TEE /FP /NDL /NP
Аналогично копируем Документы. Обратите внимание, ярлыки папок типа “Мои рисунки” будут раскрыты, и будут скопированы файлы из родительской c:\Users\username\Pictures\
Теперь сделаем наш бэкап регулярным. Перелогиниваемся как Администратор, и запускаем Планировщик заданий (Пуск — Панель управления — Администрирование). Создаем новую задачу.
На вкладке «Общие» в разделе «Параметры безопасности» обязательно включаем «Выполнять вне зависимости от регистрации пользователя». Обратите внимание, задача должна запускаться от имени учетной записи Администратор.
На вкладке «Триггеры» создаем расписание, когда будет проводиться синхронизация. Галочка «Включено» должна стоять.
Будем бэкапить каждый день по вечерам. Можно создать несколько триггеров.
На вкладке «Действие» создаем «Запуск программы» и указываем нашу «Программу или сценарий» D:\backup\backup.bat. Остальные параметры настраиваются по желанию. Например можем направлять себе уведомление по почте. Не забываем нажать «OK». Все, теперь из-под Администратора можно уходить и продолжать свою обычную работу. В 11 часов вечера резервная копия будет создана, а в папке D:\backup\_log появится файл с сегодняшним отчетом.
Что дальше делать с этой копией? Можно архивировать, и хранить все версии, можно синхронизироваться с облаком. Но это все делается с помощью дополнительных программ, а значит это тема отдельного разговора.
Запись опубликована в рубрике Программы с метками backup, программы. Добавьте в закладки постоянную ссылку.
Читайте также: