Резервное копирование SQL Server по URL-адресу хранилища объектов, совместимого с S3

Область применения: SQL Server 2022 (16.x)

В этой статье приведены основные понятия, требования и компоненты, необходимые для использования хранилища объектов, совместимого с S3, в качестве назначения резервного копирования. Функции резервного копирования и восстановления практически аналогичны работе с функцией Резервное копирование SQL Server по URL-адресу для Хранилища BLOB-объектов Azure в качестве типа устройства резервного копирования.

Сведения о поддерживаемых платформах см. в списке поставщиков хранилищ объектов, совместимых с S3.

Обзор

SQL Server 2022 (16.x) представляет интеграцию хранилища объектов с платформой данных, что позволяет интегрировать SQL Server с хранилищем объектов, совместимым с S3, в дополнение к служба хранилища Azure. Чтобы обеспечить эту интеграцию, SQL Server поддерживает соединитель S3, который использует REST API S3 для подключения к любому поставщику хранилища объектов, совместимого с S3. SQL Server 2022 (16.x) расширяет существующий синтаксис BACKUP/RESTORE TO/FROM URL, добавив поддержку нового соединителя S3 с помощью REST API.

URL-адреса, указывающие на S3-совместимые ресурсы, содержат префикс s3:// для указания того, что используется соединитель S3. URL-адреса, начинающиеся с s3:// всегда, предполагают, что базовый протокол .https

Ограничения для количества частей и размера файла

Для хранения данных поставщик хранилища объектов, совместимый с S3, должен разделить файлы в нескольких блоках, называемых частями, похожими на блочные BLOB-объекты в Хранилище BLOB-объектов Azure.

Каждый файл может быть разделен до 10 000 частей, каждый размер части составляет от 5 МБ до 20 МБ, этот диапазон управляется командой T-SQL BACKUP с помощью параметра MAXTRANSFERSIZE. Значение MAXTRANSFERSIZE по умолчанию — 10 МБ, поэтому размер каждой части по умолчанию составляет 10 МБ.

Максимально поддерживаемый размер одного файла является результатом умножения 10 000 частей на MAXTRANSFERSIZE. Если требуется резервное копирование большего файла, его необходимо разделить с чередованием до 64 URL-адресов. Максимальный поддерживаемый размер файла равен 10 000 частям, умноженным на MAXTRANSFERSIZE URL-адресов.

Примечание.

Для изменения MAXTRANSFERSIZE значений требуется использование СЖАТИЯ.

Необходимые условия для конечной точки S3

Конечная точка S3 должна быть настроена следующим образом:

  • Необходимо настроить TLS. Предполагается, что все подключения будут безопасно передаваться по протоколу HTTPS, а не HTTP. Конечная точка проверяется сертификатом, установленным на узле ОС SQL Server.
  • Учетные данные, созданные в хранилище объектов, совместимом с S3, с соответствующими разрешениями для выполнения операции. Пользователь и пароль, созданные на уровне хранения, называются Access Key ID и Secret Key ID. Необходимо выполнить проверку подлинности в конечной точке S3.
  • Должен быть настроен хотя бы один контейнер. Не удается создать или настроить контейнеры из SQL Server 2022 (16.x).

Безопасность

Разрешения резервного копирования

Чтобы подключить SQL Server к хранилищу объектов, совместимым с S3, необходимо установить два набора разрешений, один на SQL Server, а также на уровне хранилища.

В SQL Server учетная запись пользователя, используемая для выдачи команд BACKUP или RESTORE, должна находиться в роли базы данных db_backupoperator с разрешениями на изменение разрешений учетных данных .

На уровне хранилища:

  • В AWS S3 создайте пользовательскую роль и конкретное состояние, для которого требуется доступ к API S3. Для резервного копирования и восстановления требуются следующие разрешения: ListBucket (Обзор), PutObject (запись — для резервного копирования).
  • В другом хранилище, совместимом с S3, пользователь (Access Key ID) должен иметь разрешения ListBucket и WriteOnly .

Восстановление разрешений

