SQL 延迟循环等待 Azure 数据库调整大小时出错

SQL Error during Lazy Loop awaiting Azure DB resize

我想在我的 Azure SQL 数据库中自动执行一些数据库缩放。

可以使用以下方法轻松启动:

ALTER DATABASE [myDatabase] 
MODIFY (EDITION ='Standard', SERVICE_OBJECTIVE = 'S3',  MAXSIZE = 250 GB);

但是该命令 return 立即生效,而调整大小需要几十秒才能完成。

我们可以使用以下方法检查当前的实际大小,直到更改 完成后才会更新:

SELECT DATABASEPROPERTYEX('myDatabase', 'ServiceObjective')

所以我很自然地想将它与 WHILE 循环和 WAITFOR DELAY 结合起来,以创建一个将更改数据库大小的存储过程,而不是 return 直到更改已完成。

但是当我编写该存储过程(下面的脚本)和 运行 时,我每次都会收到以下错误(大约在大小更改完成的同时):

A severe error occurred on the current command. The results, if any, should be discarded.

调整大小成功,但我得到错误而不是干净地完成存储过程调用。

我已经测试过的各种东西:


我的解释是,Resize 并不像人们希望的那样 运行sparent,并且在某种意义上说,在 resize 完成之前创建的连接会被破坏。

无论确切原因是什么,在我看来,这个存储过程根本无法实现;我必须从我的外部进程进行轮询——每次都打开新的连接。这不是一个 糟糕 的解决方案,但它 不如将整个事情封装在一个存储过程中那么令人愉快。嗯,生活就是这样。


问题:

在我完全放弃这个 之前 ...是否有人对此错误有替代解释或解决方案,从而允许单个存储过程调用更改大小然后 return 直到 sizeChange 实际完成?


初始存储过程代码(经过简化以消除参数化复杂性):

CREATE PROCEDURE [trusted].[sp_ResizeAzureDbToS3AndWaitForCompletion]
AS
    ALTER DATABASE [myDatabase] 
    MODIFY (EDITION ='Standard', SERVICE_OBJECTIVE = 'S3',  MAXSIZE = 250 GB);

    WHILE ((SELECT DATABASEPROPERTYEX('myDatabase', 'ServiceObjective')) != 'S3')
    BEGIN
        WAITFOR DELAY '00:00:05'
    END

    RETURN 0

Whatever the exact cause, it seems to me that this stored procedure just isn't achievable at all; I'll have to do the polling from my external process - opening new connections each time.

是的,这是正确的。如所述 here 当您更改数据库 objective 的服务时

A new compute instance is created with the requested service tier and compute size... the database remains online during this step, and connections continue to be directed to the database in the original compute instance ... [then] existing connections to the database in the original compute instance are dropped. Any new connections are established to the database in the new compute instance.

粗体文本会终止您的存储过程执行。您需要在外部进行此检查