Microsoft SQL Server

Бэкап MS SQL Server в облако — одной командой

MS SQL — это Microsoft SQL Server. dbsend делает нативный бэкап .bak штатной командой BACKUP DATABASE, проверяет его через RESTORE VERIFYONLY и сохраняет версией в российском облаке. Существующую цепочку бэкапов на сервере это не ломает: копия создаётся с COPY_ONLY.

  • Данные в РФ
  • AES-256-GCM
  • Бесплатный тариф без карты
$ dbsend mssql --sql-database Shop -d 5b7c… --backup-dir D:\Backup# # BACKUP DATABASE … WITH COPY_ONLY, CHECKSUM, COMPRESSION# # RESTORE VERIFYONLY … WITH CHECKSUM✓ Версия v18 сохранена (id 4d2a…, 412 МБ)  https://dbsend.ru/databases/5b7c…/snapshots$ dbsend restore 4d2a… ./Shop.bak --yes✓ Версия v18 восстановлена в ./Shop.bak (412 МБ)

Почему .bak в соседней папке — ещё не бэкап

Типичная картина на сервере 1С, CRM или интернет-магазина: план обслуживания SQL Server каждую ночь пишет полный бэкап в D:\Backup. Файлы лежат на том же сервере, что и база. Вышел из строя диск, шифровальщик зашифровал тома или кто-то почистил папку — пропадут и база, и все её копии.

Вторая проблема — проверка. BACKUP DATABASE без CHECKSUM не проверяет страницы при чтении, а файл, который ни разу не проверяли через RESTORE VERIFYONLY, может оказаться непригодным именно в день восстановления. В SQL Server Express нет SQL Server Agent, поэтому расписание там часто держится на самописном .bat, который однажды тихо перестаёт работать.

Третья — чужая цепочка бэкапов. Если администратор уже настроил полные, разностные бэкапы и бэкапы журнала, лишний полный бэкап «сбоку» без COPY_ONLY сдвигает базу для разностных копий, и восстановление по цепочке становится запутанным.

Что делает dbsend для SQL Server

COPY_ONLY — цепочка не ломается

Бэкап создаётся с COPY_ONLY: он не становится базой для разностных копий и не влияет на журнал. Ваши планы обслуживания и бэкапы журнала продолжают работать как раньше.

CHECKSUM и RESTORE VERIFYONLY

SQL Server сверяет контрольные суммы страниц при создании бэкапа, затем CLI проверяет файл через RESTORE VERIFYONLY WITH CHECKSUM. Если проверка не прошла, файл не загружается, а команда завершается с кодом 6.

Сжатие с откатом для Express

По умолчанию используется COMPRESSION — .bak обычно получается в несколько раз меньше. В редакции Express сжатие недоступно: CLI сам повторит бэкап без него и выведет пояснение.

Версии в облаке в РФ

Каждый бэкап — версия vN с размером, SHA-256, меткой и закреплением. Хранение в S3-совместимом облаке в России с шифрованием AES-256-GCM. При восстановлении CLI сверяет SHA-256.

Вход Windows или SQL-логин

Без --user используется проверка подлинности Windows. Для SQL-логина укажите --user, а пароль передайте в переменной SQLCMDPASSWORD — sqlcmd читает её сам, пароль не попадает в командную строку.

Алерт, если бэкап не пришёл

Задайте ожидаемый интервал: если очередной .bak не пришёл вовремя, придёт уведомление в Telegram или на email (тарифы от «Старт»).

Как это работает

Настройка: установка, первый бэкап, расписание