Если восстанавливаемая база данных не существуют, для выполнения инструкции RESTORE у пользователя должны быть разрешения CREATE DATABASE. Если база данных существует, члены предопределенных ролей сервера sysadmin и dbcreator, а также владелец базы данных (dbo) по умолчанию обладают разрешениями RESTORE.

Разрешения на выполнение инструкции RESTORE даются ролям, в которых данные о членстве всегда доступны серверу. Так как членство в предопределенной роли базы данных может быть проверено только тогда, когда база данных доступна и не повреждена, что не всегда имеет место при выполнении инструкции RESTORE, члены предопределенной роли базы данных db_owner не имеют разрешений RESTORE.

На уровне хранилища:

  • В AWS S3 создайте пользовательскую роль и конкретное состояние, для которого требуется доступ к API S3. Для резервного копирования и восстановления требуются следующие разрешения: ListBucket (Обзор), GetObject (чтение — для восстановления).
  • В другом хранилище, совместимом с S3, пользователь (Access Key ID) должен иметь разрешения ListBucket и ReadOnly .

Поддерживаемые функции

Общие сведения о поддерживаемых функциях BACKUP и RESTORE:

  1. Размер одного файла резервной копии может составлять до 200 000 МиБ на URL-адрес (со значением MAXTRANSFERSIZE, установленном на 20 МБ).
  2. Резервные копии можно чередовать не более чем по 64 URL-адресам.
  3. Зеркальное отображение поддерживается, но только по URL-адресам. Зеркальное отображение с помощью URL-адреса и ДИСКА не поддерживается.
  4. Сжатие поддерживается и рекомендуется.
  5. Поддерживается шифрование.
  6. Восстановление по URL-адресу с S3-совместимым хранилищем объектов не имеет ограничений по размеру.
  7. При восстановлении базы данных определяется значением, MAXTRANSFERSIZE назначенным на этапе резервного копирования.
  8. URL-адреса можно указать либо в формате виртуального узла, либо в формате пути.
  9. WITH CREDENTIAL поддерживается.
  10. REGION поддерживается, а значение по умолчанию — us-east-1 .
  11. MAXTRANSFERSIZEДиапазоны от 5 МБ до 20 МБ. 10 МБ — это значение по умолчанию для соединителя S3.

Поддерживаемые аргументы для резервного копирования

Параметры WITH Конечная точка S3 Примечания.
BLOCKSIZE Y MAXTRANSFERSIZE определяет размер части.
BUFFERCOUNT Y
COMPRESSION Y
COPY_ONLY Y
CREDENTIAL Y
ОПИСАНИЕ Y
DIFFERENTIAL (разностная) Y
ШИФРОВАНИЕ Y
FILE_SNAPSHOT N
MAXTRANSFERSIZE Y От 5 МБ (5 242 880 байт) до 20 МБ (20 971 520 байт), значение по умолчанию — 10 МБ (10 485 760 байт).
MEDIADESCRIPTION Y
MEDIANAME Y
MIRROR TO Y Работает только с другим URL-адресом и MIRRORURLDISK не поддерживается.
ИМЯ Y
NOFORMAT/FORMAT Y
NOINIT/INIT N Добавление не поддерживается. Чтобы перезаписать резервную копию, используйте WITH FORMAT.
NO_CHECKSUM/CHECKSUM Y
NO_TRUNCATE Y
REGION Y Значение по умолчанию: us-east-1. Должен использоваться с BACKUP_OPTIONS.
СТАТИСТИКА Y

Поддерживаемые аргументы для восстановления

