Сохранение SQL Backup в облачном хранилище

09.03.16

База данных - Архивирование (backup)

В этой статье я расскажу, как можно настроить сохранение последних SQL бэкапов выбранных баз в облачном хранилище, используя SQL jobs.

Постановка задачи:

Имеем SQL-базы с настроенными планами обслуживания по созданию бэкапов (полных и желательно плюс дифференциальных). Срок хранения бэкапов настроен, например, на месяц, может больше, зависит от количества свободного для бэкапов места на сервере. Нужно на экстренный случай (пожар в серверной или во всем офисе, кража или порча серверного оборудования) иметь бэкап в облачном хранилище и желательно все это бесплатно (без абонентской платы за хранилище).

Решение:

Так как бесплатные облачные хранилища не могут похвастаться безразмерным свободным пространством, выделенным каждому пользователю, то вариант настроить бэкапы в папку, синхронизируемую с облачным хранилищем, нам не подойдет. Бэкапы за месяц туда не влезут. Нам нужно как-то определять последние бэкапы из всех файлов бэкапов для каждой базы и копировать его в отдельную папку, которая уже автоматически или задачей Windows Task или SQL Job будет синхронизироваться с облаком.

Также разумно настроить бэкап следующим образом. Полный бэкап – ночью раз в неделю или месяц, разностный (дифференциальный бэкап) каждую ночь и бэкап хвоста транзакций – каждый час. Тогда не нужно будет каждый день выгружать в облако полный бэкап, что сэкономит время и трафик. Для экстренного восстановления последней копии базы за вчерашний день, нам необходим только последний полный бэкап и один последний разностный бэкап, снятый позднее полного. Так что в облаке нам нужно хранить для каждой базы один полный бэкап и один разностный.

Создаем в SQL задачу (job) пишем в ней скрипт, который выполнит описанные выше действия и ставим ее в плане обслуживания следующей после задачи снятия бэкапов.

Скрипт можно написать на PowerShell, задания SQL поддерживают этот тип скриптов. При этом те, кто знакомы с написанием скриптов на PowerShell, знают, что для запуска скрипта из оболочки PowerShell или из планировщика задач нужно исполнить танец с бубном, чтобы подписать сертификатом этот скрипт, или понизить уровень безопасности системы для разрешения запуска неподписанных скриптов, что крайне нежелательно. Без этого эти скрипты не запускаются. Но в SQL jobs код скрипта PowerShell прекрасно выполняется без всяких подписей.

В результате в папке, которую мы позже настроим на синхронизацию с облачным хранилищем, мы будем иметь последние бэкапы всех нужных нам баз. Имя файлов бэкапов будет соответствовать имени базы с суффиксом, обозначающим тип бэкапа. Таким образом каждый более свежий бэкап будет перезаписывать прошлый бэкап в этой папке, сохраняя в ней свободное место.

Для синхронизации локальной папки с облачным хранилищем я использовал условно бесплатную программу AllwaySync, которая умеет работать с различными облачными хранилищами (GoogleDrive, Dropbox, SkyDrive, Amazon и др.). Настройка синхронизации там интуитивно понятна, и рассказывать о ней я не буду. Единственно, что не нравится мне в этой программе, это то что она не перезаписывает файлы в облаке, а сначала удаляет, а потом записывает новый файл на место старого. Таким образом стандартная система версий файлов гугл диска не видит версии одного файла бэкапа. Конечно в программе есть своя поддержка сохранения версий файлов, но она просто копирует файлы в отдельную папку хранилища перед тем как записать новый, при этом расходуя свободное пространство хранилища. Если бы файл перезаписывался, то не расходуя место хранилища можно было бы иметь еще и историю бэкапов за последние 30 дней (на Google Drive и в Dropbox версионирование файлов поддерживается в пределах месяца).

После того как синхронизация настроена, заходим в настройки автоматической синхронизации, выбираем опцию «Использовать планировщик задач Windows» и из созданной задачи копируем строку запуска синхронизации вида ("C:\Program Files\Allway Sync\Bin\syncappw.exe" -e -m -l -s "41F5E385D231E69F376C3DA7A3C650B9"). Задачу планировщика не сохраняем, и галочку «Использовать планировщик» убираем, т.к. у нас все будет делать SQLAgent.

В наш Job со скриптом копирования бэкапов добавляем следующий шаг с типом CmdExec и вставляем туда строку запуска синхронизации через AllwaySync.

Так как сервис агента запускается под пользователем SQLSERVERAGENT, то необходимо скопировать файлы настроек AllwaySync  из папки пользователя, под которым мы делали настройки в такую же папку пользователя SQLАгента (C:\Users\SQLSERVERAGENT\AppData\Roaming\SyncAppSettings\_SYNCAPP)

