Backup em URL do SQL Server para armazenamento de objetos compatível com S3

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

Este artigo apresenta os conceitos, os requisitos e os componentes necessários para usar o armazenamento de objetos compatível com o S3 como um destino de backup. A funcionalidade de backup e restauração é conceitualmente semelhante a trabalhar com o Backup em URL do SQL Server para o Armazenamento de Blobs do Azure como um tipo de dispositivo de backup.

Para obter informações sobre as plataformas com suporte, confira Provedores de armazenamento de objetos compatível com o S3.

Visão geral

O SQL Server 2022 (16.x) introduz a integração do armazenamento de objetos à plataforma de dados, permitindo que você integre o SQL Server a um armazenamento de objetos compatível com o S3, além do Armazenamento do Azure. Para fornecer essa integração, o SQL Server tem suporte para um conector S3, que usa a API REST S3 para se conectar a qualquer provedor de armazenamento de objetos compatível com o S3. O SQL Server 2022 (16.x) estende a sintaxe BACKUP/RESTORE TO/FROM URL existente, adicionando suporte para o novo conector do S3 usando a API REST.

URLs que apontam para recursos compatíveis com S3 são prefixadas com s3:// para indicar que o conector do S3 está sendo usado. URLs começando com s3:// sempre pressupõem que o protocolo subjacente seja https.

Limitações de números de partes e de tamanho do arquivo

Para armazenar dados, o provedor de armazenamento de objetos compatível com o S3 deve dividir arquivos em vários blocos chamados partes, da mesma forma que os blobs de blocos no Armazenamento de Blobs do Azure.

Cada arquivo pode ser dividido em até 10 mil partes, e cada tamanho de parte varia de 5 MB a 20 MB. Essa faixa é controlada pelo comando T-SQL BACKUP por meio do parâmetro MAXTRANSFERSIZE. O valor padrão de MAXTRANSFERSIZE é 10 MB, portanto, o tamanho padrão de cada parte é de 10 MB.

O tamanho máximo com suporte para um único arquivo é o resultado de 10.000 partes * MAXTRANSFERSIZE; se for necessário fazer backup de um arquivo maior, ele deverá dividido/distribuído em até 64 URLs. O tamanho máximo final com suporte para um arquivo é de 10.000 partes * MAXTRANSFERSIZE * URLs.

Observação

O uso de COMPRESSION é necessário para alterar valores MAXTRANSFERSIZE.

Pré-requisitos para o ponto de extremidade do S3

O ponto de extremidade do S3 deve ser configurado da seguinte maneira:

  • O TLS deve ser configurado. Supõe-se que todas as conexões serão transmitidas com segurança por HTTPS, e não por HTTP. O ponto de extremidade será validado por um certificado instalado no host do sistema operacional do SQL Server.
  • Credenciais criadas no armazenamento de objetos compatível com o S3 com permissões adequadas para executar a operação. O usuário e a senha criados na camada de armazenamento são nomeados como Access Key ID e Secret Key ID. Você precisará de ambos para se autenticar no ponto de extremidade do S3.
  • Pelo menos um bucket foi configurado. Buckets não podem ser criados nem configurados a partir do SQL Server 2022 (16.x).

Segurança

Permissões de backup

Para conectar o SQL Server ao armazenamento de objetos compatível com o S3, dois conjuntos de permissões precisam ser estabelecidos, um no SQL Server e também na camada de armazenamento.

No SQL Server, a conta de usuário usada para emitir os comandos BACKUP ou RESTORE deve estar na função de banco de dados db_backupoperator com as permissões Alterar qualquer credencial.

Na camada de armazenamento:

  • No AWS S3, crie uma função personalizada e indique especificamente qual API do S3 requer acesso. O backup e a restauração exigem estas permissões: ListBucket (procurar), PutObject (gravar, para backup).
  • Em outros armazenamentos compatíveis com o S3, o usuário (Access Key ID) deve ter permissões ListBucket e WriteOnly.

Restaurar permissões

Se o banco de dados que está sendo restaurado não existir, o usuário deverá ter permissões CREATE DATABASE para poder executar o comando RESTORE. Se o banco de dados existir, as permissões RESTORE assumirão como padrão os membros das funções de servidor fixas sysadmin e dbcreator, e o proprietário (dbo) do banco de dados.

As permissões RESTORE são concedidas a funções nas quais as informações de associação estão sempre disponíveis para o servidor. Como a associação da função de banco de dados fixa pode ser verificada apenas quando o banco de dados está acessível e não danificado, o que nem sempre é o caso quando RESTORE é executado, os membros da função de banco de dados fixa db_owner não têm permissões RESTORE.

