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

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

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

Дополнительные сведения об использовании Хранилища BLOB-объектов Azure для операций резервного копирования или восстановления SQL Server см. в следующих разделах.

Устранение неполадок и распространенные причины ошибок

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

Убедитесь, что URL-адрес правильно сформирован

В следующем примере URL-адрес виртуального узла сформирован правильно при выполнении запроса на резервное копирование T-SQL:

BACKUP DATABASE AdventureWorks2022
TO URL = 's3://<bucketName>.<virtualHost>/<pathToBackup>/<backupFileName>' 

Или для стиля пути URL-адреса:

BACKUP DATABASE AdventureWorks2022
TO URL = 's3://<domainName>/<bucketName>/<pathToBackup>/<backupFileName>';

Просмотрите URL-адрес:

  1. URL-адрес начинается со схемы s3://.

  2. Виртуальный узел <virtualHost> или домен сервера <domainName> хранилища S3 доступен и выполняется с помощью HTTPS. Конечная точка будет проверена центром сертификации, установленным на узле ОС SQL Server.

  3. <bucketName> — это имя этого контейнера, в котором записывается резервная копия. Его необходимо создать перед запуском резервного копирования T-SQL. Резервная копия T-SQL не создает контейнер для клиента. Например, если пользователь не создает контейнер nonExistingBucket заранее и запускает инструкцию T-SQL следующим образом:

    BACKUP DATABASE AdventureWorks2022
    TO URL = 's3://<your-endpoint>/nonExistingBucket/AdventureWorks2022.bak';
    

    URL-адрес, который неправильно сформирован, может возвращать следующее:

    Msg 3201, Level 16, State 1, Line 50
    Cannot open backup device 's3://<your-endpoint>/nonExistingBucket/AdventureWorks2022.bak'. Operating system error 50(The request is not supported.).
    Msg 3013, Level 16, State 1, Line 50
    BACKUP DATABASE is terminating abnormally.
    
  4. <pathToBackup> не нужно перед запуском резервного копирования T-SQL. Он создается автоматически на сервере хранилища. Например, если пользователь заранее создает контейнер existingBucket, а не путь 'existingBucket/sqlbackups', следующее по-прежнему будет успешно выполнено:

BACKUP DATABASE AdventureWorks2022
TO URL =  's3://<your-endpoint>/existingBucket/sqlbackups/AdventureWorks2022.bak';

Создание учетных данных на уровне сервера перед запуском резервного копирования или восстановления

Прежде чем выполнять запросы Transact-SQL на хранилище, совместимое с S3, необходимо создать учетные данные уровня сервера. Эти учетные данные должны содержать ключ доступа и секретный ключ, настроенные клиентами на сервере хранилища объектов, совместимом с S3, перед выдачой запросов резервного копирования и восстановления.

Примером учетных данных, которые необходимо создать для URL-адреса s3://<your-endpoint>/myS3Bucket/sqlbackups/AdventureWorks2022.bak, будет следующее:

