我有一个广泛的Azure SQL存储过程,定期从Azure数据工厂调用,它正在使用sp_execute_remote
查询同一地区的另一个Azure SQL数据库。在99.5%的情况下,这可以正常工作,但在某些情况下,对sp_execute_remote
的调用永远不会返回。
访问外部资源是通过数据库范围的凭据,使用授予只读权限的本地SQL登录。调用的形式为
insert into ##newrecs exec [sp_execute_remote] @external_server, @stmt, <params>
我已经要求DBA查看一下发生挂起时外部数据库上正在运行什么,但是他说他看不出有什么问题。我们所知道的与失败不一致。
调用进程显示状态为RUNNABLE,命令为EXECUTE。看看sys。Dm_tran_locks显示我的进程对存储的凭据和结果的临时表具有锁。没有其他资源对相同的资源有锁。
如果我捕获@stmt并"手动"启动相同的远程查询,它会正常返回。
有人对
有什么看法吗?- 为什么会发生这种情况
- 如何从主叫端检测/恢复情况
- 如何更深入地进行"远程"诊断Azure数据库(这是一个金融系统的生产环境,所以我不能太乱)。
这实际上是Azure SQL中的一个bug。在支持升级后,微软在2021年12月左右修复了这个问题。