代码之家  ›  专栏  ›  技术社区  ›  Brondahl

等待Azure DB调整大小的延迟循环期间发生SQL错误

  •  0
  • Brondahl  · 技术社区  · 4 年前

    我想在我的Azure SQL数据库中自动化一些数据库扩展。

    这可以通过以下方式轻松启动:

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

    但该命令会立即返回,而调整大小需要10秒才能完成。

    我们可以使用以下方法检查实际的当前大小,在更改之前不会更新 完成:

    SELECT DATABASEPROPERTYEX('myDatabase', 'ServiceObjective')
    

    所以我自然想把它和 WHILE 循环和a WAITFOR DELAY ,以便创建一个将更改DB大小的存储过程,并且在更改完成之前不会返回。

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

    当前命令发生严重错误。如果有结果,应该丢弃。

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

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

    • 如果我将“Initiate”和“WaitLoop”部分分开,并在启动后但在完成之前在单独的连接中启动WaitLoop,那么也会出现相同的错误。
    • 添加a TRY...CATCH 块也没有帮助。
    • 删除存储过程方面,直接运行代码也无法修复它

    我的解释是,Resize并不像人们希望的那样透明,在调整大小完成之前创建的连接在某种意义上会被破坏。

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


    问题:

    在我放弃之前 完全 …是否有人对此错误有其他解释或解决方案,从而允许单个存储过程调用更改大小,然后在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
    
    0 回复  |  直到 4 年前
        1
  •  2
  •   Martin Smith    4 年前

    无论确切的原因是什么,在我看来,这个存储过程 根本无法实现;我必须从我的 外部进程-每次打开新的连接。

    是的,这是正确的。如前所述 here 更改数据库的服务目标时

    使用所请求的服务层创建新的计算实例 计算大小。。。数据库在此步骤中保持在线,以及 连接继续指向原始数据库 计算实例。。。[然后] 与数据库的现有连接 原始计算实例已删除 。任何新连接都是 在新的计算实例中建立数据库。

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