Integración de la API REST T-SQL en SQL Server 2025: Optimización de las copias de seguridad de las copias instantáneas de T-SQL

SQL Server 2025 ofrece una nueva y potente función que facilita la llamada a las API REST directamente desde T-SQL. Aquí, analizamos cómo usarlo con la API de Pure Storage para orquestar las operaciones de snapshot.

Streamlining T-SQL Snapshot Backups

Resumen

This article takes you through the steps for using a T-SQL script to create application-consistent snapshots on FlashArray from within SQL Server, without needing any external tools or scripts. 

image_pdfimage_print

Este artículo apareció originalmente en el blog de Anthony Nocentino. Se ha vuelto a publicar con el reconocimiento y el consentimiento del autor.

En esta publicación, le guiaré a través de un script T-SQL que crea copias instantáneas coherentes con las aplicaciones en FlashArray de Pure Storage®, todo ello desde SQL Server, sin herramientas externas. SQL Server 2025 presenta una nueva y potente característica: el procedimiento sp_invoke_external_rest_endpoint almacenado. Esta mejora hace que sea más fácil que nunca llamar a las API REST directamente desde T-SQL. Al combinar esta nueva capacidad con la API de Pure Storage, podemos orquestar las operaciones de snapshots sin problemas —sin necesidad de herramientas o scripts externos—.

Si ha seguido mi serie «Uso de copias de seguridad instantáneas de T-SQL», sabe que esta función ofrece unas ventajas enormes para los entornos de bases de datos grandes. Hoy veremos cómo implementarlo directamente en T-SQL aprovechando la capacidad de SQL Server para llamar a los puntos de conexión REST externos, sin necesidad de PowerShell.

ectamente en T-SQL, al aprovechar la capacidad de SQL Server para llamar a los terminales REST externos, no se necesita PowerShell.

Puede coger todo el scriptaquí.


Habilitación del punto final REST en SQL Server 2025

En primer lugar, vamos a asegurarnos de que podemos conectarnos a los puntos de conexión REST externos:

sp_configure 'external rest endpoint enabled', 1;
RECONFIGURE WITH OVERRIDE;

Esto permite que la función de punto final REST de SQL Server, que permite que nuestro servidor SQL realice llamadas salientes a la API REST. Esto es crucial para conectarse a la API de FlashArray para activar las copias instantáneas.

Es importante tener en cuenta sp_invoke_external_rest_endpointquerequiere que todos los terminales utilicen HTTPS con cifrado TLS y el certificado debe ser de confianza para el sistema operativo subyacente que aloja la instancia de SQL Server.

Autenticación con FlashArray

A continuación, estableceremos una sesión segura con FlashArray de Pure Storage usando el nuevoprocedimiento sp_invoke_external_rest_endpointde almacenamiento de SQL Server 2025. Esta característica representa un avance significativo en las capacidades de SQL Server, lo que nos permite realizar llamadas a la API REST directamente desde T-SQL sin scripts externos.

Para autenticarnos en una FlashArray, primero enviamos untoken API conpermisos suficientes al punto de conexión de inicio de sesión de la FlashArray. Tras la autenticación correcta, FlashArray devuelve anx-auth-tokenen los encabezados de respuesta, que se convierten en nuestra credencial de sesión para todas las operaciones posteriores de la API en esta sesión. Este modelo de autenticación basado en token proporciona un mecanismo seguro y con un tiempo limitado para las interacciones API, manteniendo al mismo tiempo un registro de auditoría claro de las operaciones.

En el código siguiente, ejecutaremos esta solicitud de autenticación y luego extraeremos eltokenx-authde la respuesta JSON para crear nuestros encabezados de autorización para las llamadas posteriores a la API REST.

DECLARE @ret INT, @response NVARCHAR(MAX), @AuthToken NVARCHAR(100), @MyHeaders NVARCHAR(100);

EXEC @ret = sp_invoke_external_rest_endpoint
 @url = N'https://flasharray1.purestorage.com/api/2.36/login',
 @headers = N'{"api-token":"PASTE_YOUR_TOKEN_HERE"}',
 @response = @response OUTPUT;