Осталось только назначить расписание выполнения задачи или включить ее в цепочку плана обслуживания следующей после выполнения бэкапов.

Код скрипта PowerShell:

#dest - Путь к папке, куда будут копироваться файлы бэкапов
#dbases - Список баз данных через запятую, без пробелов
$dest = "C:\Dropbox"
$dbases = "Trade,Account"

if (-not (Test-Path $Dest))
{
    Write-Warning("Destination folder is not found")
    break
}

$sqlbases = "'" + $dbases.Replace(",","','") + "'"

$query = @“
SELECT
	b.database_name AS DBName,
	b.Type,
	media.Physical_Device_name As FileName
FROM (SELECT
		lb.database_guid,
		MAX(lb.Backup_finish_date) AS Backup_finish_date,
		lb.[type]
	FROM
		msdb..backupset lb		
	WHERE
		lb.database_name IN ($sqlbases)
		AND lb.[type] IN ('D','I')
	GROUP BY
		lb.database_guid,
		lb.[type]) LastBackup
	INNER JOIN msdb..backupset b ON b.Backup_finish_date = LastBackup.Backup_finish_date AND b.database_guid = LastBackup.database_guid
	INNER JOIN msdb.dbo.backupmediafamily media ON b.media_set_id = media.media_set_id
ORDER BY
	b.database_name,
	b.Type   
"@

$connection = New-Object System.Data.SqlClient.SqlConnection
$connection.ConnectionString = "Server=(local);Database=msdb;Integrated Security=True;"
$connection.Open()

$command = $connection.CreateCommand()
$command.CommandText = $query

$result = $command.ExecuteReader()

$table = new-object “System.Data.DataTable”
$table.Load($result)

$connection.Close()

foreach ($Row In $table.Rows)
{ 
    $SourceFileName = $Row.FileName
    if (-not (Test-Path $SourceFileName -PathType Leaf))
    {
        Write-Warning("File: " + $SourceFileName + " is not found")
        Continue
    }
       
    if ($Row.Type -eq "D") {$Type = "_Full.bak"} else {$Type = "_Incr.bak"}

    $DestFileName = $dest + "\" + $Row.DBName + $Type

    
    $SourceFile = Get-ChildItem -Path $SourceFileName
    if (Test-Path $DestFileName -PathType Leaf)
    {
        $DestFile = Get-ChildItem -Path $DestFileName
        if ($DestFile.LastWriteTime -ne $SourceFile.LastWriteTime)
        {
            $SourceFile.CopyTo($DestFileName, $true)
        }
        
    }
    else
    {
        $SourceFile.CopyTo($DestFileName, $true)
    } 
}

Вступайте в нашу телеграмм-группу Инфостарт

SQL Backup Cloud бэкап облако хранилище облачное хранилище

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Архивирование (backup) Инструменты администратора БД 1С:Предприятие 8 1C:Бухгалтерия 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Платные (руб)

Данная разработка позволит решить вопрос с резервным копированием Ваших баз в автоматическом режиме, расположенных на сервере 1С. Система умеет ставить блокировки на вход, блокировать фоновые задания, принудительно отключать сеансы пользователей. И все это система делает в автоматически при создании бэкапа (или через команду). Выгрузка происходит в родной формат 1С - .dt. Так же система умеет архивировать данные выгрузки с установкой пароля. Умеет менять расширение файла zip или dt на любое указанное вами, что позволит сохранить выгрузки от шифровальщика. Может удалять старые копии выгрузок, оставляя указанное количество резервных копий, начиная с самой поздней. Только для WINDOWS! Версия 1.4 от 28.05.2026

7320 руб.

06.11.2012    80400    635    45    

94

Архивирование (backup) Обновление 1С Системный администратор Разработчик 1С 8.3 Бесплатно (free)

Платформа 8.3.17, MS SQL Server: обновление конфигурации падает через 15 секунд на этапе обновления предопределённых данных, и конфигуратор при каждом входе предлагает только повторить. Проверьте у себя, когда сделана последняя полная копия базы: у нас её не было почти месяц. Разбор по минутам: что не помогло (перезапуск агента сервера 1С, перезагрузка, пакетный /UpdateDBCfg, три совета со стороны) и почему. Как ibcmd достал .dt из базы, которая не открывается, и как новую базу подставили под старым именем в кластере 1С через rac, не трогая пользователей. Простой 57 минут, потерь данных нет. Отдельно ошибки ИИ-агента Claude, который работал на сервере, и порядок действий на случай, если это случилось у вас.

03.11.2026    515    nedomolkov.ivan    12    

5

Архивирование (backup) Инструменты администратора БД Системный администратор Разработчик 1С 8.3 1С:Управление торговлей 11 1С:Библиотека стандартных подсистем Абонемент ($m)

