Настройка бэкапов Mssql с резервированием на s3 (Selectel)

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Данная статья не относиться к 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> - пароль

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


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(Указан недопустимый путь.)

161(Указан недопустимый путь.) Возможные причины сбоя: проблемы с этим запросом, свойство «ResultSet» установлено неправильно, параметры установлены неправильно или соединение было установлено неправильно»

Самое интересное, что если отдельно проверять задачу, то все работает корректно. Если задачи объединить в цепочку, то все отрабатывает корректно.

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

  1. Ошибка «Ошибка операционной системы 5 (Отказано в доступе.)»
    В таком случае серверу не удается подключиться по указанному вами пути с указанными логином/паролем.

Ссылки

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/

Источник: https://habr.com/ru/articles/759960/


Интересные статьи

Интересные статьи

Привет, меня зовут Андрей. Я старший разработчик Selectel, работаю в команде дисков и бэкапов. Наша команда занимается развитием сетевых дисков и услуги резервного копирования в облаке. Год наза...
Всем привет, читатели Habr! В начале я хочу сделать акцент на том, что статья ориентирована для новичков, однако может быть полезной для более опытных коллег. В этой статье я расскажу про то, что тако...
Всем, кто занимается электроникой, так или иначе знакомы контроллеры AVR. Начинающим они знакомы, по большей части, за счёт экосистемы Arduino. В данной статье я попытаюсь рассказать начинающим програ...
Одним из наиболее значимых нововведений в Zextras Suite стало появление функции двухфакторной аутентификации, позволяющей защитить учетные записи пользователей от несанкционированного дос...
Бывает так, что приходится сталкиваться с задачами, к решению которых ты вроде бы и не готов, а получить результат надо здесь и сейчас. Знакомо, да? Добро пожаловать в ми...