PRINT 'Login Return Code: ' + CAST(@ret AS NVARCHAR(10))
PRINT 'Login Response: ' + @response

Gestión de errores y extracción de tokens

Luego, verificaremos el éxito del inicio de sesión y extraeremos el token de autenticación. Si el código de devolución de FlashArray es distinto de 0, imprimiremos un mensaje de error y saldremos. Asumiendo el éxito, leeremos eltokenx-authde la respuesta de inicio de sesión. Tenga en cuenta que la clave de token debe incluir comillas dobles"x-auth-token"para garantizar JSON_VALUEquepuede analizarse correctamente. Una vez extraído, usaremos el token para construir el encabezado de autorización para las llamadas posteriores a la API REST a la cabina.

if ( @ret <> 0 )
    BEGIN
        PRINT 'Error in REST call, unable to login to the array.'
        RETURN
    END

SET @AuthToken = JSON_VALUE(@response, '$.response.headers."x-auth-token"'); 
SET @MyHeaders = N'{"x-auth-token":"' + @AuthToken + '", "Content-Type":"application/json"}'

PRINT 'Headers: ' + @MyHeaders

Congelación de la base de datos para las copias instantáneas

El paso crucial es suspender la I/O de escritura de la base de datos para prepararse para la copia instantánea. Este comando utiliza la función de copia de seguridad instantánea T-SQL de SQL Server 2022 para congelar las operaciones de I/O escritura en la base de datos. La base de datos sigue siendo legible, pero las operaciones de escritura se suspenden hasta que completamos nuestro proceso de snapshot. Esto garantiza que obtenemos una copia instantánea coherente con las aplicaciones.

ALTER DATABASE [TestDB1] SET SUSPEND_FOR_SNAPSHOT_BACKUP = ON

Toma de la instantánea del almacenamiento

Con I/O de escritura congeladas en la base de datos, estamos listos para tomar una instantánea en FlashArray. El siguiente paso es llamar al endpointprotection-group-snapshotsREST RESTpara iniciar una copia de seguridad instantánea del grupo de protección.

EXEC @ret = sp_invoke_external_rest_endpoint
 @url = N'https://flasharray1.purestorage.com/api/2.36/protection-group-snapshots',
 @headers = @MyHeaders,
 @payload = N'{"source_names":"aen-sql-25-a-pg"}',    
 @response = @response OUTPUT;

PRINT 'Snapshot Return Code: ' + CAST(@ret AS NVARCHAR(10))
PRINT 'Snapshot Response: ' + @response

Aquí llamamos al punto final de la API RESTprotection-group-snapshotsendpoint de FlashArray para crear una copia instantánea de un grupo de protección llamadoaen-sql-25-a-pg. El grupo de protección tiene que contener todos los volúmenes en los que se almacenan nuestros archivos de base de datos. La FlashArray creará una copia instantánea puntual de todos los volúmenes de este grupo de protección.

Extracción del nombre de la instantánea y creación de la copia de seguridad

En el siguiente paso, extraemos el nombre de la copia instantánea de la respuesta JSON de FlashArray usandoJSON_VALUE(@response, '$.result.items[0].name'). Este nombre se incluirá en la Descripción de los medios de copia de seguridad como parte de una copia de seguridad solo de metadatos. Si FlashArray devuelve un código de éxito (código de devolución = 0), procederemos con la copia de seguridad usando el comandoBASEDA DE COPIA DE SEGURIDAD y METADATA_ONLYlaopción. Esto crea un archivo de copia de seguridad ligero que contiene solo los metadatos de la base de datos y una referencia a la copia instantánea de FlashArray enMEDIADESCRIPTION. El almacenamiento del nombre de la copia instantánea en MEDIADESCRIPTION facilita la identificación y la localización de la copia instantánea de FlashArray correspondiente cuando se realiza una operación de restauración.

Si la operación de la copia instantánea falla, registramos un mensaje de error y cancelamos inmediatamente la suspensión de la base de datos para reanudar las I/O de escritura normales.

DECLARE @SnapshotName NVARCHAR(100)
SET @SnapshotName = JSON_VALUE(@response, '$.result.items[0].name')