Параметры WITH Конечная точка S3 Примечания.
BLOCKSIZE Y MAXTRANSFERSIZE определяет размер части.
BUFFERCOUNT N
КОНТРОЛЬНАЯ СУММА | NO_CHECKSUM Y
CREDENTIAL Y
ENABLE_BROKER | ERROR_BROKER_CONVERSATIONS | NEW_BROKER Y
ФАЙЛ N Логические имена не поддерживаются RESTORE FROM URL.
FILESTREAM Y
KEEP_CDC Y
KEEP_REPLICATION Y
LOADHISTORY Y
MAXTRANSFERSIZE Y
MEDIANAME Y
MEDIAPASSWORD N Требуется для некоторых резервных копий, выполненных до SQL Server 2012.
MOVE Y
PARTIAL Y
ПАРОЛЬ N Требуется для некоторых резервных копий, выполненных до SQL Server 2012.
ВОССТАНОВЛЕНИЕ | NORECOVERY | РЕЖИМЕ ОЖИДАНИЯ Y
REGION Y Значение по умолчанию: us-east-1. Должен использоваться с RESTORE_OPTIONS.
ЗАМЕНИТЬ Y
ПЕРЕЗАПУСК Y
RESTRICTED_USER Y
REWIND | NOREWIND N
СТАТИСТИКА Y
STOP_ON_ERROR | CONTINUE_AFTER_ERROR Y
STOPAT | STOPATMARK | STOPBEFOREMARK Y
ВЫГРУЗКА | NOUNLOAD N

Область/регион

Поставщик хранилища объектов, совместимый с S3, может предложить возможность определить конкретный регион для расположения контейнера. Использование этого необязательного параметра может обеспечить большую гибкость, указав регион, к которому принадлежит конкретный контейнер. Для этого параметра требуется совместное использование WITH либо BACKUP_OPTIONSRESTORE_OPTIONS. Эти параметры требуют объявления значения в формате JSON. Это позволяет сценариям, в которых поставщик хранилища, совместимый с S3, может иметь один и тот же универсальный URL-адрес, но распространяться по нескольким регионам. В этом случае команда резервного копирования или восстановления указывает на указанные регионы без необходимости изменять URL-адрес.

Если значение не объявлено, us-east-1 присваивается значение по умолчанию.

Пример резервного копирования:

WITH BACKUP_OPTIONS = '{"s3": {"region":"us-west-1"}}'

Пример восстановления:

WITH RESTORE_OPTIONS = '{"s3": {"region":"us-west-1"}}'

Поддержка Linux

SQL Server использует WinHttp для реализации клиента HTTP REST API-интерфейсов, которые он использует. Он использует хранилище сертификатов ОС для проверки сертификатов TLS, представленных конечной http(s) точкой. Тем не менее, в SQL Server на Linux центр сертификации необходимо разместить в предопределенном месте для создания в /var/opt/mssql/security/ca-certificates. В этой папке могут храниться и поддерживаться только первые 50 сертификатов.

SQL Server считывает сертификаты из папки во время запуска и добавляет их в хранилище доверия.

Только суперпользователю предоставляется право на запись в папке, а пользователю mssql — право на чтение.

Неподдерживаемые функции

  • Резервное копирование в хранилище объектов, совместимое с S3, с небезопасным http URL-адресом, не поддерживается. Клиенты отвечают за настройку узла S3 с URL-адресом https , и эта конечная точка проверяется сертификатом, установленным на узле ОС SQL Server.
  • Резервное копирование в S3-совместимое хранилище объектов не поддерживается в выпусках SQL Server Express и SQL Server Express Advanced Services.

Ограничения

Ниже перечислены текущие ограничения резервного копирования и восстановления с S3-совместимым хранилищем объектов:

  1. Из-за текущего ограничения S3 Standard REST API временные незафиксированные файлы данных, созданные в хранилище объектов, совместимом с клиентом (из-за текущей многопартийной операции отправки) во время выполнения команды BACKUP T-SQL, не удаляются в случае сбоев. Эти незафиксированные блоки данных продолжают сохраняться в хранилище объектов, совместимом с S3, в случае сбоя команды BACKUP T-SQL или отмены. Если резервная копия выполнена успешно, эти временные файлы автоматически удаляются хранилищем объектов для формирования окончательного файла резервной копии. Некоторые поставщики хранилища, совместимые с S3, обрабатывают это с помощью системы сборщика мусора.
  2. Длина URL-адреса ограничена 259 символами. В этом ограничении учитывается полная строка, включая имя соединителя s3://. Таким образом, допустимый предел составляет 254 символа. Тем не менее, мы рекомендуем придерживаться лимита в 200 символов, чтобы учесть возможное введение параметров запроса.
  3. Имя учетных данных SQL ограничено 128 символами в формате UTF-16.
  4. Идентификатор секретного ключа не должен иметь : символ.