Na camada de armazenamento:

  • No AWS S3, crie uma função personalizada e indique especificamente qual API do S3 requer acesso. O backup e a restauração exigem estas permissões: ListBucket (procurar), GetObject (ler, para restaurar).
  • Em outros armazenamentos compatíveis com o S3, o usuário (Access Key ID) deve ter permissões ListBucket e ReadOnly.

Recursos compatíveis

Visão geral de alto nível dos recursos com suporte para BACKUP e RESTORE:

  1. Um único arquivo de backup pode ter até 200.000 MiB por URL (com MAXTRANSFERSIZE definido como 20 MB).
  2. Os backups podem ser distribuídos por um máximo de 64 URLs.
  3. Há suporte para espelhamento, mas apenas entre URLs. Não há suporte para espelhamento usando URL e DISK.
  4. A compactação é compatível e recomendada.
  5. Há suporte para criptografia.
  6. A restauração da URL com armazenamento de objetos compatível com S3 não tem limitação de tamanho.
  7. Quando você está restaurando um banco de dados, MAXTRANSFERSIZE é determinado pelo valor atribuído durante a fase de backup.
  8. AS URLs podem ser especificadas no formato de host virtual ou de estilo de caminho.
  9. WITH CREDENTIAL é compatível.
  10. Há suporte para o REGION e o valor padrão é us-east-1.
  11. MAXTRANSFERSIZE varia de 5 MB a 20 MB. 10 MB é o valor padrão para o conector do S3.

Argumentos com suporte para Backup

Opções WITH Ponto de Extremidade do S3 Observações
BLOCKSIZE Y MAXTRANSFERSIZE determina o tamanho da Parte.
BUFFERCOUNT Y
COMPRESSION Y
COPY_ONLY Y
CREDENTIAL Y
DESCRIPTION Y
DIFFERENTIAL Y
ENCRYPTION Y
FILE_SNAPSHOT N
MAXTRANSFERSIZE Y De 5 MB (5.242.880 Bytes) a 20 MB (20.971.520 Bytes), o valor padrão é de 10 MB (10.485.760 Bytes).
MEDIADESCRIPTION Y
MEDIANAME Y
MIRROR TO Y Só funciona com outro URL. O MIRROR com URL e DISK não é compatível.
NOME Y
NOFORMAT/FORMAT Y
NOINIT/INIT N Não há suporte para acrescentar. Para substituir um backup, use o WITH FORMAT.
NO_CHECKSUM/CHECKSUM Y
NO_TRUNCATE Y
REGION Y O valor padrão é us-east-1. Deve ser usada com BACKUP_OPTIONS.
ESTATÍSTICAS Y

Argumentos com suporte para restauração

Opções WITH Ponto de Extremidade do S3 Observações
BLOCKSIZE Y MAXTRANSFERSIZE determina o tamanho da Parte.
BUFFERCOUNT N
CHECKSUM | NO_CHECKSUM Y
CREDENTIAL Y
{ ENABLE_BROKER | ERROR_BROKER_CONVERSATIONS | NEW_BROKER } Y
FILE N Não há suporte para nomes lógicos com RESTORE FROM URL.
FILESTREAM Y
KEEP_CDC Y
KEEP_REPLICATION Y
LOADHISTORY Y
MAXTRANSFERSIZE Y
MEDIANAME Y
MEDIAPASSWORD N Necessário para alguns backups feitos antes do SQL Server 2012.
MOVE Y
PARTIAL Y
PASSWORD N Necessário para alguns backups feitos antes do SQL Server 2012.
RECOVERY | NORECOVERY | STANDBY Y
REGION Y O valor padrão é us-east-1. Deve ser usada com RESTORE_OPTIONS.
REPLACE Y
RESTART Y
RESTRICTED_USER Y
REWIND | NOREWIND N
ESTATÍSTICAS Y
STOP_ON_ERROR | CONTINUE_AFTER_ERROR Y
{STOPAT | STOPATMARK | STOPBEFOREMARK} Y
UNLOAD | NOUNLOAD N

Region

Seu provedor de armazenamento de objetos compatível com o S3 pode oferecer a capacidade de determinar uma região específica para o local do bucket. O uso desse parâmetro opcional pode fornecer mais flexibilidade, especificando a qual região esse bucket específico pertence. Esse parâmetro requer o uso de WITH junto com BACKUP_OPTIONS ou RESTORE_OPTIONS. Essas opções exigem que o valor seja declarado no formato JSON. Isso permite cenários em que um provedor de armazenamento compatível com o S3 pode ter a mesma URL universal, mas estar distribuído entre várias regiões. Nesse caso, o comando de backup ou restauração aponta para as regiões especificadas sem a necessidade de alterar a URL.

Se nenhum valor for declarado, us-east-1 será atribuído como padrão.

Exemplo de backup:

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

Exemplo de restauração:

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