if ( @ret = 0 ) 
    BEGIN
        BACKUP DATABASE [TestDB1] TO DISK='SnapshotBack.bkm' WITH METADATA_ONLY, MEDIADESCRIPTION=@SnapshotName
        PRINT 'Snapshot backup successful. Snapshot Name: ' + @SnapshotName
    END
ELSE 
    BEGIN
        ALTER DATABASE [TestDB1] SET SUSPEND_FOR_SNAPSHOT_BACKUP = OFF
        PRINT 'Error in REST call, snapshot backup failed. Database unsuspended.'
    END

Comprobación del registro de errores de SQL Server

Para verificar el funcionamiento de nuestras copias de seguridad, comprobamos el registro de errores de SQL Server.

El registro de errores de SQL Server confirma que la copia de seguridad de la copia instantánea de la base de datos de TestDB1 solo tiene éxito con los metadatos. El registro muestra que la base de datos se ha suspendido, que la I/O de escritura se ha congelado y que la copia instantánea se ha tomado antes de que se reanudara I/O manera segura. Como se trata de una copia de seguridad solo de metadatos, no se procesaron páginas de datos; solo se capturaron metadatos y se escribieron en el archivo specified.bkm. Esto garantiza una copia instantánea coherente con la aplicación, con un impacto mínimo en la disponibilidad de la base de datos.

EXEC xp_readerrorlog 0, 1, NULL, NULL, NULL, NULL, N'desc'

2025-05-09 12:03:25.120 Backup  BACKUP DATABASE successfully processed 0 pages in 0.004 seconds (0.000 MB/sec).
2025-05-09 12:03:25.090 Backup  Database backed up. Database: TestDB1, creation date(time): 2025/04/30(16:05:02), pages dumped: 394061770, first LSN: 80323:19757:39, last LSN: 80323:19774:1, number of dump devices: 1, device information: (FILE=12, TYPE=DISK: {'C:\Program Files\Microsoft SQL Server\MSSQL17.MSSQLSERVER\MSSQL\Backup\SnapshotBack.bkm'}). This is an informational message only. No user action is required.
2025-05-09 12:03:25.080 spid86  Database 'TestDB1' originally suspended for snapshot backup in session 86 successfully resumed in session 86.
2025-05-09 12:03:25.080 spid86  Database 'TestDB1' released suspend locks in session 86.
2025-05-09 12:03:25.080 spid86  I/O was resumed on database TestDB1. No user action is required.
2025-05-09 12:03:25.080 spid86  I/O is frozen on database TestDB1. No user action is required. However, if I/O is not resumed promptly, you could cancel the backup.
2025-05-09 12:03:22.110 spid86  Database 'TestDB1' successfully suspended for snapshot backup in session 86.
2025-05-09 12:03:22.110 spid86  I/O is frozen on database TestDB1. No user action is required. However, if I/O is not resumed promptly, you could cancel the backup.
2025-05-09 12:03:22.070 spid86  Database 'TestDB1' acquired suspend locks in session 86.
2025-05-09 12:03:22.070 spid86  Setting database option suspend_for_snapshot_backup to ON for database 'TestDB1'.

Este es el resultado de las declaraciones impresas que hemos utilizado anteriormente. La copia de seguridad de la copia instantánea se completó correctamente: el sistema se autenticó con FlashArray, suspendió TestDB1 para congelar I/O, creó la copia instantánea (aen-sql-25-a-pg.17), reanudó I/O y terminó con una copia de seguridad solo de metadatos — todo confirmado mediante registros de SQL Server y respuestas de API.

Login Return Code: 0
Login Response: {"response":{"status":{"http":{"code":200,"description":""}},"headers":{"Date":"Fri, 09 May 2025 12:03:22 GMT","Content-Length":"37","Content-Type":"application\/json","Server":"nginx","x-auth-token":"75b2b984-a238-44ce-adbd-ff19decab148","strict-transport-security":"max-age=31536000; includeSubDomains;","content-security-policy":"frame-ancestors 'none'","x-frame-options":"DENY","x-content-type-options":"nosniff","x-xss-protection":"1; mode=block","x-request-id":"bdc6bbff70105c00fdeac8b0a1af565c"}},"result":{"items":[{"username":"anocentino"}]}}

