Compartilhar via


O SQL Server faz backup da URL 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. Embora esse valor especifique o tamanho máximo da transferência, ele não garante que cada parte enviada seja de 10 MB. O tamanho da parte é influenciado pela adjacência dos dados. Por exemplo, se houver 4 MB de dados adjacentes a 2 MB de dados, 6 MB serão enviados após atingirem a parte mínima de tamanho de 5 MB. Como alternativa, se houver 12 MB de dat adjacente, os dados até o tamanho máximo (10 MB) serão enviados e os 2 MB restantes serão enviados na próxima parte. O conector S3 sempre tenta enviar o tamanho máximo dos dados possíveis, mas nunca excede o MAXTRANSFERSIZE valor.

O tamanho máximo suportado de um único arquivo é o resultado de 10.000 partes * MAXTRANSFERSIZE. Se for necessário fazer backup de um arquivo maior, ele deverá ser dividido ou fracionado 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 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 é 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ê precisa de ambos para se autenticar no ponto de extremidade S3.
  • Pelo menos um bucket foi configurado. Buckets não podem ser criados ou configurados pelo 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 CREATE DATABASE permissões para poder executar 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 de função de banco de dados fixa só pode ser verificada quando o banco de dados está acessível e não danificado, o que nem sempre ocorre quando RESTORE é executado, os db_owner membros da função de banco de dados fixa 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 DISCO.
  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, o MAXTRANSFERSIZE valor é 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. Não há suporte para WITH CREDENTIAL.
  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

WITH opções Ponto de Extremidade de S3 Observações
BLOCKSIZE Yes MAXTRANSFERSIZE determina o tamanho da Parte.
BUFFERCOUNT Yes
COMPRESSION Yes
COPY_ONLY Yes
CREDENTIAL Yes
DESCRIPTION Yes
DIFFERENTIAL Yes
ENCRYPTION Yes
FILE_SNAPSHOT Não
MAXTRANSFERSIZE Yes 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 Yes
MEDIANAME Yes
MIRROR TO Yes Só funciona com outra URL, MIRROR com URL e DISK não tem suporte.
NAME Yes
NOFORMAT / FORMAT Yes
NOINIT / INIT Não Não há suporte para anexação. Para substituir um backup, use o WITH FORMAT.
NO_CHECKSUM / CHECKSUM Yes
NO_TRUNCATE Yes
REGION Yes O valor padrão é us-east-1. Deve ser usada com BACKUP_OPTIONS.
STATS Yes

Argumentos com suporte para restauração

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

Região

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. A autoridade de certificação deve estar em vigor antes que o processo do SQL Server seja iniciado.

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 armazenamento de objetos compatível com 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 fazer backup no armazenamento de objetos compatíveis com S3 no SQL Server Express e no 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:

  • Devido à limitação atual da API REST Padrão S3, os arquivos de dados temporários não confirmados criados no repositório de objetos compatíveis com S3 do cliente (devido a uma operação de carregamento de várias partes em andamento) enquanto o comando T-SQL de BACKUP estiver em execução, não serão removidos se houver falhas de backup. 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 arquivos temporários por meio do sistema coletor de lixo.
  • 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.
  • O nome da credencial do SQL é limitado a 128 caracteres no formato UTF-16.
  • O ID da chave secreta não deve ter o caractere :.

Estilo de caminho e estilo de host virtual

O backup no S3 permite que a URL seja escrita 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

Fazer backup na 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