Copia de seguridad en URL de SQL Server para el almacenamiento de objetos compatible con S3

Se aplica a: SQL Server 2022 (16.x)

En este artículo se presentan los conceptos, los requisitos y los componentes necesarios para utilizar el almacenamiento de objetos compatible con S3 como destino de copia de seguridad. La funcionalidad de copia de seguridad y restauración es conceptualmente similar a trabajar con la copia de seguridad en URL de SQL Server para Azure Blob Storage como un tipo de dispositivo de copia de seguridad.

Para obtener información sobre las plataformas admitidas, consulte Proveedores de almacenamiento de objetos compatible con S3.

Información general

SQL Server 2022 (16.x) presenta la nueva integración de almacenamiento de objetos en la plataforma de datos, lo que le permite integrar SQL Server con un almacenamiento de objetos compatible con S3, aparte de con Azure Storage. Para proporcionar esta integración, SQL Server admite un nuevo conector de S3, que usa la API de REST de S3 para conectarse a cualquier proveedor de almacenamiento de objetos compatible con S3. SQL Server 2022 (16.x) amplía la sintaxis existente de URL BACKUP/RESTORE TO/FROM añadiendo compatibilidad con el nuevo conector S3 con la API de REST.

Las direcciones URL que apuntan a recursos compatibles con S3 tienen el prefijo s3:// para indicar que se está usando el conector S3. Las direcciones URL que comienzan por s3:// siempre suponen que el protocolo subyacente es https.

Limitaciones del tamaño de archivo y números de parte

Para almacenar datos, el proveedor de almacenamiento de objetos compatible con S3 debe dividir los archivos en varios bloques llamados partes, de forma similar a los blobs en bloques de Azure Blob Storage.

Cada archivo se puede dividir en un máximo de 10 000 partes, siendo el tamaño de cada una de estas de entre 5 y 20 MB. El comando T-SQL BACKUP controla este intervalo a través del parámetro MAXTRANSFERSIZE. El valor predeterminado de MAXTRANSFERSIZE es de 10 MB, de modo que el tamaño predeterminado de cada parte es de 10 MB.

El tamaño máximo admitido de un único archivo es el resultado de 10 000 partes * MAXTRANSFERSIZE, si es necesario hacer una copia de seguridad de un archivo más grande, debe dividirse o seccionarse en un máximo de 64 direcciones URL. El tamaño máximo final admitido de un archivo es de 10 000 partes * MAXTRANSFERSIZE * Direcciones URL.

Nota:

Se requiere el uso de COMPRESSION para cambiar los valores de MAXTRANSFERSIZE.

Requisitos previos para el punto de conexión S3

El punto de conexión de S3 debe haberse configurado de la siguiente manera:

  • TLS se debe configurar. Se presupone que todas las conexiones se transmitirán de forma segura a través de HTTPS, no de HTTP. Un certificado instalado en el host del sistema operativo de SQL Server valida el punto de conexión.
  • Credenciales creadas en el almacenamiento de objetos compatibles con S3 con los permisos adecuados para realizar la operación. El usuario y la contraseña creados en la capa de almacenamiento se denominan Access Key ID y Secret Key ID. Tanto usted como el usuario necesitan autenticarse en el punto de conexión S3.
  • Se ha configurado al menos un cubo. Los cubos no se pueden crear ni configurar a partir de SQL Server 2022 (16.x).

Seguridad

Permisos de copia de seguridad

Para conectar SQL Server al almacenamiento de objetos compatible con S3, es necesario establecer dos conjuntos de permisos, uno en SQL Server y otro en la capa de almacenamiento.

En SQL Server, la cuenta de usuario que se usa para emitir comandos BACKUP o RESTORE debe tener el rol de base de datos db_backupoperator con permisos Modificar cualquier credencial.

En la capa de almacenamiento:

  • En AWS S3, cree un rol personalizado y, específicamente, indique qué API de S3 necesita acceso. La copia de seguridad y la restauración necesitan estos permisos: ListBucket (exploración), PutObject (escritura: para la copia de seguridad).
  • En otro almacenamiento compatible con S3, el usuario (Access Key ID) debe tener los permisos ListBucket y WriteOnly.

Permisos para la restauración

Si la base de datos que se va a restaurar no existe, el usuario debe tener permisos CREATE DATABASE para poder ejecutar RESTORE. Si la base de datos existe, los permisos RESTORE corresponden de forma predeterminada a los miembros de los roles fijos de servidor sysadmin y dbcreator, así como al propietario (dbo) de la base de datos.

Los permisos RESTORE se conceden a los roles en los que la información acerca de la pertenencia está siempre disponible para el servidor. Debido a que la pertenencia a un rol fijo de base de datos solo se puede comprobar cuando la base de datos es accesible y no está dañada, lo que no siempre ocurre cuando se ejecuta RESTORE, los miembros del rol fijo de base de datos db_owner no tienen permisos RESTORE.