Headers: {"x-auth-token":"75b2b984-a238-44ce-adbd-ff19decab148", "Content-Type":"application/json"}

Database 'TestDB1' acquired suspend locks in session 86.
I/O is frozen on database TestDB1. No user action is required. However, if I/O is not resumed promptly, you could cancel the backup.
Database 'TestDB1' successfully suspended for snapshot backup in session 86.

Snapshot Return Code: 0
Snapshot Response: {"response":{"status":{"http":{"code":200,"description":""}},"headers":{"Date":"Fri, 09 May 2025 12:03:22 GMT","Content-Length":"340","Content-Type":"application\/json","Server":"nginx","x-auth-token":"75b2b984-a238-44ce-adbd-ff19decab148","strict-transport-security":"max-age=31536000; includeSubDomains;","content-security-policy":"frame-ancestors 'none'","x-frame-options":"DENY","x-content-type-options":"nosniff","x-xss-protection":"1; mode=block","x-request-id":"e3089939224baca84d6ad69b485855de"}},"result":{"items":[{"name":"aen-sql-25-a-pg.17","id":"32e86de3-a3ee-3ae0-f74c-4bf5a7f74744","space":null,"source":{"name":"aen-sql-25-a-pg","id":"b6660b61-a8de-ae1b-cb65-e3045d13b5ba"},"suffix":"17","destroyed":false,"created":1746792202183,"pod":{"name":null,"id":null},"time_remaining":null,"eradication_config":{"manual_eradication":"enabled"}}]}}

I/O was resumed on database TestDB1. No user action is required.
Database 'TestDB1' released suspend locks in session 86.
Database 'TestDB1' originally suspended for snapshot backup in session 86 successfully resumed in session 86.
Processed 0 pages for database 'TestDB1', file 'test_data_01' on file 12.
Processed 0 pages for database 'TestDB1', file 'test_data_02' on file 12.
Processed 0 pages for database 'TestDB1', file 'test_data_03' on file 12.
Processed 0 pages for database 'TestDB1', file 'test_data_04' on file 12.
Processed 0 pages for database 'TestDB1', file 'test_data_05' on file 12.
Processed 0 pages for database 'TestDB1', file 'test_data_06' on file 12.
Processed 0 pages for database 'TestDB1', file 'test_data_07' on file 12.
Processed 0 pages for database 'TestDB1', file 'test_data_08' on file 12.
BACKUP DATABASE successfully processed 0 pages in 0.004 seconds (0.000 MB/sec).

Snapshot backup successful. Snapshot Name: aen-sql-25-a-pg.17

Conclusión de las cosas

Este ejemplo destaca el modo en que el sp_invoke_external_rest_endpointnuevoprocedimiento de SQL Server 2025 transforma la automatización de las copias de seguridad. Anteriormente, la integración con los sistemas de almacenamiento requería PowerShell o herramientas externas. Ahora, podemos realizar llamadas a la API REST de manera nativa desde T-SQL, lo que agiliza los flujos de trabajo y reduce las complejidades.

Ventajas clave:

  • Integración REST nativa: Por último, podemos realizar llamadas API directamente desde T-SQL sin pasar a PowerShell u otros lenguajes de scripting.
  • Automatización simplificada: Desarrolle todo su flujo de trabajo de backup en un solo lugar – ya no tendrá que cambiar de contexto entre diferentes herramientas
  • Menores dependencias: Elimine esas capas intermedias entre SQL Server y sus sistemas de almacenamiento – menos piezas móviles significa menos puntos de fallo potenciales
  • Seguridad mejorada: Mantenga su autenticación centralizada en SQL Server en lugar de en archivos de script externos.
  • Mejor rendimiento: La ejecución de las operaciones dentro de SQL Server se traduce en una sobrecarga más baja y unos tiempos de ejecución más rápidos.

Esta función elimina el cambio de contexto y proporciona unas capacidades de automatización modernas en el motor de la base de datos. Solo tiene que asegurarse de almacenar de manera segura los tokens de API e implementar un manejo adecuado de los errores en la producción.

El resultado final es que la integración REST de SQL Server 2025 es un gran éxito para los administradores de bases de datos que gestionan entornos complejos y a gran escala.