Práticas recomentadas e solução de problemas de backup em URL do SQL Server para armazenamento de objetos compatível com o S3

Aplica-se a: SQL Server 2022 (16.x)

Este artigo inclui as melhores práticas e dicas de solução de problemas para backup e restaurações do SQL Server em armazenamento de objetos compatível com o S3.

Para obter mais informações sobre como usar o Armazenamento de Blobs do Azure para operações de backup ou restauração do SQL Server, confira:

Solução de problemas e causas de erro comuns

Veja a seguir algumas maneiras rápidas de solucionar problemas de erros ao fazer backup ou restauração do armazenamento de objetos compatível com o S3. Para evitar erros devido a limitações ou opções sem suporte, consulte Backup e restauração do SQL Server com o armazenamento de objetos compatível com S3.

Garantir uma URL formada corretamente

Veja o seguinte exemplo de uma URL de host virtual formada corretamente ao emitir uma consulta de backup do T-SQL:

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

Ou para o estilo de caminho de URL:

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

Revise na URL:

  1. A URL começa com o esquema s3://.

  2. O host virtual <virtualHost> ou o domínio de servidor <domainName> de armazenamento do S3 existe e está em execução usando HTTPS. O ponto de extremidade será validado por uma AC instalada no Host do sistema operacional do SQL Server.

  3. <bucketName> é o nome deste bucket em que o backup é gravado. Ele deve ser criado antes de executar o T-SQL de backup. O T-SQL de backup não cria o bucket para o cliente. Por exemplo, se o usuário não criar o bucket "nonExistingBucket" de antemão e executar uma instrução T-SQL da seguinte maneira:

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

    Uma URL não formada corretamente poderá retornar o seguinte:

    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. O <pathToBackup> não precisa existir antes de executar o T-SQL de backup. Ele será criado no servidor de armazenamento automaticamente. Por exemplo, se o usuário criar o bucket "existingBucket" de antemão e não criar o caminho 'existingBucket/sqlbackups', o seguinte ainda será executado com êxito:

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

Criar uma credencial no nível do servidor antes de executar backup/restauração

Antes de executar consultas Transact-SQL de backup/restauração no armazenamento compatível com o S3, você deve criar uma credencial no nível do servidor. Essa credencial precisa conter a Chave de acesso e a Chave secreta configuradas pelos clientes no servidor de armazenamento de objetos compatível com o S3 para emitir consultas de backup/restauração.

Veja o seguinte exemplo de uma credencial que precisa ser criada para a 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>';

Nesta instrução, <AccessKeyID> não pode conter um caractere :. Se a credencial não for criada antes de executar a consulta de backup/restauração, o usuário verá a seguinte mensagem de erro:

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.

O nome da credencial não é necessário para corresponder ao caminho exato da URL. Veja um exemplo de como a pesquisa de credenciais funcionará. Se precisarmos consultar o caminho s3://10.193.16.183:9000/myS3Bucket/sqlbackups/AdventureWorks2022.bak, os seguintes nomes de credencial serão experimentados:

  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

Se houver várias credenciais correspondendo à pesquisa, como a s3://10.193.16.183:8787/myS3Bucket/sqlbackups mais específica e a s3://10.193.16.183:8787/myS3Bucket mais genérica, escolheremos a mais específica. Isso permitirá que você configure um controle de acesso mais granular no nível do diretório, definindo quais pastas poderão ser acessadas por meio do SQL Server.

Opção FILE_SNAPSHOT sem suporte

Atualmente, não há suporte para a opção FILE_SNAPSHOT do BACKUP TSQL para armazenamento de objetos compatível com o S3. Essa é uma opção específica do Armazenamento de Blobs do Azure.

Se o usuário executar a seguinte instrução Transact-SQL, por exemplo:

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

A mensagem de erro a seguir será retornada:

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.

Faixa de backup superior a 100 GB

Atualmente, o tamanho de um único arquivo de backup criado por clientes no armazenamento de objetos compatível com o S3 durante um backup não pode exceder 100 GB por arquivo, usando o MAXTRANSFERSIZE padrão. Se a faixa de backup ultrapassar 100 GB, a instrução da sintaxe T-SQL de backup gerará a seguinte mensagem de erro:

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.

As diretrizes atuais para backup de bancos de dados grandes do usuário são usar várias faixas para o backup do banco de dados, cada uma com os tamanhos permitidos menores que ou iguais a 100 GB. O T-SQL BACKUP dá suporte à distribuição de até 64 URLs, por exemplo:

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

Uma alternativa para os usuários é usar a opção "COMPRESSION":

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

Comprimento máximo da URL

O comprimento total da URL é limitado a 259 bytes pelo mecanismo de Backup e Restauração. Isso significa que s3://hostname/objectkey não deve exceder 259 caracteres. Sem considerar o s3://, o usuário poderá inserir o comprimento do caminho (nome do host + chave de objeto) com 259 - 5 = 254 caracteres. Consulte Backup em URL do SQL Server – SQL Server. A sintaxe da instrução T-SQL de backup gerará a seguinte mensagem de erro:

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'

Correção de defasagem horária

O armazenamento do S3 pode rejeitar a conexão retornando um erro "InvalidSignatureException" ao SQL Server sempre que a diferença de horário entre o host do SQL e o servidor do S3 for maior que 15 minutos. No SQL Server, isso é mostrado como:

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.

Suporte ao SQL Server em Linux

O SQL Server usa WinHttp para implementar o cliente das APIs REST do HTTP que ele usa. Ele depende do repositório de certificados do sistema operacional para validações dos certificados do TLS que estão sendo apresentados pelo ponto de extremidade HTTP. No entanto, o SQL Server no Linux delega a validação do certificado ao SQLPAL, que valida os certificados HTTPS dos pontos de extremidade com o certificado enviado com a PAL. Portanto, os certificados autoassinados fornecidos pelo cliente não podem ser usados no Linux para validação de HTTPS.

Durante o backup/restauração, o cliente recebe a seguinte mensagem de erro no 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.

Para superar esse problema, o seguinte local predefinido deve ser criado: /var/opt/mssql/security/ca-certificates. Coloque certificados autoassinados ou certificados não enviados com PAL nesse local. O SQL Server lê os certificados da pasta durante a inicialização e os adiciona ao repositório confiável da PAL.

Até 50 arquivos podem ser armazenados nesse local; se a pasta não for criada, quando SQL Server for iniciado o log de erros do SQL Server mostrará:

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.)

Bloqueio de objeto: não há suporte para a retenção contra exclusão

O recurso de armazenamento de objetos compatível com backup do SQL Server para o S3 não oferece suporte ao Bloqueio de Objetos, também chamado de Retenção contra exclusão. O Bloqueio de Objetos impede que os arquivos sejam excluídos ou substituídos durante o período de retenção.

O bucket e o local da pasta direcionados pela operação de backup não devem ter o Bloqueio de Objeto habilitado. Se esse recurso estiver habilitado e configurado no armazenamento de objetos compatível com o S3, a operação de backup falhará com a seguinte mensagem:

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.