En la capa de almacenamiento:

  • En AWS S3, cree un rol personalizado y, específicamente, indique qué API de S3 necesita acceso. La copia de seguridad y la restauración necesitan estos permisos: ListBucket (exploración), GetObject (lectura: para la restauración).
  • En otro almacenamiento compatible con S3, el usuario (Access Key ID) debe tener los permisos ListBucket y ReadOnly.

Características admitidas

Información general de alto nivel de las características admitidas de BACKUP y RESTORE:

  1. Un único archivo de copia de seguridad puede ser de hasta 200 000 MiB por dirección URL (con MAXTRANSFERSIZE establecido en 20 MB).
  2. Las copias de seguridad se pueden seccionar en un máximo de 64 direcciones URL.
  3. Se admite la creación de reflejo, pero solo entre direcciones URL. No se admite la creación de reflejo mediante URL y DISK.
  4. Se admite y recomienda la compresión.
  5. Se admite el cifrado.
  6. La restauración desde la dirección URL con el almacenamiento de objetos compatible con S3 no tiene ninguna limitación de tamaño.
  7. Al restaurar una base de datos, MAXTRANSFERSIZE se determina por el valor asignado durante la fase de copia de seguridad.
  8. Las direcciones URL se pueden especificar en formato de estilo de ruta de acceso o de host virtual.
  9. WITH CREDENTIAL es compatible.
  10. REGION se admite y el valor predeterminado es us-east-1.
  11. MAXTRANSFERSIZE tiene un rango de entre 5 y 20 MB. 10 MB es el valor predeterminado del conector S3.

Argumentos admitidos para la copia de seguridad

Opciones de WITH Punto de conexión S3 Notas
BLOCKSIZE Y MAXTRANSFERSIZE determina el tamaño de la pieza.
BUFFERCOUNT Y
COMPRESSION Y
COPY_ONLY Y
CREDENTIAL Y
DESCRIPCIÓN Y
DIFFERENTIAL Y
ENCRYPTION Y
FILE_SNAPSHOT N
MAXTRANSFERSIZE Y De 5 MB (5 242 880 Bytes) a 20 MB (20 971 520 Bytes), el valor predeterminado es de 10 MB (10 485 760 Bytes)
MEDIADESCRIPTION Y
MEDIANAME Y
MIRROR TO Y Solo funciona con otra dirección URL, no se admite MIRROR con URL y DISK.
NOMBRE Y
NOFORMAT/FORMAT Y
NOINIT/INIT N No se admite la anexión. Para sobrescribir una copia de seguridad, use WITH FORMAT.
NO_CHECKSUM/CHECKSUM Y
NO_TRUNCATE Y
REGIÓN Y El valor predeterminado es us-east-1. Debe usarse con BACKUP_OPTIONS.
STATS Y

Argumentos admitidos para la restauración

Opciones de WITH Punto de conexión S3 Notas
BLOCKSIZE Y MAXTRANSFERSIZE determina el tamaño de la pieza.
BUFFERCOUNT N.
CHECKSUM | NO_CHECKSUM Y
CREDENTIAL Y
ENABLE_BROKER | ERROR_BROKER_CONVERSATIONS | NEW_BROKER Y
ARCHIVO N. Nombres lógicos no admitidos con RESTORE FROM URL
FILESTREAM Y
KEEP_CDC Y
KEEP_REPLICATION Y
LOADHISTORY Y
MAXTRANSFERSIZE Y
MEDIANAME Y
MEDIAPASSWORD N. Se necesita para algunas copias de seguridad realizadas antes de SQL Server 2012.
MOVE Y
PARTIAL Y
PASSWORD N. Se necesita para algunas copias de seguridad realizadas antes de SQL Server 2012.
RECOVERY | NORECOVERY | STANDBY Y
REGIÓN Y El valor predeterminado es us-east-1. Debe usarse con RESTORE_OPTIONS.
REPLACE Y
RESTART Y
RESTRICTED_USER Y
REWIND | NOREWIND N.
STATS Y
STOP_ON_ERROR | CONTINUE_AFTER_ERROR Y
STOPAT | STOPATMARK | STOPBEFOREMARK Y
UNLOAD | NOUNLOAD N.

Region

El proveedor de almacenamiento de objetos compatible con S3 puede ofrecer la capacidad de determinar una región específica para la ubicación del cubo. El uso de este parámetro opcional puede proporcionar más flexibilidad especificando a qué región pertenece ese cubo concreto. Este parámetro requiere el uso de WITH junto con BACKUP_OPTIONS o RESTORE_OPTIONS. Estas opciones requieren que el valor se declare en formato JSON. Esto permite escenarios en los que un proveedor de almacenamiento compatible con S3 puede tener la misma dirección URL universal, pero distribuirse entre varias regiones. En este caso, el comando de copia de seguridad o restauración apunta a las regiones especificadas sin necesidad de cambiar la dirección URL.

Si no se declara ningún valor, se asigna us-east-1 como valor predeterminado.

Ejemplo de copia de seguridad:

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

Ejemplo de restauración:

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

Compatibilidad de Linux

