В этой статье я покажу, как с помощью T-SQL-скрипта создавать согласованные с приложениями моментальные снимки
на Pure Storage FlashArray прямо из SQL Server, без использования внешних инструментов.
В SQL Server 2025 появилась мощная новая возможность: хранимая процедура
sp_invoke_external_rest_endpoint
. Она значительно облегчает вызов REST API напрямую из T-SQL.
В сочетании с API Pure Storage эта функция позволяет полностью автоматизировать процесс создания снимков без внешних скриптов и инструментов.
Если вы следили за моей серией публикаций Using T-SQL Snapshot Backup, вы знаете, что данная технология особенно полезна в крупных базах данных. Сегодня мы рассмотрим, как реализовать её непосредственно в T-SQL, используя возможность SQL Server обращаться к REST API. PowerShell не потребуется.
Здесь можно скачать весь скрипт.
Включение REST Endpoint в SQL Server 2025
Сначала нужно убедиться, что у нас есть доступ к REST API:
sp_configure 'external rest endpoint enabled', 1;
RECONFIGURE WITH OVERRIDE;
Эта настройка включает поддержку REST-запросов, позволяя SQL Server выполнять исходящие вызовы к REST API. Это критично для интеграции с FlashArray и запуска снимков.
Важно: sp_invoke_external_rest_endpoint
требует HTTPS с TLS,
а сертификат сервера должен быть доверенным для операционной системы, где установлен SQL Server.
Аутентификация во FlashArray
Далее мы установим защищённую сессию с Pure Storage FlashArray.
Для этого SQL Server 2025 использует новую процедуру sp_invoke_external_rest_endpoint
,
позволяющую делать REST-запросы без внешних средств.
Аутентификация во FlashArray выполняется через передачу API-токена на конечную точку.
В ответ FlashArray возвращает x-auth-token
, который используется в качестве ключа для всех последующих запросов.
Такой механизм токенов обеспечивает безопасность, ограниченное время действия и удобный аудит.
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
Обработка ошибок и извлечение токена
Проверим успешность входа. Если код возврата отличается от 0 — выведем ошибку и завершим работу.
При успехе извлекаем x-auth-token
из ответа и используем его для формирования заголовков запросов.
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
Заморозка базы данных для снимка
Следующий шаг — приостановка операций записи. Это делается для согласованности данных перед созданием снимка. Чтение продолжает работать, а запись блокируется до завершения процесса.
ALTER DATABASE [TestDB1] SET SUSPEND_FOR_SNAPSHOT_BACKUP = ON
Создание моментального снимка на FlashArray
Теперь можно вызвать API FlashArray для создания снимка группы защиты.
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
Здесь мы создаём снимок для группы защиты с именем aen-sql-25-a-pg
.
В группу должны входить все тома, где размещены файлы базы данных.
Извлечение имени снимка и создание резервной копии
На этом этапе мы получаем имя снимка из ответа и используем его в описании носителя при создании копии METADATA_ONLY.
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
Проверка журнала ошибок SQL Server
Для подтверждения успешного выполнения операции проверим журнал ошибок SQL Server.
Журнал ошибок SQL Server подтверждает успешное резервное копирование базы данных TestDB1 с использованием снимка метаданных. В журнале указано, что база данных была приостановлена, операции ввода-вывода при записи были заморожены, а моментальный снимок был сделан до безопасного возобновления операций ввода-вывода. Поскольку это резервное копирование только для метаданных, страницы данных не обрабатывались; были захвачены и записаны в указанный .bkm файл только метаданные. Это обеспечивает согласованность моментального снимка с приложением при минимальном влиянии на доступность базы данных.
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'.
Результаты работы скрипта
Вот результат распечатка результатов выполнения операторов, которые мы использовали выше. Резервное копирование снимка прошло успешно: система прошла аутентификацию в FlashArray, приостановила работу TestDB1, чтобы заблокировать ввод-вывод, и создала моментальный снимок (aen-sql-25-a-pg.17), возобновила ввод-вывод и завершила резервное копирование метаданных. Все это подтверждается журналами SQL Server и ответами 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
Заключение
Этот пример показывает, как новая процедура sp_invoke_external_rest_endpoint
упрощает автоматизацию резервного копирования в SQL Server 2025.
Раньше для интеграции с системами хранения требовались PowerShell или внешние инструменты.
Теперь же можно выполнять REST-вызовы прямо из T-SQL.
Ключевые преимущества:
- Встроенная интеграция с REST API — без PowerShell и сторонних языков.
- Упрощённая автоматизация — весь процесс в одном месте.
- Меньше зависимостей — меньше промежуточных слоёв и точек отказа.
- Улучшенная безопасность — хранение токенов в SQL Server, а не во внешних скриптах.
- Лучшая производительность — меньше накладных расходов, выше скорость.
Итог: интеграция REST API в SQL Server 2025 — серьёзный шаг вперёд для администраторов, управляющих крупными и сложными базами данных. Она устраняет необходимость в переключении контекста и предоставляет современные возможности автоматизации в ядре СУБД. Только не забудьте обеспечить безопасное хранение токенов API и реализовать надлежащую обработку ошибок.
Комментариев нет:
Отправить комментарий