Создайте в панели базу с форматом «MS SQL Server (.bak)». CLI запускается на машине с SQL Server (или там, где папка бэкапов доступна службе SQL Server) и требует dbsend 0.4.0+, Node.js 22.12+ и утилиту sqlcmd.

  1. Установка и вход

    npm install -g @dbsend/sdk
    dbsend login --key sqv_pk_…
    dbsend doctor
    
    # если sqlcmd нет в системе
    winget install sqlcmd

    На Linux sqlcmd входит в пакет mssql-tools18 — CLI сам проверяет /opt/mssql-tools18/bin, другой путь укажите флагом --sqlcmd. Если sqlcmd не найден, команда завершится с кодом 2 и подскажет, как его установить.

  2. Первый бэкап

    # Проверка подлинности Windows (текущий пользователь)
    dbsend mssql --sql-database Shop -d 5b7c… --backup-dir D:\Backup
    
    # SQL-логин: пароль только из переменной окружения
    $env:SQLCMDPASSWORD = '…'
    dbsend mssql --sql-database Shop -d 5b7c… --server "srv-sql\SQLEXPRESS" --user backup_operator -l "перед обновлением"

    Папка --backup-dir должна быть доступна на запись учётной записи службы SQL Server (по умолчанию — временный каталог). После успешной загрузки локальный .bak удаляется (--keep-local оставит его), а при ошибке файл остаётся на диске и CLI печатает путь к нему. Для самоподписанного сертификата сервера добавьте --trust-server-certificate.

  3. Расписание: Планировщик заданий Windows

    $arg = '/c dbsend mssql --sql-database Shop -d 5b7c… --backup-dir D:\Backup >> D:\Backup\dbsend.log 2>&1'
    $action  = New-ScheduledTaskAction -Execute "cmd.exe" -Argument $arg
    $trigger = New-ScheduledTaskTrigger -Daily -At 2am
    Register-ScheduledTask -TaskName "dbsend-mssql-Shop" -Action $action -Trigger $trigger

    Задание должно выполняться от пользователя, который выполнил dbsend login, — или задайте этой учётной записи переменную DBSEND_API_KEY.

  4. Или задание SQL Server Agent

    EXEC msdb.dbo.sp_add_job @job_name = N'dbsend Shop';
    EXEC msdb.dbo.sp_add_jobstep @job_name = N'dbsend Shop', @step_name = N'backup',
      @subsystem = N'CmdExec',
      @command = N'cmd /c dbsend mssql --sql-database Shop -d 5b7c… --backup-dir D:\Backup';
    EXEC msdb.dbo.sp_add_schedule @schedule_name = N'nightly-0200',
      @freq_type = 4, @freq_interval = 1, @active_start_time = 020000;
    EXEC msdb.dbo.sp_attach_schedule @job_name = N'dbsend Shop', @schedule_name = N'nightly-0200';
    EXEC msdb.dbo.sp_add_jobserver @job_name = N'dbsend Shop';

    Шаг CmdExec выполняется от учётной записи службы Agent (или прокси): ей нужны dbsend и sqlcmd в PATH и ключ в DBSEND_API_KEY. В Express нет Agent — используйте Планировщик заданий.

  5. SQL Server на Linux: cron

    # /etc/cron.d/dbsend-mssql — каждый день в 02:00
    0 2 * * * backup SQLCMDPASSWORD="$(cat /etc/dbsend/sql.pass)" /usr/local/bin/dbsend mssql --sql-database Shop -d 5b7c… --user backup_operator --backup-dir /var/opt/mssql/backup >> /var/log/dbsend-mssql.log 2>&1

    Файл с паролем — с правами 600. Каталог бэкапов должен быть доступен на запись пользователю mssql и на чтение пользователю, от которого работает cron.

  6. Восстановление

    dbsend log 5b7c…
    dbsend restore 4d2a… ./Shop.bak --yes
    
    -- логические имена файлов внутри .bak
    RESTORE FILELISTONLY FROM DISK = N'D:\Restore\Shop.bak';
    
    -- в новую базу рядом с рабочей
    RESTORE DATABASE [Shop_restore] FROM DISK = N'D:\Restore\Shop.bak'
    WITH MOVE N'Shop' TO N'D:\SQLData\Shop_restore.mdf',
         MOVE N'Shop_log' TO N'D:\SQLData\Shop_restore_log.ldf',
         RECOVERY, STATS = 10;
    
    -- поверх рабочей базы — только осознанно
    RESTORE DATABASE [Shop] FROM DISK = N'D:\Restore\Shop.bak'
    WITH MOVE N'Shop' TO N'D:\SQLData\Shop.mdf',
         MOVE N'Shop_log' TO N'D:\SQLData\Shop_log.ldf',
         REPLACE, RECOVERY;

    CLI скачивает версию во временный файл, сверяет SHA-256 и только потом записывает .bak. Сам RESTORE DATABASE вы выполняете в SSMS или через sqlcmd — dbsend рабочую базу не трогает.

Что именно выполняет dbsend mssql

Команда вызывает sqlcmd и выполняет BACKUP DATABASE [Shop] TO DISK = N'…\Shop-<время UTC>.bak' WITH COPY_ONLY, CHECKSUM, INIT, COMPRESSION. Имя базы экранируется квадратными скобками, путь — как строка N'…', поэтому базы с пробелами и необычными символами в имени тоже работают.

Затем выполняется RESTORE VERIFYONLY FROM DISK = N'…' WITH CHECKSUM — проверка читаемости и контрольных сумм без восстановления базы. Только после неё файл загружается в dbsend: до 32 МБ одним запросом, больше — частями. Если у вас уже есть свои скрипты, готовый файл можно отправить так: dbsend backup D:\Backup\Shop.bak --engine mssql_backup.

Клиент-серверная 1С на SQL Server — частый случай. Для неё .bak из dbsend mssql — быстрый бэкап на уровне СУБД, а выгрузка .dt через конфигуратор — независимая от СУБД копия. Хорошая практика — держать оба варианта.

Ограничения — честно

