MSOLEDBSQL 或 MSOLEDBSQL19 与 Azure 数据库的连接超时错误 - 工作正常 "from my machine"

Timeout errors on MSOLEDBSQL or MSOLEDBSQL19 connection to Azure database - working fine "from my machine"

我们有一个连接到 Azure 数据库的应用程序。当它建立连接时,连接字符串将如下所示:

Provider=MSOLEDBSQL;Server=<servernamehere>.database.windows.net;Database=<databasehere>;Uid=<whateverthisshouldbe>;Pwd=<whateverthatshouldbe>;MARS Connection=True;Application Name=<ourapplicationhere>;

我们最近也开始使用 MSOLEDBSQL19,所以如果安装了它,连接字符串可能是

Provider=MSOLEDBSQL19;Server=<servernamehere>.database.windows.net;Database=<databasehere>;Uid=<whateverthisshouldbe>;Pwd=<whateverthatshouldbe>;MARS Connection=True;Application Name=<ourapplicationhere>;

几点供参考:

这是连接失败时引发的错误:

无效的连接字符串 - 连接字符串没有连接:(见上文)

登录超时已过

建立与 SQL 服务器的连接时发生了与网络相关或特定于实例的错误。服务器未找到或不可访问。检查实例名称是否正确以及 SQL 服务器是否配置为允许远程连接。有关详细信息,请参阅 SQL 服务器在线书籍。

命名管道提供程序:无法打开与 SQL 服务器 [53]

的连接

因为我们有很多其他客户在连接到 他们的 Azure 数据库时从未遇到过这些问题,这些数据库与这个数据库具有相同的配置,我认为问题不在服务器端,不管这条消息是怎么说的以及我在网上找到的是什么。

我试过的

所以我卡住了。关于我们下一步可以尝试什么有什么建议吗?

让我感到奇怪的一件事是在内部异常中提到“Named Pipes Provider”。我本以为它使用 TCP/IP 但我知道什么?还是这里需要某种配置更改?

编辑:

为了排除故障,我在用户的机器上安装了 SSMS,并尝试连接到 tcp:.database.windows.net。这是我的发现:

我还从 Windows 命令提示符 运行 powershell -Command "Test-NetConnection -ComputerName '<servernamehere>.database.windows.net' -Port 1433" 测试数据库网络连接并得到了一个奇怪的结果。第一次成功:

ComputerName     : <servernamehere>.database.windows.net                                                              
RemoteAddress    : NN.NN.NNN.NNN
RemotePort       : 1433
InterfaceAlias   : MyInterface
SourceAddress    : xxx.xxx.xxx.xxx
TcpTestSucceeded : True

但是当我重复同样的命令时,它失败了。真正 st运行ge 是它在不同场合将相同的 ComputerName 解析为不同的 IP 地址:

ComputerName     : <servernamehere>.database.windows.net                                                              
RemoteAddress    : MM.MMM.MMM.M
RemotePort       : 1433
InterfaceAlias   : MyInterface
SourceAddress    : xxx.xxx.xxx.xxx
TcpTestSucceeded : False

它有时解析为一个 IP 地址,有时解析为另一个 IP 地址。一个 IP 地址总是失败,另一个总是成功。

One thing that strikes me as odd is the mention of "Named Pipes Provider" in the inner exception. I would have thought it uses TCP/IP but what do I know? Or is there some kind of configuration change required here?

这是 TCP/IP 连接失败后的预期结果。如果 TCP 连接失败,客户端驱动程序将尝试命名管道。对命名管道的引用与您的问题无关。

What's really strange is that it resolves the SAME ComputerName to DIFFERENT IP addresses on different occasions

来自 Azure 外部的客户端连接连接到 Azure SQL 数据库网关,如 SQL Database Connectivity architecture 中所述。由于网关可能有多个 IP 地址(因地区而异),您可能会为相同的 DNS 名称获得不同的 IP 地址。

一个网关 IP 地址连接成功但另一个失败的症状表明您的客户端已阻止(或未列入白名单)问题 IP/subnet 或到该 IP/subnet 的 TCP 端口 1433 流量。请您的客户将托管您的 SQL 数据库的区域的网关 IP/subnet 列入白名单。网关 IP 地址和子网列在 Gateway IP address section of the documentation.