Рано или поздно в жизни любого инфраструктурщика наступает момент, когда:
-
база данных уже большая
-
руками делать backup лень
-
штатные решения "enterprise-класса" стоят как крыло от Boeing
-
а начальство внезапно вспоминает слово Disaster Recovery
И вот тогда рождаются маленькие инженерные шедевры на cmd, PowerShell и паре костылей, которые годами работают в production лучше некоторых "коробочных" решений.
Сегодня разберем простой, но вполне рабочий вариант автоматического backup Microsoft SQL Server:
-
создание .bak
-
сжатие архива
-
отправка на сетевую шару
-
очистка старых файлов
-
запуск через планировщик Windows
Да, это не ультрасовременный Kubernetes Operator с S3 и lifecycle policy. Но для небольших инфраструктур, старых Windows-серверов и легаси-систем - решение вполне живое.
И что самое главное - максимально простое. Без сложных агентов, отдельных серверов backup и шаманства с GUI, который ломается после очередного обновления Windows.
Как работает схема backup
Вся логика состоит из двух файлов:
-
mssql.sql - создает backup базы MSSQL
-
backup.cmd - запускает backup, архивирует его и копирует на сетевую шару
Схема работы выглядит так:
MSSQL -> .bak -> архив .rar -> сетевая шара -> очистка временных файлов
Просто.
Линейно.
И surprisingly надежно.
Создаем backup базы MSSQL
Создаем файл mssql.sql:
DECLARE @pathName NVARCHAR(512)
SET @pathName = 'D:\BACKUP\DBNAME.bak'
BACKUP DATABASE [DBNAME]
TO DISK = @pathName
WITH NOFORMAT,
NOINIT,
NAME = N'db_backup',
SKIP,
NOREWIND,
NOUNLOAD,
STATS = 10
Что здесь происходит:
-
BACKUP DATABASE - создает backup базы
-
TO DISK - сохраняет backup в файл
-
STATS = 10 - показывает прогресс каждые 10%
После выполнения получаем обычный .bak файл MSSQL.
Создаем backup.cmd
Теперь делаем основной cmd-скрипт.
@echo off
set BACKUP_DIR=D:\BACKUP
set ARCHIVE_DIR=D:\ARCHIVE
set SHARE=\\BACKUP-SERVER\MSSQL\DBNAME
sqlcmd -S localhost -U USER -P PASSWORD -i mssql.sql
"C:\Program Files\WinRAR\Rar.exe" a -m2 %ARCHIVE_DIR%\%date%.rar %BACKUP_DIR%\*.bak
copy %ARCHIVE_DIR%\%date%.rar %SHARE%
del %BACKUP_DIR%\*.bak
del %ARCHIVE_DIR%\%date%.rar
Разбираем что делает скрипт
Запуск backup MSSQL
sqlcmd -S localhost -U USER -P PASSWORD -i mssql.sql
Здесь:
-
-S localhost - MSSQL сервер
-
-U и -P - логин и пароль
-
-i - SQL-файл для выполнения
Можно использовать и Windows-аутентификацию:
sqlcmd -E -S localhost -i mssql.sql
Это даже безопаснее.
Архивация backup
"C:\Program Files\WinRAR\Rar.exe" a -m2 archive.rar backup.bak
Параметр:
-m2
это уровень сжатия.
Можно поставить:
-
-m1 - быстрее
-
-m5 - сильнее сжатие
Но помните:
backup MSSQL уже частично сжат внутри.
Иногда дополнительное сжатие почти ничего не дает, кроме загрузки CPU.
Особенно весело это наблюдать на старом Windows Server 2012 под Hyper-V.
Копирование на сетевую шару
copy archive.rar \\backup-server\share\
Тут главное:
-
чтобы у пользователя были права
-
чтобы шара была доступна
-
чтобы сетевой диск не жил своей отдельной жизнью
Потому что Windows-сетевые шары иногда обладают характером очень уставшего системного администратора.
Очистка временных файлов
del %BACKUP_DIR%\*.bak
del %ARCHIVE_DIR%\*.rar
Очень важный момент.
Иначе через пару месяцев:
-
диск C заканчивается
-
monitoring начинает орать
-
а backup-сервер внезапно превращается в склад древних .bak
Что можно улучшить
Да, решение рабочее.
Но production быстро заставляет улучшать такие скрипты.
Например добавить:
-
проверку ошибок
-
логирование
-
ротацию backup
-
дату в нормальном формате
-
проверку доступности шары
-
уведомления в Telegram или почту
Потому что:
backup, который никто не проверяет - это просто очень дорогой мусор на диске.
Нормальный формат даты
%date% в Windows - штука крайне странная.
На одной системе:
23.05.2026
На другой:
Sat 05/23/2026
Поэтому лучше делать так:
for /f %%i in ('powershell -NoProfile -Command "Get-Date -Format yyyy-MM-dd_HH-mm"') do set DATETIME=%%i
И использовать:
%DATETIME%
Тогда архивы будут выглядеть красиво:
2026-05-23_03-00.rar
А не как артефакт древней Windows-магии.
Запуск через Windows Task Scheduler
Дальше все просто:
-
открываем Task Scheduler
-
создаем задачу
-
указываем backup.cmd
-
запускаем ночью
Например:
-
каждый день в 02:00
-
или каждые 6 часов
Главное:
не запускать backup в разгар рабочего дня на загруженной MSSQL.
Иначе пользователи быстро начинают интересоваться:
"а почему 1С опять зависла?"