Накидал маленький BAT скрипт для резервного копирование MySQL баз в Облако Mail.Ru по протоколу WebDAV. Внесите свои данные и через scheduler настройте расписание резервного копирования.
Ссылки
Customizing the PATH for MySQL Tools
Установка MySQL 8 на Windows Server 2016
Mysql 8 — mysqldump в командной строке
MySQL 8 — резервное копирование BAT файлом
BAT скрипт для резервного копирования папки в Облако Mail.Ru
Подключаем Облако Mail.Ru через WebDAV с помощью командной строки
Функции
- Монтирует облачный диск в качестве обычного локального диска по протоколу WebDAV.
- С помощью mysqldump делает резервные копии всех баз данных mysql на сервере во временную папку.
- С помощью 7-Zip архивирует резервные копии в облако, разбивая архив на файлы по 2 ГБ.
- Каждый бэкап сохраняется в отдельную подпапку вида YYYY-MM-DD-hhmmss.
- Удаляет старые резервные копии из облака.
- Демонтирует облачный диск.
Для того, чтобы скрипт заработал, нужно выполнить подготовительные работы. Нужно установить архиватор и настроить работу WebDAV. Ещё нужно добавить пути к mysqldump.exe в серверные переменные, но это уж сами разберитесь, ссылки выше есть, или пропишите полный путь в скрипте.
Подключаем Облако Mail.Ru через WebDAV с помощью командной строки
7-Zip
Архиватор позволит загружать бэкап в облако в виде архива, тем самым экономя место в облаке. Одновременно с этим архиватор разобьёт архив на файлы по 2 ГБ, по протоколу WebDAV всё равно не получится загрузить файл больше 4 ГБ, по крайней мере в Облако mail.ru.
Подготовка служб
Сперва нужно проверить, работает ли у вас служба Веб-клиент (WebClient).
services.msc
Находим её в списке служб.
Служба Веб-клиент (WebClient) по умолчанию остановлена и находится в ручном режиме.
Меняем тип запуска на автоматический, и запускаем службу.
Если вы работаете на сервере, то служба Веб-клиент (WebClient) по умолчанию в серверных операционных системах Windows не установлена. Устанавливаем и запускаем:
Установка WebDAV клиента на Windows Server 2016
Генерируем пароль приложения
Для того, чтобы подключиться к облаку через WebDAV, нужно сгенерировать специальный пароль. По сути, мы будем неким сторонним приложением, которому нужно дойти в облако. Логинимся в браузере в свой ящик mail.ru и переходим на страницу:
https://account.mail.ru/user/2-step-auth/passwords/
Добавить.
Придумываем название для приложения. Продолжить.
Пишем пароль от ящика, ставим галку, что мы не верблюд. Продолжить.
Пароль сгенерирован, копируем его, он нам пригодится. Пароль выглядит как-то так: FKh63KgDL4JgDLWJjdJ2.
Таких паролей можно сгенерировать сколько угодно, и удалить потом, когда надобность в них отпадёт.
Код
@echo off
SetLocal EnableDelayedExpansion
rem =============================
rem ====== admin variables ======
rem =============================
set CloudURL=https://webdav.cloud.mail.ru/
set CloudPassword=FKh63KgDL4JgDLWJjdJ2
set CloudUser=example@mail.ru
set LocalDriveLetter=O
set user=root
set pass=your_password_is_here
set prot=tcp
set port=3306
set host=localhost
set TempDir=C:\Windows\Temp\MysqlWeeklyBackup\
set BackupDir=%LocalDriveLetter%:\backup\DB\
set NumFolders=2
rem =============================
rem ======== 7-Zip path =========
rem =============================
set a7z=%ProgramFiles%\7-Zip\7z.exe
rem =============================
rem ======== open cloud =========
rem =============================
net use %LocalDriveLetter%: %CloudURL% %CloudPassword% /user:%CloudUser% 2>nul >nul
rem =============================
rem == create backup directory ==
rem ==== YYYY-MM-DD-hhmmss ======
rem =============================
set h=%time:~0,2%
set h=%h: =0%
set BackupPath=%date:~6,4%-%date:~3,2%-%date:~0,2%-%h%%time:~3,2%%time:~6,2%\
set FullBackupDir=%BackupDir%%BackupPath%
set FullTempDir=%TempDir%%BackupPath%
md %FullBackupDir%
md %FullTempDir%
rem =============================
rem === backup all databases ====
rem =============================
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" > %FullTempDir%%%a.sql 2>nul
rem === zip ====
"%a7z%" a -tzip -bb0 -bd -v2g "%FullBackupDir%%%a.zip" "%FullTempDir%%%a.sql" 2>nul >nul
)
rem =============================
rem ==== remove old folders =====
rem =============================
rd /s /q %FullTempDir% 2>nul >nul
for /f "tokens=* delims=" %%D in ('dir %BackupDir% /ad /b /o-n') do (
if not %%D=="" (
if not !NumFolders!==0 (
set /a NumFolders-=1
) else (
rd /s /q %BackupDir%%%D 2>nul >nul
)
)
)
rem =============================
rem ======= close cloud =========
rem =============================
net use %LocalDriveLetter%: /delete /y 2>nul >nul
- CloudURL — ссылка для подключения к облаку по WebDAV, для Облака mail.ru это https://webdav.cloud.mail.ru/
- CloudPassword — сгенерированный нами ранее пароль для приложения, который используется при подключении WebDAV
- CloudUser — наш ящик mail.ru, который используется в качестве имени пользователя WebDAV
- LocalDriveLetter — имя локального диска, под которым подключаем облачный диск, я подключаю как O:\
- TempDir — директория для временных файлов SQL, перед их архивированием, я использую C:\Windows\Temp\MysqlWeeklyBackup\
- BackupDir — куда бэкапим, я бэкаплю в смонтированный облачный диск по пути O:\backup\DB\
- NumFolders — сколько папок с бэкапами хранить, я буду хранить две папки
- user — логин в MySQL
- pass — пароль в MySQL
- prot — протокол MySQL
- port — порт MySQL
- host — сервер MySQL
- BackupDir — папка куда бэкапить
- NumFolders — сколько папок с бэкапами хранить
- a7z — путь к 7z.exe
- -v2g — архив разбивается на части по 2 Гб, можно задать свой размер
При желании скрипт можно модифицировать для подключения к любому источнику WEBDAV.
Есть несколько моментов, которые следует иметь в виду:
Сначала мы делаем бэкап, а затем удаляем старый. Соответственно, в облаке должно быть место для NumFolders+1 бэкапов.
Протокол WebDAV не передаёт дату создания папки, поэтому для определения старых (на удаление) папок используется само название папки в виде YYYY-MM-DD-hhmmss. Скрипт сортирует папки по имени в обратном порядке и пропускает первые NumFolders штук, остальные удаляет. В общем, не меняйте название.
Название папки генерируется из текущей даты формата DD.MM.YYYY и времени чч:мм:сс,сс, если ваш Windows использует другой формат данных, то вам нужно модифицировать скрипт для формирования корректного названия папки.
Скрипт удаляет всё что лежит в BackupDir, не храните там что-то ещё!
Проверим как работает скрипт, запустим его несколько раз.
Скрипт работает.
Пример настройки расписания
В Task Scheduler настраиваем новое задание.
Выбираем пользователя, от имени которого будет выполняться резервное копирование. После сохранения задания нас спросят пароль от него. Ставим галку Run whether user is logged or not — запускать даже если юзер не залогинен.
В триггерах настраиваем расписание. У меня резервное копирование происходит раз в неделю по воскресеньям в 10:00.
Указываем ссылку на наш BAT файл.
Настраиваем условия.
Проверяем настройки. OK.
Теперь все наши MySQL базы будут резервироваться раз в неделю. С настройкой NumFolders=2 в BAT файле мы будем хранить два последних бэкапа.