SQL Server utiliza WinHttp para implementar el cliente de las API REST de HTTP que utiliza. Se basa en el almacén de certificados del sistema operativo para las validaciones de los certificados TLS que presenta el punto de conexión http(s). Sin embargo, en SQL Server en Linux, la entidad de certificación debe situarse en una ubicación predefinida que se va a crear en /var/opt/mssql/security/ca-certificates. Solo se pueden almacenar y admitir en esta carpeta los primeros 50 certificados.

SQL Server leerá los certificados de la carpeta durante el inicio y los añadirá al almacén de confianza.

Solo el superusuario debe poder escribir en la carpeta, mientras que el usuario mssql debe poder leer.

Características no admitidas

  • No se admite la copia de seguridad en el almacenamiento de objetos compatible con S3 con una dirección URL http no segura. Los clientes son responsables de configurar su host de S3 con una dirección URL https y un certificado instalado en el host del sistema operativo de SQL Server valida este punto de conexión.
  • No se admite la copia de seguridad en el almacenamiento de objetos compatible con S3 en SQL Server Express y ediciones de SQL Server Express con Advanced Services.

Limitaciones

A continuación, detallamos las limitaciones actuales de copia de seguridad y restauración con el almacenamiento de objetos compatible con S3:

  1. Debido a la limitación actual de la API REST estándar de S3, los archivos de datos pendientes de confirmación temporales que se crean en el almacén de objetos compatible con S3 del cliente (debido a una operación de carga de varias partes en curso) mientras se ejecuta el comando BACKUP T-SQL, no se quitan en caso de errores. Estos bloques de datos pendientes de confirmación siguen conservándose en el almacenamiento de objetos compatible con S3 en caso de que se produzca un error en el comando BACKUP T-SQL o se cancele. Si la copia de seguridad se realiza correctamente, el almacén de objetos quita automáticamente estos archivos temporales para formar el archivo de copia de seguridad final. Algunos proveedores de almacenamiento compatibles con S3 controlarán esto a través de su sistema de recolector de elementos no utilizados.
  2. La longitud total de la dirección URL no puede superar los 259 caracteres. La cadena completa se cuenta en esta limitación, incluido el nombre del conector s3://. Por lo tanto, el límite utilizable es de 254 caracteres. Sin embargo, se recomienda adherirse a un límite de 200 caracteres para permitir la posible incorporación de parámetros de consulta.
  3. El nombre de la credencial de SQL está limitado a 128 caracteres en formato UTF-16.
  4. El ID de clave secreta no debe tener : carácter.

Estilo de ruta de acceso y estilo de host virtual

La copia de seguridad en S3 admite la dirección URL que se va a escribir en el estilo de ruta de acceso o en el estilo de host virtual.

Ejemplo de estilo de ruta: s3://<endpoint>:<port>/<bucket>/<backup_file_name>

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

Ejemplos

Crear una credencial

  • El nombre de la credencial debe proporcionar la ruta de acceso de almacenamiento, y hay varios estándares para ello en función de la plataforma de almacenamiento.
  • IDENTITY siempre debe ser 'S3 Access Key' cuando se usa el conector S3.
  • El identificador de clave de acceso y el identificador de clave secreta no deben contener dos puntos. El ID de clave de acceso y el ID de clave secreta son el usuario y la contraseña creados en el almacenamiento de objetos compatible con S3.
  • Solo pueden contener caracteres alfanuméricos.
  • El ID de clave de acceso debe tener los permisos adecuados en el almacenamiento de objetos compatible con S3.

Use CREATE CREDENTIAL para crear una credencial de nivel de servidor para la autenticación con el punto de conexión del almacenamiento de objetos compatible con 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;

Sin embargo, AWS S3 admite dos estándares diferentes de dirección URL.

  • S3://<BUCKET_NAME>.S3.<REGION>.AMAZONAWS.COM/<FOLDER> (valor predeterminado)
  • S3://S3.<REGION>.AMAZONAWS.COM/<BUCKET_NAME>/<FOLDER>

Hay varios enfoques para crear correctamente una credencial para AWS S3.

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

O bien,

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

Copia de seguridad en URL

En el ejemplo siguiente se realiza una copia de seguridad de base de datos completa en el punto de conexión de almacenamiento de objetos, seccionada en varios archivos:

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;

Restauración desde URL

En el ejemplo siguiente se realiza la restauración de una base de datos desde la ubicación del punto de conexión de almacenamiento 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;

Opciones de cifrado y compresión

En el ejemplo siguiente se muestra cómo realizar una copia de seguridad de la base de datos AdventureWorks2022 y cómo restaurarla con cifrado, MAXTRANSFERSIZE como 20 MB y compresión:

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

Utilizar la región para la copia de seguridad y la restauración

En el ejemplo siguiente se muestra cómo hacer una copia de seguridad y restaurar la base de datos AdventureWorks2022 con REGION_OPTIONS:

Puede parametrizar la región dentro de cada comando BACKUP/RESTORE. Fíjese en la cadena de región específica de S3 en la BACKUP_OPTIONS y la RESTORE_OPTIONS, por ejemplo, '{"s3": {"region":"us-west-2"}}'. La región predeterminada es us-east-1. Un ejemplo sencillo:

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

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