Стиль пути и стиль виртуального узла

Резервное копирование в S3 поддерживает запись URL-адреса как в стиле пути, так и в стиле виртуального узла.

Пример стиля пути: s3://<endpoint>:<port>/<bucket>/<backup_file_name>

Пример виртуального узла: s3://<bucket>.<domain>/<backup_file_name>

Примеры

Создание учетных данных

  • Имя учетных данных должно указать путь к хранилищу и существует несколько стандартов для этого в зависимости от платформы хранения.
  • Параметр IDENTITY всегда должен иметь значение 'S3 Access Key' при использовании соединителя S3.
  • Идентификатор ключа доступа и идентификатор секретного ключа не должны содержать двоеточие. Идентификатор ключа доступа и идентификатор секретного ключа — это пользователь и пароль, созданные в хранилище объектов, совместимом с S3.
  • Допускаются только буквенно-цифровые значения.
  • Идентификатор ключа доступа должен иметь надлежащие разрешения на хранилище объектов, совместимого с S3.

Используйте CREATE CREDENTIAL для создания учетных данных уровня сервера для проверки подлинности с конечной точкой хранилища объектов, совместимой с S3.

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

BACKUP DATABASE [SQLTestDB]
TO      URL = 's3://<endpoint>:<port>/<bucket>/SQLTestDB.bak'
WITH    FORMAT /* overwrite any existing backup sets */
,       STATS = 10
,       COMPRESSION;

Однако AWS S3 поддерживает два разных стандарта URL-адреса.

  • S3://<BUCKET_NAME>.S3.<REGION>.AMAZONAWS.COM/<FOLDER> (по умолчанию)
  • S3://S3.<REGION>.AMAZONAWS.COM/<BUCKET_NAME>/<FOLDER>

Существует несколько подходов к успешному созданию учетных данных для AWS S3.

-- S3 bucket name: datavirtualizationsample
-- S3 bucket region: us-west-2
-- S3 bucket folder: backup