CREATE CREDENTIAL [s3://<your-endpoint>/myS3Bucket/sqlbackups/AdventureWorks2022.bak]
WITH IDENTITY = 'S3 Access Key',
SECRET = '<AccessKeyID>:<SecretKeyID>';

Этот оператор <AccessKeyID> не может содержать символ :. Если учетные данные не созданы до выполнения запроса резервного копирования и восстановления, пользователь увидит следующее сообщение об ошибке:

Msg 3201, Level 16, State 1, Line 50
Cannot open backup device 's3://<your-endpoint>/myS3Bucket/sqlbackups/AdventureWorks2022.bak'. Operating system error 50(The request is not supported.).
Msg 3013, Level 16, State 1, Line 50
BACKUP DATABASE is terminating abnormally.

Имя учетных данных не требуется для сопоставления точного пути URL-адреса. Ниже указан пример работы поиска учетных данных. Если нам нужно запросить путь s3://10.193.16.183:9000/myS3Bucket/sqlbackups/AdventureWorks2022.bak, попробуются следующие имена учетных данных:

  1. s3://10.193.16.183:8787/myS3Bucket/sqlbackups/AdventureWorks2022.bak
  2. s3://10.193.16.183:8787/myS3Bucket/sqlbackups
  3. s3://10.193.16.183:8787/myS3Bucket

Если поиск совпадает с несколькими учетными данными, например более конкретным s3://10.193.16.183:8787/myS3Bucket/sqlbackups и более универсальным s3://10.193.16.183:8787/myS3Bucket, выберите наиболее конкретный. Это позволяет настроить более детализированный контроль доступа на уровне каталога для доступа к папкам из SQL Server.

Неподдерживаемый параметр FILE_SNAPSHOT

В настоящее время параметр BACKUP TSQL FILE_SNAPSHOT не поддерживается для хранилища объектов, совместимого с S3. Это параметр Хранилища BLOB-объектов Azure.

Если пользователь запускает следующий код Transact-SQL, например:

BACKUP DATABASE AdventureWorks2022
TO URL = 's3://<your-endpoint>/myS3Bucket/sqlbackups/AdventureWorks2022.bak'
WITH FILE_SNAPSHOT;

Выдается следующее сообщение об ошибке:

Msg 3073, Level 16, State 1, Line 62
The option WITH FILE_SNAPSHOT is only permitted if all database files are in Azure Storage.
Msg 3013, Level 16, State 1, Line 62
BACKUP DATABASE is terminating abnormally.

Полоса резервного копирования, превышающая 100 ГБ

В настоящее время размер одного файла резервного копирования, созданного клиентами в хранилище объектов, совместимых с S3, во время резервной копии не может превышать 100 ГБ на файл, используя значение по умолчанию MAXTRANSFERSIZE. Если полоса резервного копирования выходит за рамки 100 ГБ, инструкция синтаксиса T-SQL резервного копирования выдает следующее сообщение об ошибке:

Msg 3202, Level 16, State 1, Line 161
Write on 's3://<endpoint>:<port>/<bucket>/<path>/<db_name>.bak' failed: 87(The parameter is incorrect.)
Msg 3013, Level 16, State 1, Line 161
BACKUP DATABASE is terminating abnormally.

Текущее руководство по большим базам данных резервного копирования пользователя использует несколько полос для резервной копии базы данных, каждая из допустимых размеров меньше или равно 100 ГБ. Резервное копирование T-SQL поддерживает чередование до 64 URL-адресов, например:

BACKUP DATABASE AdventureWorks2022
TO URL = 's3://<endpoint>:<port>/<bucket>/<path>/<db_file>_1.bak',
URL = 's3://<endpoint>:<port>/<bucket>/<path>/<db_file>_2.bak';

Альтернативным вариантом для пользователей является применение параметра COMPRESSION:

BACKUP DATABASE AdventureWorks2022
TO URL = 's3://<your-endpoint>/myS3Bucket/sqlbackups/AdventureWorks2022.bak'
WITH COMPRESSION;

Максимальная длина URL-адреса

Общая длина URL-адреса ограничена 259 байтами подсистемой резервного копирования и восстановления. Это означает, что количество символов для s3://hostname/objectkey не должно превышать 259. Оставив s3://, пользователь может ввести длину пути (имя узла + ключ объекта), которое равняется 259 – 5 = 254 символам. См. страницу Резервное копирование SQL Server по URL-адресу — SQL Server. Инструкция синтаксиса T-SQL резервного копирования выдает следующее сообщение об ошибке:

SQL Server has a maximum limit of 259 characters for a backup device name. The BACKUP TO URL consumes 36 characters for the required elements used to specify the URL - 'https://.blob.core.windows.net//.bak', leaving 223 characters for account, container, and blob names put together'

Исправление неравномерного распределения часов

Хранилище S3 может отклонить подключение, вызвав ошибку InvalidSignatureException в SQL Server всякий раз, когда разница времени между сервером SQL и сервером S3 превышает 15 минут. В SQL Server он отображается следующим образом:

Msg 3201, Level 16, State 1, Line 28
Cannot open backup device '<path>'. Operating system error 5(Access is denied.).
Msg 3013, Level 16, State 1, Line 28
BACKUP DATABASE is terminating abnormally.

SQL Server при поддержке Linux

SQL Server использует WinHttp для реализации клиента HTTP REST API-интерфейсов, которые он использует. Он использует хранилище сертификатов ОС для проверки сертификатов TLS, представленных конечной точкой HTTP.S. Однако SQL Server на Linux делегирует проверку сертификата SQLPAL, которая проверяет сертификаты HTTPS конечных точек с сертификатом, отправленным с помощью PAL. Таким образом, самозаверяющий сертификат клиента нельзя использовать в Linux для проверки HTTPS.

Во время резервного копирования и восстановления клиент получает следующее сообщение об ошибке в Linux:

Msg 3201, Level 16, State 1, Line 20
Cannot open backup device 's3://<endpoint>/<bucket>/testingDB.bak'. Operating system error 12175(failed to retrieve text for this error. Reason: 15105).
Msg 3013, Level 16, State 1, Line 20
BACKUP DATABASE is terminating abnormally.

Чтобы получить прошлое эту проблему, необходимо создать следующее предопределенное расположение: /var/opt/mssql/security/ca-certificates Поместите самозаверяемые сертификаты или сертификаты, не отправленные с помощью PAL в этом расположении. SQL Server считывает сертификаты из папки во время запуска и добавляет их в хранилище доверия PAL.

В этом расположении можно хранить до 50 файлов, если папка не создана, и при запуске SQL Server отобразится журнал ошибок SQL Server:

2022-02-05 00:32:10.86 Server      Installing Client TLS certificates to the store.
2022-02-05 00:32:10.88 Server      Error searching first file in /var/opt/mssql/security/ca-certificates: 3(The system cannot find the path specified.)

Блокировка объекта— хранение удаления не поддерживается

Резервное копирование SQL Server в хранилище объектов, совместимое с S3, не поддерживает блокировку объектов, также называемую функцией удаления. Блокировка объекта предотвращает удаление или перезаписи файлов в течение срока хранения.

Расположение контейнеров и папок, предназначенных для операции резервного копирования, не должно включать блокировку объектов. Если эта функция включена и настроена в хранилище объектов, совместимого с S3, операция резервного копирования завершается ошибкой со следующим сообщением:

Msg 3202, Level 16, State 1, Line 13
Write on 's3://<your-endpoint>/nonExistingBucket/AdventureWorks2022.bak' failed: 87 (The parameter is incorrect).
Msg 3013, Level 16, State 1, Line 13
BACKUP DATABASE is terminating abnormally.