sql-server - MSOLEDBSQL 或 MSOLEDBSQL19 连接到 Azure 数据库时出现超时错误 - 工作正常 "from my machine"

标签 sql-server azure networking dns azure-sql-database

我们有一个连接到 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>;

需要考虑的几点:

  • 当我从自己的计算机上运行相同的应用程序以连接到相同的数据库时,它每次都能完美运行。
  • 我们在多个不同的 Azure 数据库上有多个客户端。该客户端是一个相对较小的客户端,有 8 个用户。我们有多达 100 个用户的客户在连接到各自的 Azure 数据库时从未遇到过此问题。
  • 当我们尝试在该客户的 PC 上运行该软件时,有时会连接正常,但几秒钟后,它会失败,仅在短时间内再次连接正常。

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

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

登录超时已过期

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

命名管道提供程序:无法打开与 SQL Server [53] 的连接

因为我们有很多其他客户端在连接到他们的 Azure 数据库时从未遇到过这些问题,而这些数据库与此数据库具有相同的配置,所以我不认为问题出在服务器端,尽管这条消息说明了我在网上找到的内容。

我尝试过的

  • 我在他们的互联网上进行了速度检查,发现其速度下降了 100mbps,而且上升幅度几乎相同。对于这种规模的网站来说应该足够了。
  • 我认为问题与 DNS 相关,因此将一个用户的以太网连接配置为使用 CloudFlare DNS 服务器。问题依然存在
  • 再次在 DNS 领域,我将 Azure 服务器的 IP 地址放入 Hosts 文件中。问题依然存在

所以我被困住了。对我们下一步可以尝试什么有什么建议吗?

让我觉得奇怪的一件事是在内部异常中提到“命名管道提供程序”。我本以为它使用 TCP/IP,但我知道什么?或者这里需要进行某种配置更改吗?

编辑:

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

  • 单击“连接”。如果需要超过一秒钟,我就会取消。再次单击“连接”。
  • 这种情况发生了四五次。
  • 点击“连接”,您难道不知道吗……直接进入。现在到底是怎么回事!?

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

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

但是当我重复相同的命令时,它失败了。真正奇怪的是,它在不同的场合将相同的 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 地址连接失败,则表明您的客户端已阻止(或未列入白名单)有问题的 IP/子网或到该 IP/子网的 TCP 端口 1433 流量。要求您的客户将托管 SQL 数据库的区域的网关 IP/子网列入白名单。网关 IP 地址和子网列在 Gateway IP address section of the documentation 中。 .

关于sql-server - MSOLEDBSQL 或 MSOLEDBSQL19 连接到 Azure 数据库时出现超时错误 - 工作正常 "from my machine",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71689671/

相关文章:

c - 从客户端接受数据时出现段错误

azure - Windows Azure 更新表行键

asp.net - ASP.NET 会捕获 WebRole 类中抛出的异常吗?

sql-server - SQL Server 性能 : Non-clustered Index + INCLUDE columns vs. 聚集索引 - 等效吗?

sql-server - 将 Access 查询中的 Bool 插入 SQL Server 数据库

Azure 网站 CPU 在一天中的随机时间间隔内处于高位

networking - 在两台相邻计算机之间传输文件的最快方法

c - 路由设置 : SIOCADDRT failed: Inappropriate ioctl for device

sql-server - 将多个数据从excel加载到sql SSIS

sql-server - T-SQL 将计算列格式化为时间