Полностью автоматизированная внешняя обработка для администрирования 1С: блокировка/разблокировка ИБ, массовое завершение сеансов, резервное копирование и восстановление из .dt, выгрузка/загрузка конфигурации (.cf), пакетная работа с расширениями (.cfe) и дополнительными обработками – всё через удобную форму без ручных запусков конфигуратора и консоли кластера

1 стартмани

21.01.2026    6510    66    war41k    0    

18

Архивирование (backup) Групповая разработка (Git, хранилище) Системный администратор Разработчик Бесплатно (free)

Как дать возможность каждому разработчику 1С вести разработку, тестирование и оптимизацию на собственной полноразмерной копии базы и при этом не тратить миллиарды рублей и тысячи часов на развертывание тестового окружения, а так же экономить дисковое пространство? Расскажем о том, как с помощью инструмента Database Lab получать полноразмерные копии базы 1C на СУБД PostgreSQL за считанные секунды (даже в случае использования многотерабайтных баз).

15.12.2025    14204    nasonkin    19    

31

Архивирование (backup) Учет документов Бухгалтер 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

В текущих версиях 1С пока нет функции, позволяющей автоматически отмечать возврат оригиналов документов с помощью сканера штрих-кодов. Многие контрагенты часто сталкиваются с проблемой утери оригиналов УПД или их невозврата. В ответ на эти запросы было разработано расширение, которое упрощает контроль за возвратом оригиналов документов и помогает лучше организовать их хранение.

12200 руб.

19.02.2025    2945    3    0    

3

Архивирование (backup) Системный администратор 1С 8.3 Бесплатно (free)

Предлагаю Вашему вниманию 3 скрипта на bash (sh) для архивирования (backup) типовых конфигураций на Linux средствами 1С и Postgres. Перед запуском корректно заполните раздел "Параметры" в соответствии с Вашими настройками.

20.01.2025    5985    Prelude    5    

12

Архивирование (backup) 1С 8.3 1С:Библиотека стандартных подсистем Абонемент ($m)

Резервные копии базы 1С без завершения сеансов: .dt, файл базы, PostgreSQL, MS SQL, своя команда. Расписание, профили, ротация, ZIP, FTP, журнал и письмо об ошибке. Платформа 8.3+ (кроме 8.2), любая конфигурация с БСП. Подключение за 5 минут.

5000 руб.

27.08.2024    4143    1    6    

2

HighLoad оптимизация Администрирование СУБД Архивирование (backup) Системный администратор Разработчик 1С:Предприятие 8 Бесплатно (free)

Бэкап в Postgres состоит из набора граблей, которые нужно обойти для успешного восстановления. Они заложены в самых неожиданных местах от предмета резервного копирования (база или кластер) до структуры каталогов. Один неверный шаг и восстановление будет невозможным. Почему нельзя было сделать проще, как в MS SQL или Oracle? Почему бэкап в Postgres оставляет впечатление чьей-то лабораторной работы? Статья адресована прежде всего специалистам 1С, избалованным комфортом в MS SQL, в суровых буднях импортозамещения на Postgres.

13.08.2024    10696    1CUnlimited    11    

6
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. awk 745 18.03.16 15:18 Сейчас в теме
Плюс поставил за красивый пример на PowerShell.
maksa2005; +1 – Ответить
2. tank68 17 24.03.16 10:20 Сейчас в теме
Сделаю закладочку спасибо за пример
3. BadMadJohn 34 27.03.16 19:40 Сейчас в теме
Хочу добавить еще, что как вариант можно установить десктопную версию Google Drive и через майкрософтовскую утилиту srvany заставить его работать в качестве сервиса. Тогда не нужно будет устанавливать и настраивать скрипт для запуска программы синхронизации Allway Sync. Все обновленные файлы бэкапов, которые мы закинули скриптом в папку облачного хранилища будут автоматически закачаны в облако, и при этом будет сохраняться версионность каждого типа бэкапа для каждой базы на гугл диске глубиной в 30 дней.
unduty; fomstas; +2 – Ответить
4. MsDjuice 114 18.05.17 17:23 Сейчас в теме
Рекомендую сервис mega.nz. Вымогатель-шифровальщик Spora Ramsomware поел базу и все бэкапы, очень легко восстановилось все. Отличная функция сохранения версий файлов.
5. user1714081 17.12.21 10:22 Сейчас в теме
Очень удобное решение. Долго пользовался на MSSQL 2014, пока не перешел на MSSQL 2016. Там задание со скриптом выдает ошибку:

Текст ошибки


Разрешения на папку, в которую должны копироваться файлы предоставлены учетке агента SQL. Да и пробовал дать разрешения на папку полностью всем - все равно отказано в доступе. Может в самом SQL 2016 еще нужно выдать какие то дополнительные разрешения на учетку MSSQL?
Для отправки сообщения требуется регистрация/авторизация