Файл .bak хранится целиком: dbsend ведёт версии, проверяет размер и SHA-256, присылает алерты, но не разбирает содержимое бэкапа. Сравнения по таблицам и строкам, как для дампов PostgreSQL и MySQL, для .bak нет — между версиями видны размер и контрольная сумма.

Размер одного файла ограничен тарифом: «Бесплатный» — 100 МБ, «Старт» — 500 МБ, «Про» — 2 ГБ, «Команда» — 2 ГБ, «Бизнес» — 50 ГБ. Для больших баз есть тариф «Бизнес» за 4 990 ₽ в месяц: файлы до 50 ГБ и 1 ТБ хранилища; если .bak больше 50 ГБ, напишите нам на hello@dbsend.ru. Не отключайте сжатие без необходимости — с COMPRESSION .bak заметно меньше и чаще укладывается в лимит. dbsend делает полный бэкап (COPY_ONLY); разностные бэкапы и бэкапы журнала транзакций остаются задачей ваших планов обслуживания.

План обслуживания на сервере и dbsend

  • Копия вне сервера

    План обслуживания + папка на сервере
    если настроили сами
    dbsend
    S3 в РФ, AES-256-GCM
  • Не ломает цепочку разностных бэкапов

    План обслуживания + папка на сервере
    нужно не забыть COPY_ONLY
    dbsend
  • Проверка CHECKSUM и RESTORE VERIFYONLY

    План обслуживания + папка на сервере
    если включили в плане
    dbsend
    при каждом бэкапе
  • Работает в SQL Server Express

    План обслуживания + папка на сервере
    без Agent — только .bat и планировщик
    dbsend
  • История версий с метками и закреплением

    План обслуживания + папка на сервере
    файлы с датой в имени
    dbsend
    v1…vN, метки, закрепление
  • Алерт, если бэкап не пришёл

    План обслуживания + папка на сервере
    Database Mail и Agent
    dbsend
    Telegram и email, от «Старт»
  • Diff по таблицам

    План обслуживания + папка на сервере
    dbsend
    нет для .bak — размер и SHA-256
  • Стоимость

    План обслуживания + папка на сервере
    диск и ваше время
    dbsend
    от 0 ₽

Тарифы и лимиты — на странице «Тарифы». Документация: CLI, форматы файлов, тарифы и лимиты.

Частые вопросы

MS SQL и Microsoft SQL Server — это одно и то же?

Да. MS SQL, MSSQL и SQL Server — разговорные названия Microsoft SQL Server. dbsend работает с нативными бэкапами .bak, которые создаёт команда BACKUP DATABASE, в том числе для SQL Server на Linux.

Не испортит ли dbsend мою текущую цепочку бэкапов?

Нет. Бэкап делается с COPY_ONLY: он не становится базой для разностных бэкапов и не обрезает журнал транзакций. Ваши планы обслуживания продолжают работать как раньше.

Работает ли с SQL Server Express?

Да. В Express нет сжатия бэкапов — CLI повторит BACKUP DATABASE без COMPRESSION и выведет пояснение. SQL Server Agent в Express тоже нет, поэтому расписание настраивается через Планировщик заданий Windows.

Как передать пароль SQL-логина?

Через переменную окружения SQLCMDPASSWORD — её читает сам sqlcmd. Пароль не указывается в командной строке и не попадает в историю команд и список процессов. Без --user используется проверка подлинности Windows.

Какой максимальный размер .bak?

«Бесплатный» — 100 МБ, «Старт» — 500 МБ, «Про» — 2 ГБ, «Команда» — 2 ГБ, «Бизнес» — 50 ГБ. Большие базы — на тарифе «Бизнес», для файлов больше 50 ГБ напишите на hello@dbsend.ru. Оставляйте сжатие включённым: с COMPRESSION файл обычно в несколько раз меньше. Файлы больше 32 МБ CLI загружает частями автоматически; на всю загрузку отводится 24 часа.

Покажет ли dbsend, какие таблицы изменились?

Нет. Файл .bak хранится как есть: dbsend проверяет его через RESTORE VERIFYONLY, хранит версии, размер и SHA-256, но сравнения по таблицам для этого формата нет.

Можно ли загружать .bak, который делает мой собственный скрипт?

Да: dbsend backup <путь к файлу.bak> --engine mssql_backup. В этом случае проверку CHECKSUM и VERIFYONLY стоит выполнить в вашем скрипте — dbsend проверит только целостность при загрузке и восстановлении.

Статьи по теме

Все статьи →

Другие сценарии

Вынесите бэкапы SQL Server за пределы сервера

Бесплатный тариф: 1 база, 500 МБ и 3 версии — хватит, чтобы проверить небольшую базу. Для ежедневных копий с алертами — «Старт» за 199 ₽ в месяц.