Назад | Перейти на главную страницу

Обнаружение сбоя масштабирования базы данных SQL Azure с помощью команды async TSQL

У меня есть запланированная задача, которая запускается каждую ночь, чтобы скопировать существующую производственную базу данных SQL Azure в среду разработки. После копирования я масштабирую базу данных вниз (на самом деле я помещаю ее в эластичный пул, чтобы разделить стоимость между несколькими другими базами данных), чтобы снизить затраты, поскольку она больше не находится в производстве и используется только для рабочих нагрузок разработчиков. Это действительно легко сделать с однострочником, используя TSQL:

ALTER DATABASE [newly-copied-db] MODIFY ( SERVICE_OBJECTIVE = ELASTIC_POOL ( name = [my-elastic-pool] ) );

Это асинхронная команда. Возвращается сразу с

Команды успешно выполнены.

На самом деле перемещение db в эластичный пул может занять некоторое время.

Проблема, с которой я столкнулся, заключается в том, что эластичный пул имеет ограниченное количество выделенного пространства. Если операция масштабирования не удалась из-за того, что я использую слишком много места, мне нужно знать. Кроме того, было бы здорово узнать, что задание выполнено успешно, чтобы я мог вызвать какое-нибудь уведомление.

Как я могу узнать, когда операция масштабирования не удалась (или действительно была успешной)?

В идеале через механизм типа события / обратного вызова, а не опрос

Попробуйте что-нибудь подобное на основе dm_operation_status DMV:

while (
    select top 1 state_desc
    from sys.dm_operation_status 
    WHERE resource_type_desc = 'Database'
    AND major_resource_id = @db
    AND operation = 'ALTER DATABASE' 
    order by start_time desc
) in ('PENDING', 'IN_PROGRESS')
begin
    print 'waiting for operation to complete: ' + convert(varchar,getdate(),120);
    waitfor delay '00:00:30';
end

while (
    select top 1 state_desc
    from sys.dm_operation_status 
    WHERE resource_type_desc = 'Database'
    AND major_resource_id = @db
    AND operation = 'ALTER DATABASE' 
    order by start_time desc
) in ('COMPLETE')
begin
    print 'complete!';
end
else
begin
    print 'failed!';
end