Данная статья не относится к HOW-TO, но я все равно постараюсь подробно описать процесс создания/подключения бакета и настройки бэкапов напрямую с Mssql.
Важно: поддержка загрузки на s3 описана для версий mssql с начала 16.0

Регистрируемся на Selectel, создаем через веб-интерфейс бакет (приватный, холодное хранение).

Создаем в разделе «Пользователи» пользователя, обязательно ставим галочку «Использовать эти данные для доступа по протоколу S3».

У Selectel аккаунт объектного хранилища состоит в формате <номер аккаунта>_<логин> как единая сущность. Например: аккаунт будет в виде 99999_Delaney , где 99999 уникальный номер аккаунта.
Важно! убеждаемся в том, что в пароле нет двоеточия(:). Это запрещенный символ для S3 в логине/пароле, поскольку везде будет использоваться формат <аккаунт>:<пароль>, например 99999_Delaney:HBqXu-1[(<

Далее пользователю нужно выдать права чтение/запись на бакет (контейнер) и применить.
В противном случае будет ошибка доступа.

Далее в Mssql необходимо создать учетные данные S3 ресурса. Это делается запросом в консоль

CREATE CREDENTIAL

CREATE CREDENTIAL [s3://<endpoint>:<port>/<bucket>]
WITH
IDENTITY = 'S3 Access Key',
SECRET = '<AccessKeyID>:<SecretKeyID>';

[s3://<endpoint>:<port>/<bucket>] - ссылка на S3 ресурс. В нашем случае используется ссылка на s3 ресурс selectel и бакет test1 без указания порта.

IDENTITY = 'S3 Access Key',
Важно, оставляем неизменным (дает знать SQL серверу, что это авторизационные данные для S3)

<AccessKeyID> - логин (в нашем случае 99999_Delaney)

<SecretKeyID> - пароль

Итого, для нашего случая:

CREATE CREDENTIAL [s3://s3.storage.selcloud.ru/test1]
WITH
IDENTITY = 'S3 Access Key',
SECRET = '99999_Delaney:HBqXu-1[(<';

А в случае ошибок с логином/паролем-
DROP CREDENTIAL [s3://s3.storage.selcloud.ru/test1]

Далее уже приступаем к созданию плана резервного копирования.
Заходим в management studio, создаем план, даем ему имя.

Переходим в сам план, внутрь вложенного плана, открываем панель элементов и выбираем «задача резервное копирование базы данных», перетягиваем. По желанию ПКМ по задаче и можно будет сменить название.

Открываем настройки, в основном выбираем тип резервной копии, базу данных(одну или несколько) и пункт «создать резервную копию на URL адрес».
Важно, при выборе нескольких БД копирование будет происходить на S3 ресурс внутрь одного бакета! ( особенности п.1). Мне захотелось порядка, поэтому мне пришлось сделать несколько заданий в одном плане, для каждой бд отдельно.

В целевом объекте выбираем SQL credential (созданные нами выше).
Azure storage container- непосредственно путь к нужной папке. В нашем случае бакет test1, папка test_it. (test1/test_it) Папка test_it будет создана автоматически


Важно. Если редактируете в данном поле, то URL префикс необходимо будет поправить, иначе он сменится автоматически на подобный "https://s3 access key.blob.core.windows.net/test1/test_it", что будет некорректно. Советую данный пункт пропускать, поскольку он автоматически подставится при указании префикса.

в URL prefix необходимо указать s3://s3.storage.selcloud.ru/test1/test_it, где s3:// говорит о необходимости загрузки на s3 ресурс, s3.storage.selcloud.ru ссылка на сервер, далее путь в формате бакет/папка.

Расширение файла советую оставлять стандартным.

В параметрах можно указать собственные настройки, у меня это:

После сохранения видим такую картину:

На текущем этапе задача будет создавать полную копию базы IT , загружать на s3 ресурс.

Далее создаем идентичную задачу, только в основном меняем создание резервной копии на диск. В целевом объекте выбираем "создать файл резервной копии для каждой базы данных". И выбираем папку, куда необходимо сохранять бэкапы. Допустим, X:\Backup
В таком случае бэкапы выбранных баз/базы будут сохраняться напрямую в папку Backup.
При установки галочки "создавать вложенный каталог для каждой базы данных" в папке Backup будет создана подпапка с наименованием базы. Т.е. бэкапы будут сохраняться в X:\Backup\название базы\

Далее необходимо создать цепочку с очередностью выполнения задач, иначе могут возникнуть сложности(проблемы п2). Это делается просто - перетянув зеленую стрелку от главной задачи до следующей.

Мне приоритетнее сохранить сначала на s3, а потом уже на локальный диск. В вашем случае вы можете создать абсолютно любой план. В своих, следом я настроил очистку после обслуживания, которая удаляет старые бэкапы с диска.
Важно. К сожалению ,автоматического удаления бэкапов с s3 мне еще не удалось настроить, пока приходится вручную. Но если дадите совет, буду благодарен.

Далее в конструкторе планов можно указать время автоматического запуска вашего плана. (оно указывается отдельно для каждого вложенного плана)

Затем сохраняемся и можем проверить в планах, что план работает корректно, ПКМ>выполнить.

Если несколько вложенных планов, то будет ошибка. Необходимо запустить задачу вручную, внутри Агента>задания>. Задание будет иметь имя в формате Название плана.название вложенного плана (например- test1.ВложенныйПлан_1).

В моем случае схема бэкапа баз получилась такая в большинстве своем из-за того, что я не хотел, чтобы в моем бакете s3 был хаотичный список со всеми бэкапами. Не претендует на единственно правильный вариант, поскольку сам изучаю только возможности. Если для вас это не критично, то в целом хватит одной задачи на бэкап s3, и второй для локальной. Возможно следовало бы объединить локальные бэкапы в одну задачу, дабы упростить схему. Но первоначально я планировал сделать не цепочку задач, а параллельные.

Особенности

1. При загрузке через URL в рамках одной задачи можно загружать бэкапы только в один бакет/папку. Хотя при выборе сохранения на жесткий диск есть возможность сохранения в подпапку с названием базы, что создает нормальную и удобную иерархию.
В целом при сохраненнии на URL это терпимо, но когда больше нескольких баз и большое количество бэкапов - это крайне неудобно и загружено, как по мне.

2. URL префикс возможно использовать только в нижнем регистре. Хотя на самом S3 ресурсе регистр имеет значение, и если у вас на S3 бакет называется "Backup", то при вводе URL в задачу он будет выглядеть в формате: s3://s3.storage.selcloud.ru/backup/
Вроде бы логично, что нужно проверить, чтобы бакет был в идентичном регистре. Но для меня это оказалось неочевидно и я долго промучался, смотря на ошибку с некорректным путем. Соответственно, пришлось использовать все названия в нижнем регистре.
Подозреваю, что проблема исключительно в визуальном интерфейсе.

3. При включении логирования внутри задачи агента, созданной планом обслуживания я встретился с неочевидным, но вполне логичным явлением - в случае любых изменений внутри плана обслуживания эти настройки слетают (если были правки конкретной задачи).

Проблемы

1. Почему-то при включении ведения журнала в самом плане обслуживания лог файл создается и отображает только первую запущенную задачу, причем отображение именно запроса. Никакой особо полезной информации больше нет.

  1. Лично мне непонятно, как именно и в каком порядке запускаются задачи, если задачи не в виде цепочки, а просто находятся по соседству.



    Причем тут заметил особенность- если задач бэкапов больше чем пять штук, то на одну из них выдает ошибку. 161(Указан недопустимый путь.) Самое интересное, что если отдельно проверять проблемную задачу, то все работает корректно.Но если задачи объединить в цепочку, то все задачи отрабатывают корректно.

В целом-то было логично, что задачи должны выполняться в хаотичном выборе, либо выполняться только одна, либо ошибка. Но ошибка касается именно записи на s3 ресурс, что странно.

Ошибка операционной системы 5 (Отказано в доступе)

Проблемы либо в URL, либо в авторизационных данных и у сервера не получается подключиться по указанному пути с указанными данными.

Ссылки

https://learn.microsoft.com/ru-ru/sql/relational-databases/backup-restore/sql-server-backup-to-url-s3-compatible-object-storage?view=sql-server-ver16

https://learn.microsoft.com/ru-ru/sql/relational-databases/backup-restore/sql-server-backup-to-url-s3-compatible-object-storage-best-practices-and-troubleshooting?view=sql-server-ver16

https://learn.microsoft.com/ru-ru/sql/relational-databases/backup-restore/sql-server-backup-and-restore-with-s3-compatible-object-storage?view=sql-server-ver16

https://docs.selectel.ru/cloud/object-storage/containers/

Комментарии (4)


  1. Tzimie
    09.09.2023 16:35
    +1

    Когда я вижу GUI SQL на русском, моя рука тянется к пистолету


  1. UnusualLetter
    09.09.2023 16:35

    Важно. К сожалению ,автоматического удаления бэкапов с s3 мне еще не удалось настроить, пока приходится вручную. Но если дадите совет, буду благодарен.

    Поскольку бакеты у вас не создаются автоматически, то можно один раз руками настроить lifecycle для каждого бакета — Managing your storage lifecycle - Amazon Simple Storage Service


    1. MsDoos Автор
      09.09.2023 16:35

      оооо, Спасибо огромное! Selectel еще подсказал как именно это настроить, и скоро допишу статейку.


  1. dude_sam
    09.09.2023 16:35

    Просто в качестве ремарки хочу напомнить об такой альтернативе, как SQL Server Maintenance Solution by Ola Hallengren

    Бонусом идёт возможность храния всего в коде и версифицирования.

    Ну, и автоматизация генерации заданий и команд при вашем желании пописать немного кода.