Рано или поздно в жизни любого инфраструктурщика наступает момент, когда:

  • база данных уже большая

  • руками делать 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С опять зависла?"