CREATE CREDENTIAL [s3://datavirtualizationsample.s3.us-west-2.amazonaws.com/backup]
WITH    
        IDENTITY    = 'S3 Access Key'
,       SECRET      = 'accesskey:secretkey';
GO

BACKUP DATABASE [AdventureWorks2022]
TO URL  = 's3://datavirtualizationsample.s3.us-west-2.amazonaws.com/backup/AdventureWorks2022.bak'
WITH COMPRESSION, FORMAT, MAXTRANSFERSIZE = 20971520;
GO

или

CREATE CREDENTIAL [s3://s3.us-west-2.amazonaws.com/datavirtualizationsample/backup]
WITH    
        IDENTITY    = 'S3 Access Key'
,       SECRET      = 'accesskey:secretkey';
GO

BACKUP DATABASE [AdventureWorks2022]
TO URL  = 's3://s3.us-west-2.amazonaws.com/datavirtualizationsample/backup/AdventureWorks2022.bak'
WITH COMPRESSION, FORMAT, MAXTRANSFERSIZE = 20971520;
GO

Резервное копирование по URL-адресу

В следующем примере выполняется полное резервное копирование базы данных в конечную точку хранилища объектов с чередованием нескольких файлов:

BACKUP DATABASE <db_name>
TO      URL = 's3://<endpoint>:<port>/<bucket>/<database>_01.bak'
,       URL = 's3://<endpoint>:<port>/<bucket>/<database>_02.bak'
,       URL = 's3://<endpoint>:<port>/<bucket>/<database>_03.bak'
--
,       URL = 's3://<endpoint>:<port>/<bucket>/<database>_64.bak'
WITH    FORMAT -- overwrite
,       STATS               = 10
,       COMPRESSION;

Восстановление из URL-адреса

В следующем примере выполняется восстановление базы данных из расположения конечной точки хранилища объектов:

RESTORE DATABASE <db_name>
FROM    URL = 's3://<endpoint>:<port>/<bucket>/<database>_01.bak'
,       URL = 's3://<endpoint>:<port>/<bucket>/<database>_02.bak'
,       URL = 's3://<endpoint>:<port>/<bucket>/<database>_03.bak'
--
,       URL = 's3://<endpoint>:<port>/<bucket>/<database>_64.bak'
WITH    REPLACE -- overwrite
,       STATS  = 10;

Параметры шифрования и сжатия

В следующем примере показано, как создать резервную копию и восстановить AdventureWorks2022 базу данных с шифрованием, MAXTRANSFERSIZE как 20 МБ и сжатие:

CREATE MASTER KEY ENCRYPTION BY PASSWORD = <password>;
GO

CREATE CERTIFICATE AdventureWorks2022Cert
    WITH SUBJECT = 'AdventureWorks2022 Backup Certificate';
GO
-- Backup database
BACKUP DATABASE AdventureWorks2022
TO URL = 's3://<endpoint>:<port>/<bucket>/AdventureWorks2022_Encrypt.bak'
WITH FORMAT, MAXTRANSFERSIZE = 20971520, COMPRESSION,
ENCRYPTION (ALGORITHM = AES_256, SERVER CERTIFICATE = AdventureWorks2022Cert)
GO

-- Restore database
RESTORE DATABASE AdventureWorks2022
FROM URL = 's3://<endpoint>:<port>/<bucket>/AdventureWorks2022_Encrypt.bak'
WITH REPLACE

Использование региона для резервного копирования и восстановления

В следующем примере показано, как создать резервную копию и восстановить AdventureWorks2022 базу данных с помощью REGION_OPTIONS:

Вы можете параметризировать регион в каждой BACKUP/RESTORE команде. Обратите внимание на строку региона S3 в строке BACKUP_OPTIONS и RESTORE_OPTIONS, например, '{"s3": {"region":"us-west-2"}}'. Регион по умолчанию — us-east-1. Вот простой пример:

-- Backup Database
BACKUP DATABASE AdventureWorks2022
TO URL = 's3://<endpoint>:<port>/<bucket>/AdventureWorks2022.bak'
WITH BACKUP_OPTIONS = '{"s3": {"region":"us-west-2"}}'

-- Restore Database
RESTORE DATABASE AdventureWorks2022
FROM URL = 's3://<endpoint>:<port>/<bucket>/AdventureWorks2022.bak'
WITH 
  MOVE 'AdventureWorks2022' 
  TO 'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\AdventureWorks2022.mdf'
, MOVE 'AdventureWorks2022_log' 
  TO 'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\AdventureWorks2022.ldf'
, RESTORE_OPTIONS = '{"s3": {"region":"us-west-2"}}'

Например:

-- S3 bucket name: datavirtualizationsample
-- S3 bucket region: us-west-2
-- S3 bucket folder: backup

CREATE CREDENTIAL   [s3://datavirtualizationsample.s3.amazonaws.com/backup]
WITH    
        IDENTITY    = 'S3 Access Key'
,       SECRET      = 'accesskey:secretkey';
GO

BACKUP DATABASE [AdventureWorks2022]
TO URL  = 's3://datavirtualizationsample.s3.amazonaws.com/backup/AdventureWorks2022.bak'
WITH
    BACKUP_OPTIONS = '{"s3": {"region":"us-west-2"}}' -- REGION AS PARAMETER)
, COMPRESSION, FORMAT, MAXTRANSFERSIZE = 20971520;
GO

RESTORE DATABASE AdventureWorks2022_1 
FROM URL = 's3://datavirtualizationsample.s3.amazonaws.com/backup/AdventureWorks2022.bak'
WITH 
  MOVE 'AdventureWorks2022' 
  TO 'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\AdventureWorks2022_1.mdf'
, MOVE 'AdventureWorks2022_log' 
  TO 'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\AdventureWorks2022_1.ldf'
, STATS = 10, RECOVERY
, REPLACE, RESTORE_OPTIONS = '{"s3": {"region":"us-west-2"}}'; -- REGION AS PARAMETER)
GO