Suporte para 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(s). No entanto, no SQL Server em Linux a AC deve ser colocada em um local predefinido para ser criado em /var/opt/mssql/security/ca-certificates; há suporte somente para os primeiros 50 certificados armazenados nesta pasta.

O SQL Server lê os certificados da pasta durante a inicialização e os adiciona ao repositório confiável.

Somente o superusuário poderá gravar na pasta, e o usuário mssql poderá ler.

Recursos sem suporte

  • Não há suporte para backup em um armazenamento de objetos compatível com o S3 com uma URL http não segura. Os clientes são responsáveis por configurar o host do S3 com uma URL https, e esse ponto de extremidade será validado por um certificado instalado no host do sistema operacional do SQL Server.
  • Não há suporte para backup em armazenamento de objetos compatível com o S3 no SQL Server Express e SQL Server Express com edições de Serviços Avançados.

Limitações

Veja as seguintes limitações atuais de backup e restauração com o armazenamento de objetos compatível com o S3:

  1. Devido à limitação atual da API REST Standard do S3, os arquivos de dados temporários não confirmados criados no armazenamento de objetos compatível com o S3 do cliente (devido a uma operação de upload de várias partes em andamento) enquanto o comando T-SQL BACKUP estiver em execução não serão removidos em caso de falhas. Esses blocos de dados não confirmados continuarão a persistir no armazenamento de objetos compatível com o S3 caso o comando T-SQL BACKUP falhe ou seja cancelado. Se o backup for bem-sucedido, esses arquivos temporários serão removidos automaticamente pelo armazenamento de objetos para formar o arquivo de backup final. Alguns provedores de armazenamento compatível com o S3 lidarão com isso por meio do sistema coletor de lixo.
  2. O comprimento total da URL é limitado a 259 caracteres. A cadeia de caracteres completa é contada nessa limitação, incluindo o nome do conector s3://. Consequentemente, o limite utilizável é de 254 caracteres. No entanto, recomendamos manter um limite de 200 caracteres para permitir a possível introdução de parâmetros de consulta.
  3. O nome da credencial do SQL é limitado a 128 caracteres no formato UTF-16.
  4. O ID da chave secreta não deve ter o caractere :.

Estilo de caminho e estilo de host virtual

O backup no S3 oferece suporte à URL a ser gravada no estilo de caminho ou no estilo de host virtual.

Exemplo de estilo de caminho: s3://<endpoint>:<port>/<bucket>/<backup_file_name>

Exemplo de host virtual: s3://<bucket>.<domain>/<backup_file_name>

Exemplos

Criar credencial

  • O nome da credencial deve fornecer o caminho de armazenamento, e há vários padrões para isso, dependendo da plataforma de armazenamento.
  • A IDENTIDADE deve ser sempre 'S3 Access Key' ao usar o conector do S3.
  • A ID da Chave de Acesso e a ID da Chave Secreta não devem conter dois-pontos. O ID da chave de acesso e o ID da chave secreta é o usuário e a senha criados no armazenamento de objetos compatível com o S3.
  • Somente valores alfanuméricos são permitidos.
  • O ID da chave de acesso deve ter permissões adequadas no armazenamento de objetos compatível com o S3.

Use CREATE CREDENTIAL para criar uma credencial de nível de servidor para autenticação com o ponto de extremidade de armazenamento de objetos compatível com o 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;

No entanto, o AWS S3 oferece suporte a dois padrões diferentes de URL.

  • S3://<BUCKET_NAME>.S3.<REGION>.AMAZONAWS.COM/<FOLDER> (padrão)
  • S3://S3.<REGION>.AMAZONAWS.COM/<BUCKET_NAME>/<FOLDER>

Há várias abordagens para criar uma credencial para o AWS S3 com êxito.

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

Ou,

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

Backup para a URL

O exemplo a seguir executa um backup completo do banco de dados no ponto de extremidade de armazenamento de objetos, distribuído em vários arquivos:

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;

Restauração a partir da URL

O exemplo a seguir executa uma restauração de banco de dados do local do ponto de extremidade de armazenamento de objetos:

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;

Opções para criptografia e compactação

O seguinte exemplo mostra como fazer o backup e a restauração do banco de dados AdventureWorks2022 com criptografia, MAXTRANSFERSIZE como 20 MB e compactação:

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

Usar região para backup e restauração

O seguinte exemplo mostra como fazer o backup e a restauração do banco de dados AdventureWorks2022 usando REGION_OPTIONS:

Você pode parametrizar a região dentro de cada comando BACKUP/RESTORE. Observe a cadeia de caracteres de região específica do S3 em BACKUP_OPTIONS e RESTORE_OPTIONS, por exemplo, '{"s3": {"region":"us-west-2"}}'. A região padrão é us-east-1. Um exemplo simples:

-- 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"}}'

Por exemplo:

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