Поделиться через


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

Применимо к: SQL Server 2022 (16.x)

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

Дополнительные сведения об использовании Azure Blob Storage для операций резервного копирования или восстановления 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';

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

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

Установите имя учётной записи

Выберите любое имя учетных данных, если идентификатор ключа доступа и идентификатор секретного ключа предоставляют доступ к URL-адресу резервного копирования S3. При использовании учетных данных с произвольным именем необходимо явно ссылаться на него в инструкции BACKUP/RESTORE, добавив CREDENTIAL параметр.

В следующем примере создаётся учетная запись с произвольным именем:

CREATE CREDENTIAL [myOwnCredential]
WITH IDENTITY = 'S3 Access Key',
SECRET = '<AccessKeyID>:<SecretKeyID>';

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

BACKUP DATABASE [Test]
TO URL = 's3://<your-endpoint>/myS3Bucket/sqlbackups/AdventureWorks2022.bak'
WITH COMPRESSION, NOFORMAT, NAME = N'FULL bkp', MAXTRANSFERSIZE = 20971520, CREDENTIAL = N'myOwnCredential'

Используйте путь URL-адреса S3 в качестве имени учетных данных

Назовите учетные данные с помощью пути URL-адреса S3. При таком подходе SQL Server автоматически выполняет поиск учетных данных, и вам не нужно указывать параметр CREDENTIAL в инструкции BACKUP/RESTORE. SQL Server пытается найти наиболее конкретные соответствующие учетные данные на основе URL-адреса.

В следующем примере создается учетная запись для 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> не может содержать символ :. Если учетные данные не создаются перед выполнением запроса резервного копирования и восстановления, SQL Server возвращает следующее сообщение об ошибке:

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, SQL Server пытается использовать следующие имена учетных данных:

  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 выбирает наиболее конкретный. Это поведение позволяет настроить детализированный контроль доступа на уровне каталога, для которого можно получить доступ к папкам из SQL Server.

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

В настоящее время параметр BACKUP Transact-SQL FILE_SNAPSHOT не поддерживается для хранилища объектов, совместимого с S3. FILE_SNAPSHOT — это параметр, зависящий от Azure Blob Storage.

Если выполнить следующий 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-адрес Azure Blob Storage. Инструкция синтаксиса 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 и сервером 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 on Linux

SQL Server использует WinHttp для реализации клиента REST API HTTP, который он использует. SQL Server использует хранилище сертификатов ОС для проверки сертификатов TLS, представленных конечной точкой HTTPS. Однако SQL Server on 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.