Проблема, с которой всё начинается
Долгое время я делал бэкапы вручную: создавал backup, потом чистил старые файлы, переносил копии по папкам “день/неделя/месяц/год”.
Поначалу это кажется “пять минут”, но когда баз много, они большие (десятки гигабайт), плюс часть хранится на сетевых ресурсах, начинается типичный набор проблем:
-
забыли почистить — диск/шара забилась
-
разные сервера — разные подходы, бардак в структуре хранения
-
бэкап “прошёл”, а файла нет (права/сеть/переименование/сбой)
-
восстановление в тест — надо быстро, а файлы лежат далеко и долго копируются
-
ночью случилась ошибка, утром узнаёшь слишком поздно
Я решил это автоматизировать и собрать единый, повторяемый механизм, который можно поставить на любой SQL Server и забыть про рутину.
Что делает продукт
Продукт состоит из набора хранимых процедур в master и работает как “движок” бэкапирования:
-
Создаёт бэкап (
.bak) с использованием встроенного SQL Server Compression
Никаких WinRAR/7zip, никаких внешних архиваторов. -
Хранит бэкапы по политике
Ты задаёшь, сколько хранить:
-
ежедневных (Daily)
-
недельных (Week)
-
месячных (Month)
-
годовых (Year)
По умолчанию стоят разумные значения (например 4/4/4/4), которые можно менять параметрами при вызове.
-
Автоматически раскладывает копии
Готовый бэкап организуется в структуру вида:
-
\\Storage\Backups\<DB>\DayBKP\ -
\\Storage\Backups\<DB>\Week\ -
\\Storage\Backups\<DB>\Month\ -
\\Storage\Backups\<DB>\Year\
-
Ротация (очистка) файлов
Старые файлы удаляются автоматически и аккуратно: “не трогать только что созданный файл”, чтобы политика хранения не снесла свежий backup при очередном запуске. -
Уведомления об ошибках
Если на любом этапе (создание бэкапа, перенос, копирование в Week/Month/Year, создание каталогов, отсутствие файла) возникает ошибка — выполняется единая процедура уведомлений:
-
Email через Database Mail (профиль по умолчанию)
-
Telegram через Bot API
Уведомление содержит: сервер, базу, шаг, номер ошибки, severity/state, строку, текст.
Гибкость для “реальной жизни”
Бэкап одной базы или всех сразу
Если параметр @BazaName не указан — продукт делает бэкап всех баз, кроме системных, offline, snapshot и прочего. Плюс можно задать фильтры на уровне процедуры (например исключать test). Это удобно: добавил новую базу на сервер — она автоматически попадёт в бэкапирование.
Работа с локальным диском и переносом на шару
Параметр @PathBkp может указывать на локальный диск SQL Server: тогда backup создаётся локально (быстрее), а затем переносится в сетевое хранилище (@PathAllBkp).
Это особенно важно на больших базах: меньше гоняем гигабайты по сети во время самой операции BACKUP.
Отдельные “папки-потоки” для разных расписаний
Параметр @PathFile позволяет направлять бэкапы в другой подкаталог.
Например: \HourBKP для бэкапов каждые 2 часа и \DayBKP для ежедневных.
Как внедряется
Обычно внедрение выглядит так:
-
Разворачиваем процедуры в
master -
Настраиваем один SQL Agent Job:
-
шаг:
EXEC dbo.sp_AddBkpDay ... -
расписание: 1 раз в день / 1 раз в 2 часа / как требуется
-
Заполняем настройки уведомлений в
dbo.sp_BackupNotifyError:
-
@MailRecipients -
@TelegramBotToken -
@TelegramChatId
-
Запускаем тест:
-
EXEC dbo.sp_BackupNotifyError_Test;
Примеры запуска (адаптированы под текущую версию)
1) Раз в день: все базы, политика по умолчанию
EXEC dbo.sp_AddBkpDay @PathAllBkp = N'\\fserv\1C-Backup\';
2) Раз в 2 часа: “часовые” бэкапы отдельно
EXEC dbo.sp_AddBkpDay @PathAllBkp = N'\\fserv\1C-Backup\', @PathFile = N'\HourBKP', @CountDayBKP = 20;
3) Только одна база
EXEC dbo.sp_AddBkpDay @BazaName = N'GYTNikaC', @PathAllBkp = N'\\Serv\MS_BACKUP\Buh\', @CountDayBKP = 2;
Вступайте в нашу телеграмм-группу Инфостарт